技术总结(二十二)
一、Redis缓存更新
在更新Redis缓存时,通常有两种策略:
-
更新缓存(Cache-Aside Pattern):先从缓存获取数据,如果缓存中没有数据或数据已经过期,则从数据库中获取最新数据,并更新到缓存中。
-
使用缓存替换(Read-Through/Write-Through Pattern):应用程序只需要关注数据的读写,缓存层负责同步数据。
二、Redis缓存降级
一、缓存更新的时机
- 数据变更时
- 当数据库中的数据被插入、更新或删除时,与之对应的 Redis 缓存中的数据也需要更新。例如,在一个电商系统中,当商品的价格在数据库中被修改后,Redis 缓存中存储的该商品价格信息也应该立即更新,否则可能会导致用户获取到错误的价格信息。
- 缓存过期后
- Redis 可以为每个缓存键设置过期时间(TTL - Time To Live)。当缓存过期后,再次访问该数据时,需要从原始数据源(如数据库)重新获取数据并更新缓存。比如,设置用户登录会话缓存的过期时间为 1 小时,1 小时后缓存过期,用户再次进行操作时,系统会重新验证用户信息并更新缓存。
二、缓存更新策略
- LRU(Least Recently Used)算法
- 原理:当缓存空间不足时,Redis 会根据 LRU 算法淘汰最近最少使用的缓存数据。在更新缓存时,新的数据会替换掉 LRU 算法确定的那些不常使用的数据。
- 示例:假设 Redis 缓存有固定的容量为 100 个缓存项,当第 101 个数据需要存入缓存时,Redis 会计算出最近最少使用的缓存项(比如,一个很久没有被访问过的用户历史订单缓存)并将其淘汰,然后存入新的数据。
- LFU(Least Frequently Used)算法
- 原理:该算法以数据的访问频率为依据进行缓存淘汰和更新。访问频率最低的数据在缓存空间不足或需要更新时会被优先淘汰。
- 示例:如果有一个商品详情页面的缓存,某个商品的详情缓存很少被访问,而另一个热门商品的详情缓存经常被访问。当需要更新缓存空间时,LFU 算法会优先淘汰那个很少被访问的商品详情缓存。
- 手动更新策略
- 实时更新:在数据发生变化的代码逻辑中,立即更新 Redis 缓存。例如,在一个内容管理系统中,当管理员更新了一篇文章的内容后,在数据库事务提交成功后,马上调用 Redis 的 SET 操作来更新缓存中的文章内容。
- 延迟更新:将缓存更新操作放入消息队列或任务队列中,延迟一段时间后进行更新。这种策略适用于对实时性要求不是特别高的场景,比如统计数据的缓存更新。例如,在一个网站流量统计系统中,用户访问次数的缓存更新可以稍微延迟,通过消息队列异步处理,减轻数据库和缓存系统的即时压力。
三、Redis相关事务的命令
- MULTI(开启事务)
- 作用:用于标记事务块的开始。在 MULTI 命令之后,后续的命令将被放入一个事务队列中,直到执行 EXEC 命令才会一起执行这些命令。
- 示例:
MULTI
SET key1 value1
SET key2 value2
EXEC
- 在这个示例中,SET key1 value1 和 SET key2 value2 这两个命令在 MULTI 命令之后被加入事务队列,当执行 EXEC 命令时,这两个命令会按照顺序依次执行。
- EXEC(执行事务)
- 作用:在一个事务块中,用于触发事务中所有命令的执行。如果在事务块中没有出现语法错误,那么所有的命令都会被执行;如果出现错误,具体的执行情况取决于错误的类型。
- 示例:
MULTI
SET key3 value3
INCR key4
EXEC
- 假设 key4 之前存储的是一个可以被递增的数值类型(如整数),那么 SET key3 value3 和 INCR key4 这两个命令会依次执行。
- DISCARD(取消事务)
- 作用:用于取消一个事务块,清除事务队列中的所有命令,并且不会执行任何操作。通常在开启事务后,还没有执行 EXEC 命令之前,如果发现事务中有一些不需要执行的命令或者出现错误,可以使用 DISCARD 命令取消事务。
- 示例:
MULTI
SET key5 value5
SET key6 wrong_command // 假设这是一个错误的命令
DISCARD
- 在这个例子中,由于出现了一个可能导致事务执行出错的命令,在执行 DISCARD 命令后,事务被取消,SET key5 value5 和错误命令都不会被执行。
- WATCH(监视一个或多个键)
- 作用:用于在事务开始之前监视一个或多个键。如果在事务执行之前,被监视的键的值被其他客户端修改了,那么这个事务将会被打断。
- 示例:
WATCH key7
MULTI
GET key7
SET key7 new_value
EXEC
- 假设另一个客户端在 MULTI 命令之后、EXEC 命令之前修改了 key7 的值,那么当前事务中的命令将不会被执行,这样可以保证事务的隔离性,避免数据不一致的情况。
- UNWATCH(取消监视)
- 作用:用于取消对所有键的监视。通常在使用 WATCH 命令后,如果不再需要监视这些键或者由于某些原因需要重新开始事务而不考虑之前的监视情况时,可以使用 UNWATCH 命令。