前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >缓存淘汰、缓存穿透、缓存击穿、缓存雪崩、数据库缓存双写一致性

缓存淘汰、缓存穿透、缓存击穿、缓存雪崩、数据库缓存双写一致性

作者头像
Java学习录
发布2019-05-10 14:46:21
1.7K0
发布2019-05-10 14:46:21
举报
文章被收录于专栏:Java学习录

缓存淘汰

为什么需要缓存淘汰?你需要缓存30G的数据,但是Redis本身只能使用10G的内存,那你就得做个取舍了,毕竟鱼与熊掌不可兼得。为了利益最大化肯定要保留最重要的10个G。

Redis本身提供了6中缓存淘汰策略,以下属性表示允许使用的最大内存

代码语言:javascript
复制
server.maxmemory

当使用的内存超过限制内存时,Redis会根据配置的以下6中淘汰策略选择数据淘汰

  • volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已设置过期时间的数据集挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
  • allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
  • allkeys-random:从数据集中任意选择数据淘汰
  • no-enviction:内存不足时添加数据会报错(没人用这个吧?)

其他相关配置:

代码语言:javascript
复制
#指定数据淘汰算法
maxmemory-policy allkeys-lru
#LRU和最小TTL算法的样本个数
maxmemory-samples 5

缓存穿透

大量的请求瞬时涌入系统,而这个数据在Redis中不存在,从而所有的请求都落到了数据库上从而把数据库打死。造成这种情况的原因如下:

  • 系统设计不合理,缓存数据更新不及时
  • 爬虫等恶意攻击

解决方案:

  • 如果key在数据库中也不存在,那么就写一个空值到Redis中,并设置一个过期时间,避免一直占用内存
  • 查询缓存之前使用布隆过滤器拦截

缓存击穿

缓存击穿,就是常说的热点key问题,当一个正有非常巨大的访问量访问的key 在失效的瞬间,大量的请求击穿了缓存,直接落到了数据库上,然后所有从数据获取到数据的线程又都并发的想要把数据缓存到redis中。

解决方案:

  • 使用互斥锁,同一时刻只允许一个线程去构建缓存,其他线程等待构建完毕后去缓存取
  • 定时更新,假如缓存过期时间为60分钟,则单独设置一个线程每59分钟去负责更新缓存

缓存雪崩

由于Redis是基于内存的应用,可以很容易做到高性能、高并发从而起到保护数据库的作用。如果缓存意外挂了、所有的请求落到了数据上就形成了缓存雪崩。

解决方案:

数据库缓存双写一致性

当一个数据需要更新时因为不可能做到同时更新数据库和缓存、那么此时读取数据的时候就一定会发生数据不一致问题,而数据不一致问题在金融交易领域的系统中是肯定不允许的。

解决方案:

  • 读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应。
  • 更新的时候,先更新数据库,然后再删除缓存。

参考自公众号:石杉的架构笔记

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 缓存淘汰
  • 缓存穿透
  • 缓存击穿
  • 缓存雪崩
  • 数据库缓存双写一致性
相关产品与服务
云数据库 Redis®
腾讯云数据库 Redis®(TencentDB for Redis®)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档