Java学习笔记之Redis篇

缓存中间件

同为缓存中间件,Memcache和Redis的区别:

Memcache:代码层次类似Hash
支持简单数据类型、不支持数据持久化存储、不支持主从、不支持分片

Redis:数据类型丰富、支持数据磁盘持久化存储、支持主从、支持分片

多路I/O复用模型及Redis常见问题

Redis采用的I/O多路复用函数:epoll/kqueue/evport/select的其中一种。

下图为select系统调用,作用是监控多个文件的可读可写情况:
Java学习笔记之Redis篇_第1张图片

Redis选择多路复用函数的条件

  • 具体情况具体分析;
  • 优先选择时间复杂度为O(1)的多路复用函数作为底层实现;
  • 采用时间复杂度为O(n)的select作为保底;
  • 基于react设计模式监听I/O事件。

Redis的基本数据类型:string、hash、list、set、sorted set、hyperloglog(计数)、geo
(存储地理位置信息)

问题:如何从许多key中找出一类固定前缀的key?

:keys ***指令(隐患:keys返回的是所有匹配的key,数量过多时会造成服务卡顿);
scan cursor match *** count ***指令(

  1. 基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程;
  2. 以0作为游标开始一次新的迭代,直到命令返回游标0完成一次遍历;
  3. 不保证每次执行都返回某个给定数量的元素,支持模糊查询;
  4. 一次返回的数量不可控,只能是大概率符合count参数。

问题:如何解决SETNX长期有效?

:EXPIRE key seconds:设置key的生存时间,当key过期时(生存时间为0),会被自动删除;缺点:原子性得不到满足。

问题:如何通过Redis实现分布式锁?

:set key value [EX ***] [PX ***] [NX|XX]
EX second:设置键的过期时间为second秒
PX millisecond:设置键的过期时间为millisecond秒
NX:键不存在时,才对键进行设置操作
XX:键存在时,才对键进行设置操作

问题:大量的key同时过期会发生什么?

:集中过期,由于清除大量的key耗费时间,服务会出现短暂卡顿。(设置key的过期时间时加入随机数可解决问题)

问题:如何使用Redis做异步队列?

:使用list作为队列:

  1. rpush生产消息,lpop消费消息(缺点是没有等到队列中有值就直接消费;可利用应用层的sleep机制去调用lpop重试)
  2. blpop key timout:阻塞直到队列有消息或超时(缺点是只能有一个消费者消费)

使用pub/sub主题订阅模式:

发送者发送(publish)消息,订阅者订阅(subscribe)消息;订阅者可以订阅任意数量的频道。(缺点是消息的发布是无状态的,无法保证可达,订阅者关闭再上线后所订阅的会被清除无法接收消息)

Redis持久化

RDB(快照)持久化:保存某个时间点的全量数据快照

  • save:阻塞Redis的服务器进程,直到RDB文件被创建完毕
  • bgsave:fork一个子进程来创建RDB文件,不阻塞服务器进程

缺点

  • 内存数据的全量同步,数据量大时不可避免地出现大量I/O严重影响性能;
  • 如果Redis突然挂掉则最近一次快照间的数据会丢失。

自动触发RDB持久化的条件:

  • 根据redis.conf配置里的save m n定时触发;(机制是bgsave)
  • 主从复制时,主节点自动触发;
  • 执行Debug Reload;
  • 执行Shutdown且没有开启AOF持久化。

AOF(append only file)持久化:保持写状态

  • 记录下除了查询以外的所有变更数据库状态的指令;
  • 以append的形式追加保存到AOF文件中(增量)

RDB和AOF的优缺点

  • RDB优点:全量数据快照,文件小,恢复快;
  • RDB缺点:无法保存最近一次快照之后的数据;
  • AOF优点:可读性高,适合保存增量数据,数据不易丢失;
  • AOF缺点:文件体积大,恢复时间长。

pipeline的好处:

  1. pipeline和Linux的管道机制类似;
  2. Redis基于请求/响应模型,单个请求处理需要一一应答;
  3. pipeline批量执行指令,节省多次IO往返的时间;
  4. 有顺序依赖的指令建议分批发送。

Redis的同步机制

全同步过程

  1. slave发送sync命令到master;
  2. master启动一个后台进程,将Redis中的数据快照保存到文件中;
  3. master将保存数据快照期间接收的写命令缓存起来;
  4. master完成写文件操作后,将该文件发送给slave;
  5. 使用新的RDB文件替换掉旧的RDB文件;
  6. master将这期间收集的增量写命令发送给slave端。

增量同步过程

  1. master接收到用户的操作指令,判断是否需要传播到slave;
  2. 将操作记录追加到aof文件;
  3. 将操作传播到其他slave:对齐主从库;往响应缓存写入指令;
  4. 将缓存中的数据发送给slave

Redis sentinel的作用:

  • 监控:检查主从服务器是否运行正常;
  • 提醒:通过API向管理员或者其他应用程序发送故障通知;
  • 自动故障迁移:主从切换。

你可能感兴趣的:(Java笔记)