Redis学习笔记整理

来源:互联网 发布:java继承实现接口用 编辑:程序博客网 时间:2024/05/17 19:20

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.html

http://www.redis.cn/topics/persistence.html

http://www.cnblogs.com/0201zcr/p/5942748.html







原创粉丝点击