参考资料:

http://www.dengshenyu.com/%E5%90%8E%E7%AB%AF%E6%8A%80%E6%9C%AF/2016/01/09/redis-reactor-pattern.html
http://www.redis.cn/topics/data-types.html
http://www.syyong.com/db/Redis-why-the-use-of-single-process-and-single-threaded-way-so-fast.html
https://toutiao.io/posts/546542/app_preview
http://ifeve.com/redis-persistence/

0. 环境

Redis server: 3.0.3

1. 数据类型

  • 字符串(Strings)

字符串是一种最基本的Redis值类型。Redis字符串是二进制安全的,这意味着一个Redis字符串能包含任意类型的数据。一个字符串类型的值最多能存储512M字节的内容。

  • 列表(Lists)

Redis列表是简单的字符串列表,按照插入顺序排序。

  • 集合(Sets)

Redis集合是一个无序的字符串合集。添加、删除以及测试元素是否存在操作的时间复杂度为O(1)。

  • 哈希(Hashes)

Redis Hashes是字符串字段和字符串值之间的映射,所以它们是完美的表示对象的数据类型。

  • 有序集合(Sorted sets)

Redis有序集合和Redis集合类似,是不包含相同字符串的合集。但每个有序集合的成员都关联着一个评分,这个评分用于把有序集合中的成员按最低分到最高分排列。

  • Bitmaps 和 HyperLogLogs

Redis同样支持Bitmaps和HyperLogLogs数据类型,实际上是基于字符串的基本类型的数据类型,但有自己的语义。

2. Redis为什么速度快?

  • 完全基于内存
  • 单线程:CPU无需在多个线程之间来回切换
  • I/O多路复用技术:异步非阻塞IO,既不会因为线程过多导致CPU频繁切换,又能充分利用服务器资源

3. Redis超时可能的原因及应对方法?

  • 慢查询:确认是否使用慢查询,可以使用slowlog get num(例如slowlog get 10)查看相应的慢命令
  • 内存不足:由于Redis完全基于内存,故内存使用率指标需要关注
  • 连接客户端数量过多:连接客户端数量超过默认值容易导致超时
  • 若redis主机为虚拟机,可能会有内存延迟:./redis-cli --intrinsic-latency 100这个命令可以在server端判断redis是否有延迟,在客户端通过-h -p 参数可以对比是否为网络导致的延迟
  • 大量的删除、过期以及淘汰(由maxmemory-policy控制的)的大对象操作,需要释放相应的RAM,可能会造成redis阻塞,进而造成相应的延迟:若经常有比较大的对象进行删除、过期和淘汰,建议将这些对象分割成一些小对象。
  • 持久化可能导致延迟,若数据集大的话,Redis启动持久化子进程很耗时,其间Redis可能短暂停止服务客户端:选择更合理的持久化方案,例如AOF + fsync every second

4. Redis持久化及其优缺点

  • RDB持久化:可以在指定的时间间隔内生成数据集的时间点快照
  • AOF持久化:记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集
  优点 缺点
RDB
  1. RDB是一种表示某个即时点的Redis数据的紧凑文件。RDB文件适合用于备份。
  2. RDB非常适合于灾难恢复,作为一个紧凑的单一文件,可以被传输到远程的数据中心。
  3. RDB最大化了Redis的性能,因为Redis父进程持久化时唯一需要做的是启动(fork)一个子进程,由子进程完成所有剩余工作。父进程实例不需要执行像磁盘IO这样的操作。
  4. RDB在重启保存了大数据集的实例时比AOF要快。
  1. 当你需要在Redis停止工作(例如停电)时最小化数据丢失,RDB可能不太好。你可以配置不同的保存点(save point)来保存RDB文件(例如,至少5分钟和对数据集100次写之后,但是你可以有多个保存点)。然而,你通常每隔5分钟或更久创建一个RDB快照,所以一旦Redis因为任何原因没有正确关闭而停止工作,你就得做好最近几分钟数据丢失的准备了。
  2. RDB需要经常调用fork()子进程来持久化到磁盘。如果数据集很大的话,fork()比较耗时,结果就是,当数据集非常大并且CPU性能不够强大的话,Redis会停止服务客户端几毫秒甚至一秒。AOF也需要fork(),但是你可以调整多久频率重写日志而不会有损(trade-off)持久性(durability)。
AOF
  1. 使用AOF Redis会更具有可持久性(durable):你可以有很多不同的fsync策略:没有fsync,每秒fsync,每次请求时fsync。使用默认的每秒fsync策略,写性能也仍然很不错(fsync是由后台线程完成的,主线程继续努力地执行写请求),即便你也就仅仅只损失一秒钟的写数据。
  2. AOF日志是一个追加文件,所以不需要定位,在断电时也没有损坏问题。即使由于某种原因文件末尾是一个写到一半的命令(磁盘满或者其他原因),redis-check-aof工具也可以很轻易的修复。
  3. 当AOF文件变得很大时,Redis会自动在后台进行重写。重写是绝对安全的,因为Redis继续往旧的文件中追加,使用创建当前数据集所需的最小操作集合来创建一个全新的文件,一旦第二个文件创建完毕,Redis就会切换这两个文件,并开始往新文件追加。
  4. AOF文件里面包含一个接一个的操作,以易于理解和解析的格式存储。你也可以轻易的导出一个AOF文件。例如,即使你不小心错误地使用FLUSHALL命令清空一切,如果此时并没有执行重写,你仍然可以保存你的数据集,你只要停止服务器,删除最后一条命令,然后重启Redis就可以。
  1. 对同样的数据集,AOF文件通常要大于等价的RDB文件。
  2. AOF可能比RDB慢,这取决于准确的fsync策略。通常fsync设置为每秒一次的话性能仍然很高,如果关闭fsync,即使在很高的负载下也和RDB一样的快。不过,即使在很大的写负载情况下,RDB还是能提供能好的最大延迟保证。
  3. 在过去,我们经历了一些针对特殊命令(例如,像BRPOPLPUSH这样的阻塞命令)的罕见bug,导致在数据加载时无法恢复到保存时的样子。

5. Redis与Memcached的区别

  • 实现机制不同:Redis单进程单线程,Memcached单进程多线程
  • 持久化策略不同:Redis支持持久化,Memcached必须借助外部工具才能实现持久化
  • Redis功能比Memcached更强大,Redis不仅仅是内存数据库(例如可利用Pub/Sub实现发布订阅的消息中间件),而Memcached仅仅是内存数据库

Redis学习记录的更多相关文章

  1. redis 学习记录

    http://www.yiibai.com/redis/redis_quick_guide.html Redis 是一款依据BSD开源协议发行的高性能Key-Value存储系统(cache and s ...

  2. Redis学习记录(一)

    在学习Redis之前,要知道什么是NoSQL? 1.NoSQL 1.1. 什么是NoSQL NoSQL(NoSQL = Not Only SQL),表示“不仅仅是SQL”,泛指非关系型数据库. 1.2 ...

  3. Redis学习记录之Java中的初步使用

    1.关于Redis redis下载地址:<span style="font-family: Arial, Helvetica, sans-serif;">http:// ...

  4. Redis学习记录之————微博项目

    Key设计 全局相关的key: 表名 global 列名 操作 备注 Global:userid incr 产生全局的userid Global:postid Incr 产生全局的postid 用户相 ...

  5. Redis学习记录(三)

    1.Redis集群的搭建 1.1redis-cluster架构图 架构细节: (1)所有的redis节点批次互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽. (2)节点的fail ...

  6. Redis学习记录(二)

    1.Key命令 设置key的过期时间. expire key second:设置key的过期时间 ttl key:查看key的有效期(如果显示正数说明该key正在倒计时,如果是-1说明该key永久保存 ...

  7. Redis学习记录及Jedis代码示例

    文章目录 二.Redis简介 三.Redis安装 1. 下载并解压安装 2. 安装C语言编译环境 3. 修改安装位置 4. 编译安装 5.启动Redis服务器 ①默认启动 ②定制配置项启动 [1]准备 ...

  8. redis学习记录1 特性与优点

    1.存储结构:字符串.散列.列表.集合.有序集合. redis存储结构的优势:数据在redis中的储存方式和其在程序中的储存方式相近:redis对不同数据类型提供非常方便的操作方式,如使用集合类型储存 ...

  9. Redis——学习之路四(初识主从配置)

    首先我们配置一台master服务器,两台slave服务器.master服务器配置就是默认配置 端口为6379,添加就一个密码CeshiPassword,然后启动master服务器. 两台slave服务 ...

随机推荐

  1. 应对ADT(Eclipse)的No more handles解决办法

    应对ADT(Eclipse)的No more handles解决方法 ADT(Eclipse)最近几天经常出现如下错误对话框:org.eclipse.swt.SWTError: No more han ...

  2. 选课(codevs 1378)

    题目描述 Description 学校实行学分制.每门的必修课都有固定的学分,同时还必须获得相应的选修课程学分.学校开设了N(N<300)门的选修课程,每个学生可选课程的数量M是给定的.学生选修 ...

  3. hdu1875kruskal简单应用。

    标记是dificulty 2,水,开始kruskal时练手题,只需开始时数据处理下,不符合要求的边不要,要理解并查集和Kruskal,就简单了,判断下是否联通图,(只需在记加入有效边时候统计连通分支数 ...

  4. Visual Studio 2017 RC的坑

    ASP.NET Core Project add Docker Project Support的问题 执行上面操作以后,如果本机没有装好docker,就会一直报错,无法build通过,无论你在Proj ...

  5. BCD工具类(8421)

    目录 1.BCD介绍 (1)BCD码(Binary-Coded Decimal)亦称二进码十进数.用4位二进制数来表示1位十进制数中的0~9这10个数码.用二进制编码的十进制代码. (2)BCD码可分 ...

  6. Android 学习路线图(转载自https://blog.csdn.net/lixuce1234/article/details/77947405)

    程序设计 一.java (a)基本语法(如继承.异常.引用.泛型等) Java核心技术 卷I(适合入门) 进阶 Effective Java中文版(如何写好的Java代码) Java解惑 (介绍烂Ja ...

  7. maven 将项目打成jar包

    添加此plugin到项目的pom.xml <project xmlns=</modelVersion>     <groupId>fuck</groupId> ...

  8. google --SwitchyOmega and switchysharp ***

    https://github.com/FelisCatus https://chrome.google.com/webstore/search/Proxy%20SwitchySharp%20?hl=z ...

  9. 查看MySQL系统变量的命令

    用了好长时间mysql,却没有用心记住一些有用的东西,加油! mysql> SHOW VARIABLES; +---------------------------------+-------- ...

  10. MySQL5.6 怎样优化慢查询的SQL语句 -- 慢日志介绍

    近期有个开发团队抱怨我们平台包括的mysql cluster不行,总是报mysql的"heartbeat Error".分析了他们收集的日志.没有发现mysql cluster节点 ...