Redis笔记整理
一、 Redis特性
二、 Redis应用场景
三、Redis运维与优化
一、 Redis特性
1、 Redis是一个开源的、高性能的key-value数据库。它运行在内存中但是可持久化到磁盘。
2、 Redis的优点:
l 读写速度快,性能极高。(基于内存的操作,单线程免去了线程间的上下文切换)read 11w/s,write 8w/s。
l 原子性,所有的操作都是原子的。
l 支持多种数据类型:String、list、set、sort set、hash、hyperloglogs、Geo。
l 支持transaction(事务内的每条指令都会执行,不管中途是否报错,没有回滚机制)、pub/sub、lua script、key过期等特性
l Redis sentinel提供高可用支持 master/slave,cluster的failover
l 支持数据持久化
二、 Redis应用场景
1、 缓存
2、 MQ
使用list数据结构,LPush添加数据到队尾,LPop从队头取出数据
3、 排名
使用sort set 数据结构,通过zadd给每个key添加设置一个score,获取排名时使用zrang获取前10名的数据
4、 分布式锁
使用string数据结构,setnx命令只有当key不存在时添加key。大概流程如图:
1) setnx(lockname,expiretime)获取锁
2) 成功结束,失败继续
3) get(lockname)得到expiretime,判断expiretime是否过期,
4) 没过期结束,过期继续
5) getset(lockname,expiretime1),获取锁并重新设置过期时间,判断returnvalue
6) returnvalue!= expiretime获取锁失败可重试。returnvalue== expiretime获取锁成功。
5、 分页优化
当分页数据量大时,如分页数超过几百页,可通过list数据结构缓存最新的N条记录,通过LPush插入数据,通过Ltrim来保持list链表的长度。
6、 共同好友,可能的好友
通过set数据结构进行实现,通过sdiff来判断A,B集合之间的差集,返回集合A中所有与B集合不同的元素。通过sinter来获取A,B两个集合的交集。
7、 实现类bitmap算法
通过hyperLogLog数据结构来实现,PFADD对数据集进行插入操作,如果数据集有变化,返回1,无变化返回0。
三、 Redis运维
1、 主从复制
1) config配置实现
slaveof <masterIP> <port>
master存在密码:masterauth <password>
2) 积压空间的概念:
专门用来保存数据修改的命令的缓存空间。当有一个写数据的请求进入时会将相应的命令保存在该空间中,用于与slave服务器进行同步。不直接发送给slave而采用该空间是为了适应主从断开重连的场景。
3) 同步流程
slave首次连接到master,发起一个部分同步的请求(PSYNC 命令:master_runid 上次连接的主机身份 和offset积压空间的偏移量),master接受到请求进行数据验证,看是否满足部分同步的情况,不满足返回全量同步,主机返回+FULLRESYNC master_runid offset(从机接收并记录 master_runid 和 offset,并准备接收RDB 文件)接着启动 BGSAVE 生成 RDB 文件,BGSAVE 结束后,向从机传输,首先向从机传送rdb文件,从机接受到rdb文件保存到磁盘,然后加载到内存中。接着master发送积压空间中的数据给slave。 从而完成全量同步。
之后的数据同步都是由master有数据写操作就直接推送给slave。
2、 数据淘汰机制
当实例的内存达到设置的最大内存时,进行数据的淘汰机制:
l volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
l volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
l volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
l allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
l allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
l no-enviction(驱逐):禁止驱逐数据 ,超过最大值请求直接返回错误
由此可知,Redis并不保证所有key在过期后才回被回收。
Redis执行命令时都会检测使用的内存是否超额,超额后 mem_tofree = mem_used - server.maxmemory 计算出要释放的内存。然后根据数据淘汰机制进行释放空间,同时将这个数据变更消息发布到本地(AOF 持久化)和从机(主从连接)。
3、 持久化策略
持久化策略包括 RDB和AOF两种方式。AOF 持久化和 RDB 持久化的最主要区别在于,前者记录了数据的变更,而后者是保存了数据本身。
可以同时开启两种持续方式,在这种情况下,当Redis进行重启时,会优先载入AOF文件进行恢复,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整。
如果想把正在运行的redis数据库,从RDB切换到AOF,建议先使用动态切换方式,再修改配置文件,重启数据库。(不能直接修改配置文件,重启数据库,否则数据库中数据就为空了。)
1) RDB策略:
将内存快照dump到磁盘进行备份保存,由conf文件进行设置,触发条件“ N 秒内数据集至少有 M 个改动”。备份时主进程fork出一个子进程进行bgsave操作,备份完成后会将新的RDB文件替换旧的RDB文件,并删除旧RDB文件。
使用Copy-on-write方法进行备份,在备份过程中可能会消耗大量的主机内存。当同一主机上有多个实例时,避免同时进行RDB操作。
优点:
l 文件保存紧凑,保存某个时间点的所有数据,便于备份,并且便于传输。
l 恢复大的数据集时,RDB的方式会更快些。
缺点:
l 因为是每隔一段时间进行一次备份,万一在Redis意外宕机,你可能会丢失几分钟的数据。
l RDB时要经常fork子进程来保存数据,当数据集较大时,fork的过程会比较耗时,这时可能会导致主进程无法响应客户端的请求
2) AOF策略:
记录每次对服务器写的操作保存到AOF文件末尾(fsync),fsync也是通过fork一个子进程来完成的。当AOF文件过大时,Redis会对AOF文件进行重写(bgrewrite)。由conf文件进行设置,默认每秒进行一次fsync。初次打开AOF时,会进行AOF文件初始化,将现有的数据集都AOF进AOF文件中。
优点:
l 根据使用不同的fsync策略,可以保证丢失的数据最少。默认情况下丢失1秒数据
l AOF只是一个追加文件的操作,当某些原因未执行完整写入命令时,可使用redis-check-aof工具修复。
l AOF文件易读,便于人工修改
缺点:
l 相同数据量,AOF文件比RDB文件更大。
l 当数据量大时,Redis重启所用时间比RDB长。
相关参考:
http://wiki.jikexueyuan.com/project/redis/master-slave-replication.htmlhttp://www.redis.cn/topics/persistence.html http://www.cnblogs.com/0201zcr/p/5942748.html