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

技术总结(二十二)

一、Redis缓存更新

在更新Redis缓存时,通常有两种策略:

  1. 更新缓存(Cache-Aside Pattern):先从缓存获取数据,如果缓存中没有数据或数据已经过期,则从数据库中获取最新数据,并更新到缓存中。

  2. 使用缓存替换(Read-Through/Write-Through Pattern):应用程序只需要关注数据的读写,缓存层负责同步数据。

二、Redis缓存降级

一、缓存更新的时机

  1. 数据变更时
    • 当数据库中的数据被插入、更新或删除时,与之对应的 Redis 缓存中的数据也需要更新。例如,在一个电商系统中,当商品的价格在数据库中被修改后,Redis 缓存中存储的该商品价格信息也应该立即更新,否则可能会导致用户获取到错误的价格信息。
  2. 缓存过期后
    • Redis 可以为每个缓存键设置过期时间(TTL - Time To Live)。当缓存过期后,再次访问该数据时,需要从原始数据源(如数据库)重新获取数据并更新缓存。比如,设置用户登录会话缓存的过期时间为 1 小时,1 小时后缓存过期,用户再次进行操作时,系统会重新验证用户信息并更新缓存。

二、缓存更新策略

  1. LRU(Least Recently Used)算法
    • 原理:当缓存空间不足时,Redis 会根据 LRU 算法淘汰最近最少使用的缓存数据。在更新缓存时,新的数据会替换掉 LRU 算法确定的那些不常使用的数据。
    • 示例:假设 Redis 缓存有固定的容量为 100 个缓存项,当第 101 个数据需要存入缓存时,Redis 会计算出最近最少使用的缓存项(比如,一个很久没有被访问过的用户历史订单缓存)并将其淘汰,然后存入新的数据。
  2. LFU(Least Frequently Used)算法
    • 原理:该算法以数据的访问频率为依据进行缓存淘汰和更新。访问频率最低的数据在缓存空间不足或需要更新时会被优先淘汰。
    • 示例:如果有一个商品详情页面的缓存,某个商品的详情缓存很少被访问,而另一个热门商品的详情缓存经常被访问。当需要更新缓存空间时,LFU 算法会优先淘汰那个很少被访问的商品详情缓存。
  3. 手动更新策略
    • 实时更新:在数据发生变化的代码逻辑中,立即更新 Redis 缓存。例如,在一个内容管理系统中,当管理员更新了一篇文章的内容后,在数据库事务提交成功后,马上调用 Redis 的 SET 操作来更新缓存中的文章内容。
    • 延迟更新:将缓存更新操作放入消息队列或任务队列中,延迟一段时间后进行更新。这种策略适用于对实时性要求不是特别高的场景,比如统计数据的缓存更新。例如,在一个网站流量统计系统中,用户访问次数的缓存更新可以稍微延迟,通过消息队列异步处理,减轻数据库和缓存系统的即时压力。

三、Redis相关事务的命令

  1. MULTI(开启事务)
    • 作用:用于标记事务块的开始。在 MULTI 命令之后,后续的命令将被放入一个事务队列中,直到执行 EXEC 命令才会一起执行这些命令。
    • 示例:
MULTI
SET key1 value1
SET key2 value2
EXEC
  • 在这个示例中,SET key1 value1 和 SET key2 value2 这两个命令在 MULTI 命令之后被加入事务队列,当执行 EXEC 命令时,这两个命令会按照顺序依次执行。
  1. EXEC(执行事务)
    • 作用:在一个事务块中,用于触发事务中所有命令的执行。如果在事务块中没有出现语法错误,那么所有的命令都会被执行;如果出现错误,具体的执行情况取决于错误的类型。
    • 示例:
MULTI
SET key3 value3
INCR key4
EXEC
  • 假设 key4 之前存储的是一个可以被递增的数值类型(如整数),那么 SET key3 value3 和 INCR key4 这两个命令会依次执行。
  1. DISCARD(取消事务)
    • 作用:用于取消一个事务块,清除事务队列中的所有命令,并且不会执行任何操作。通常在开启事务后,还没有执行 EXEC 命令之前,如果发现事务中有一些不需要执行的命令或者出现错误,可以使用 DISCARD 命令取消事务。
    • 示例:
MULTI
SET key5 value5
SET key6 wrong_command  // 假设这是一个错误的命令
DISCARD
  • 在这个例子中,由于出现了一个可能导致事务执行出错的命令,在执行 DISCARD 命令后,事务被取消,SET key5 value5 和错误命令都不会被执行。
  1. WATCH(监视一个或多个键)
    • 作用:用于在事务开始之前监视一个或多个键。如果在事务执行之前,被监视的键的值被其他客户端修改了,那么这个事务将会被打断。
    • 示例:
WATCH key7
MULTI
GET key7
SET key7 new_value
EXEC
  • 假设另一个客户端在 MULTI 命令之后、EXEC 命令之前修改了 key7 的值,那么当前事务中的命令将不会被执行,这样可以保证事务的隔离性,避免数据不一致的情况。
  1. UNWATCH(取消监视)
    • 作用:用于取消对所有键的监视。通常在使用 WATCH 命令后,如果不再需要监视这些键或者由于某些原因需要重新开始事务而不考虑之前的监视情况时,可以使用 UNWATCH 命令。

http://www.mrgr.cn/news/67832.html

相关文章:

  • [大模型]视频生成-Sora简析
  • 苹果前面是什么?苹果签名的作用是什么?
  • 2024软件测试面试热点问题
  • postman入参file的接口测试
  • sqlcoder70b模型,如果需要训练或者微调需要什么样的GPU机器
  • Elasticsearch Interval 查询:为什么它们是真正的位置查询,以及如何从 Span 转换
  • MySQL之事务
  • hive面试题,超详细解析。各类型专利top 10申请人,以及对应的专利申请数
  • python入门到精通知乎万赞推荐书籍《流畅的Python》,《流畅的Python》PDF免费下载
  • Hive中各种Join的实现
  • 【系统架构设计师】高分论文:论企业应用系统的分层架构风格
  • 数据结构之单链表(C语言)
  • linux基础知识
  • day-81 打家劫舍 II
  • 焊接覆层耐磨板行业全面且深入的分析
  • 【零基础学习CAPL】——XML工程创建与使用详解
  • uni-app 封装刘海状态栏(适用小程序, h5, 头条小程序)
  • Java题目笔记(十四)Date +综合练习
  • ruoyi-vue集成tianai-captcha验证码
  • 如何将现有VUE项目所有包更新到最新稳定版
  • C++之queue容器
  • 前端-计算机网络
  • 信息流不同行业账户流量池有区别吗?
  • 宠物空气净化器是养宠智商税吗?真实测评霍尼韦尔、希喂、米家
  • 【HarmonyOS】鸿蒙中Interface实例实现的书写格式
  • 从Apache Atlas到Aloudata BIG,数据血缘解析有何改变?