缓存

作者:加菲猫 2019-02-19 59 0

Redis 的数据类型

String:键值对,value 可以是字符串或数字。(value 最大 512 M)
Hash:键值对集合,value 是 HashMap。
List:String 类型的有序集合,底层是双向链表,支持反向查找和遍历。
set:String 类型的无序集合,底层是 value 永远为空的 HashMap。
ZSet:在 set 的基础上,每个元素关联一个 double 类型的分数,用来排序。

缓存雪崩

原因:

  • Redis 挂了,请求将全部发送到数据库上。
  • 所有缓存数据都设置了相同的过期时间,同时失效,请求将全部发送到数据库上。

解决方法:

  • 设置缓存的过期时间时加一个随机值,避免所有缓存在同一时间失效。
  • 事发前:实现 Redis 的高可用(主从 + Redis Cluster),尽量避免挂掉。
  • 事发中:设置本地缓存和限流,确保数据库能正常工作。
  • 事发后:利用 Redis 持久化,从磁盘上自动恢复缓存数据。

缓存穿透

原因:

  • 频繁的请求不存在的缓存,请求将全部发送到数据库上。

解决方法:

  • 如果请求的缓存不存在,且数据库中也不存在时,可以将这个空对象设置到缓存中,下次在请求就可以从缓存里获取了。(给空对象设置一个较短的时间)
  • 用过滤器拦截不合法的参数。

读操作

缓存中有:直接返回。
缓存中没有:查询数据库,将结果写入缓存,返回。

写操作

先删除缓存,再操作数据库。(不适合高并发场景,第二步失败无影响)
先操作数据库,再删除缓存。(适用于高并发场景,第二步失败有影响)

发表评论

下一篇: 上一篇: