为什么用redis
内存数据库,快;高并发下能有效降低数据库的压力。
但是这里是牺牲了数据强一致性
CAP理论
CAP理论,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。
CAP理论作为分布式系统的基础理论,它描述的是一个分布式系统在以下三个特性中:
- 一致性(Consistency)
- 可用性(Availability)
- 分区容错性(Partition tolerance)
分布式系统无法同时满足CAP,要么满足CA,要么CP,要么AP。
缓存和数据库之间一直性的方案
Cache Aside 策略(旁路缓存策略)
读策略
- 从缓存读取数据
- 命中返回
- 没命中从数据库加载数据,并存缓存返回
写策略 - 先写库
- 删缓存
为什么不先删除缓存?因为写库可能没有完成,删掉的缓存重新加载还是脏数据
Cache Aside 策略不保证数据一致性的,但是可以大大减少不一致性的数据。
延时双删
- 删缓存
- 更新数据库
- 休眠
- 再删缓存
休眠是为了更新库留的时间,可根据业务耗时合理设置。
为什么再删是为了防止写入的时候又脏数据加载到缓存了。
删除重试
主要解决问题时上面的删除缓存的时候出错的情况下脏数据还在,原理是在删除缓存失败的时候引入队列,进行异步删除。
碰到的一个问题
我的数据库被黑掉了, 但redis里面保存了些登录的数据;
这个时候我又初始化了个库,初始化的库用户肯定时没有的,这个时候我用之前的用户竟然发现也能登录进去。
看了下代码发现我登录的时候先查了登录信息的缓存。
思路
- 服务端启动把缓存的登录用户信息删了?
单服务端可以,但是如果是集群就有问题了。 - 登录的时候删key
那和裸db基本一致了 - 设置过期时间了
发现是可行的,如果用户不存在到期后就获取不到用户信息,虽然能登录但是发不了信息,如果发不了信息可以发送个强制退出的命令。
登录流程大概如下
网络异常,图片无法展示
|