集群
不能保障数据的强一致性、异步复制
哨兵
- 监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
- 提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
- 自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会进行选举,将其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
缓存击穿
- 使用redis的悲观锁setnx(添加过期时间)进行处理
- zookeeper解决
缓存雪崩
- 设置过期时间加一个随机数
缓存穿透
- 使用布隆过滤器,对数据库没有的数据直接返回0
Mysql和Redis数据不一致问题
数据不一致问题无法完全避免,除非使用悲观锁进行序列化,但这样只会让吞吐量降低。因为我们在做数据修改时,为了做到不让用户读到脏数据,所以我们都是常规的先删除缓存,后修改数据库的方案,但此方案存在问题。
- A线程删除缓存
- B线程读取缓存为null,读取数据库,并添加到缓存中
- A线程修改DB数据完成
- B线程用户此时读取到的数据就是脏数据
处理方案:延时双删
- redis.del(key)
- db.update()
- thread.sleep(‘系统从db读取一次数据并添加到缓存的大概时间’)
- redis.del(key)
这样处理后,能最大程度的尽量避免数据不一致问题
网友评论