redis知识点
- redis持久化
- redis 订阅发布模式
- redis主从复制
- 哨兵模式
- redis雪崩,穿透
- 缓存击穿(请求太多,缓存过期)
- 缓存雪崩
redis持久化
redis是内存数据库,持久化有两种方式,一种是RDB(redis database),一种是AOF(append only file)。
rdb的持久化方式是定期将redis内存内容写入rdb临时文件,(fork子进程,通过子进程来写文件,主进程接着执行redis业务),写入完成后替换以前的快照文件。保存的文件一般是dump.rdb。恢复是重启redis时,数据被自动恢复。
aof的持久化是通过对执行的每条命令,存取日志文件,将redis执行过程中的每条命令记录下来。恢复时读取该文件将每条redis命令重新执行,以达成数据的恢复。
aof持久化的效率比rdb的效率低,文件也比rdb大,修复速度也比较慢。但是因为是每条命令都记录,实时性比较好,基本不会丢命令。
如果同时开启两种持久化方式,则优先使用aof方式恢复
redis 订阅发布模式
一个redis cli订阅某个频道,通过SUBSCRIBE 命令 如下:
redis 127.0.0.1:6379> SUBSCRIBE redisChat
Reading messages… (press Ctrl-C to quit)
- “subscribe”
- “redisChat”
- (integer) 1
其他redis cli往此频道发消息,如下:
redis 127.0.0.1:6379> PUBLISH redisChat “Redis is a great caching technique”
(integer) 1
redis 127.0.0.1:6379> PUBLISH redisChat “Learn redis by mszlu.com”
(integer) 1
订阅者的客户端会显示如下消息
- “message”
- “redisChat”
- “Redis is a great caching technique”
- “message”
- “redisChat”
- “Learn redis by mszlu.com”
可以实现简单的消息同步
redis主从复制
将一台redis的数据,复制到另一台redis,前者称为主节点,后者称为备节点
作用:
- 数据冗余,是持久化之外的一种数据冗余方式
- 故障恢复,主节点出问题,由从节点提供服务,实现快速故障恢复
- 负载均衡,主节点负责写,从节点负责读,读比较多时候,可以让多个从节点负载读操作
- 是哨兵模式和集群能够实施的基础
复制有全量同步和增量同步,全量同步是在从redis连接主redis时触发
哨兵模式
哨兵是一个独立的进程,此进程通过向redis实例发消息,看有没有响应来判断redis是否故障,哨兵检测到master挂了,首先会选一个slave节点,将他变为主节点,然后通过发布订阅模式通知从节点重新选主
多哨兵模式
多个哨兵互相监控,如果多个哨兵都发现主节点故障,才会选出一个哨兵进行failover
redis雪崩,穿透
缓存穿透,redis中都没有数据,程序都去sql中查,造成sql压力
解决方法1 布隆过滤器 对查询的请求规则,做一次过滤(过滤基准是对所有可能的查询参数先以hash方式存储),布隆过滤器,不符合要求的请求直接扔掉。
解决方法2 缓存空值
缓存击穿(请求太多,缓存过期)
缓存击穿,是指一个 key 非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个 key 在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。
解决方案1,设置热点数据永不过期
解决方案2,加互斥锁,将高并发的压力转移到分布式锁上
缓存雪崩
缓存雪崩,是指在某一个时间段,缓存集中过期失效。
产生雪崩的原因之一,比如马上就要双十二零点,,很快就会有一波抢购,这波商品时间比较集中的放在了缓存,假设缓存一个小时。那么到了凌晨一点钟的时候,这批商品的缓存就都会过期了。而对这批商品的访问查询,都落到数据库上,对于数据库而言,就会产生周期性的压力波峰。于是所有的请求都会到达存储层,存储层的调用量会暴增,造成存储层也回掉的情况。