Redis数据一致性实践

510 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情

为什么用redis

内存数据库,快;高并发下能有效降低数据库的压力。

但是这里是牺牲了数据强一致性

CAP理论

CAP理论,指的是在一个分布式系统中, Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。

CAP理论作为分布式系统的基础理论,它描述的是一个分布式系统在以下三个特性中:

  • 一致性(Consistency)
  • 可用性(Availability)
  • 分区容错性(Partition tolerance)

分布式系统无法同时满足CAP,要么满足CA,要么CP,要么AP。

缓存和数据库之间一直性的方案

Cache Aside 策略(旁路缓存策略)

读策略

  • 从缓存读取数据

  • 命中返回

  • 没命中从数据库加载数据,并存缓存返回

    写策略

  • 先写库

  • 删缓存

为什么不先删除缓存?因为写库可能没有完成,删掉的缓存重新加载还是脏数据

Cache Aside 策略不保证数据一致性的,但是可以大大减少不一致性的数据。

延时双删

  • 删缓存
  • 更新数据库
  • 休眠
  • 再删缓存

休眠是为了更新库留的时间,可根据业务耗时合理设置。

为什么再删是为了防止写入的时候又脏数据加载到缓存了。

删除重试

主要解决问题时上面的删除缓存的时候出错的情况下脏数据还在,原理是在删除缓存失败的时候引入队列,进行异步删除。

碰到的一个问题

我的数据库被黑掉了, 但redis里面保存了些登录的数据;

这个时候我又初始化了个库,初始化的库用户肯定时没有的,这个时候我用之前的用户竟然发现也能登录进去。

看了下代码发现我登录的时候先查了登录信息的缓存。

思路

  1. 服务端启动把缓存的登录用户信息删了?

    单服务端可以,但是如果是集群就有问题了。

  2. 登录的时候删key

    那和裸db基本一致了

  3. 设置过期时间了

    发现是可行的,如果用户不存在到期后就获取不到用户信息,虽然能登录但是发不了信息,如果发不了信息可以发送个强制退出的命令。

登录流程大概如下

image.png