当前位置: 首页 > news >正文

redis过期删除、内存淘汰、双写一致性---java

过期删除

Redis 的缓存失效不会立即删除,Redis 的过期删除策略是选择「惰性删除+定期删除」这两种策略配和使用。

  • 惰性删除策略的做法是,不主动删除过期键,每次从数据库访问 key 时,都检测 key 是否过期,如果过期则删除该 key
    定期删除策略的做法是,每隔一段时间「随机」从数据库中取出一定数量的 key 进行检查,并删除其中的过期key

内存淘汰

Redis 提供了 8 种不同的数据淘汰策略,默认是 noeviction 不删除任何数据,内存不足直接报错

针对「进行数据淘汰」这一类策略,又可以细分为「在设置了过期时间的数据中进行淘汰」和「在所有数据范围内进行淘汰」这两类策略。

重要概念:

  • LRU:最少最近使用。用当前时间减去最后一次访问时间,这个值越大则淘汰优先级越高。

  • LFU:最少频率使用。会统计每个 key 的访问频率,值越小淘汰优先级越高。

平时开发过程中用的比较多的就是 allkeys-lru(结合自己的业务场景):淘汰整个键值中最少使用的键值。

双写一致性

在 基于redis实现商店信息缓存,缓存穿透,雪崩,击穿 中提到数据库和缓存一致性问题,当时选择了先操作数据库,在删除缓存。但其实更常用的是 延时双删策略:先删除缓存,再更新数据库,过一会再删除缓存

  • 第一次删除缓存:是为了立即清除旧缓存,尽量减少并发线程读到旧数据的可能性
  • 第二次延时删除:如果没有延时,缓存可能被旧数据重新写入。延时后,第二次删除能清理掉这种“脏数据”

延时双删是一种弱一致性的策略,依旧可能发生不一致,因为延时时间没法完美确定,强一致性的策略只能是加锁了,可以使用 redission锁,更进一步的就是 redission读写锁,符合 redis 读多写少的特点

如果不是一定强一致性的业务,可以采用异步通知的策略

  • 方式 1(MQ):当数据库更新后,通过消息队列通知删除缓存。
  • 方式 2(Canal):通过监听 MySQL 的 binlog 自动更新缓存,无需修改业务代码。

缓存三兄弟

基于redis实现商店信息缓存,缓存穿透,雪崩,击穿

相关文章:

  • 前端导出Excel终极方案:纯前端实现表格数据导出(兼容主流浏览器)
  • 【Linux内核】零拷贝技术
  • vue3+ts心得
  • docker搭建云盘
  • 《Operating System Concepts》阅读笔记:p449-p459
  • 繼續介紹aapenal 的其中一個功能
  • vulhub靶场matrix-breakout-2-morpheus
  • C++ string的模拟实现
  • 记录瞬间:面试中的技术碰撞与思考
  • 【算法】DFS、BFS、floodfill、记忆化搜索、BFS拓扑排序
  • 开发一条公链:时间维度下的技术攻坚与挑战
  • SEED XSS 实验环境搭建步骤《精简版》
  • 快速入手-基于Django的模版继承操作(六)
  • 英语词汇被动学习 单词发现者-NG
  • 【从零开始学习计算机科学与技术】系统工程概论(一)一般系统论 与 系统工程概论
  • 拓展知识三:编码学及密码学
  • Sqoop安装部署
  • ST的全新STM32U3微控制器(MCU)简析
  • ECharts-一个基于js的可视化图表库
  • redis解决缓存穿透/击穿/雪崩
  • 中国人民抗日战争暨世界反法西斯战争胜利80周年纪念活动标识发布
  • 权益类基金发行回暖,这些老将挂帅新基,谁值得买?
  • “应急侠”上线,应急管理部正式发布应急科普IP形象
  • 泽连斯基表示将在土耳其“等候”普京
  • 均价19.5万元/平米!上海徐汇滨江地王项目“日光”,销售额近70亿元
  • 黄土是他们的气质:打破宁夏当代油画创作的沉寂