分布式系统的缓存设计你真的会了吗?

本文涉及的产品
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Redis 版,经济版 1GB 1个月
简介: 分布式系统的缓存设计你真的会了吗?

缓存不仅加快了IO,还可减少原始数据的计算工作。

缓存系统一般设计简单,功能单一,所以Redis吞吐量能是MySQL几倍~几十倍,对于互联网读多写少的高并发场景已不可或缺。

虽然简单好用,但是如果姿势不对,就会造成不必要的损失。


不要把Redis当数据库



很多人不仅把 redis 当缓存,更是把Redis当做数据库使用。很多因为Redis中数据消失导致业务逻辑错误,并且因为没有保留原始数据,业务都无法恢复。


虽然Redis有持久化功能,但这并不能以为它可作为高性能的KV数据库。

Redis处理请求很快,但那是因为在内存中,无法保存超过内存大小的数据。


因此,再将Redis用作缓存时,需要注意:


  • 客户端角度看,缓存数据的特点一定是有原始数据来源,且允许丢失,即使设置的缓存时间是1min,在30s时缓存数据因为某种原因消失了,也要能接受。当数据丢失后,需要从原始数据重新加载数据,永远不要认为缓存是绝对可靠的,也不要认为缓存不会删除没有过期的数据。


  • Redis服务端来看,缓存可以保存的数据量一定小于原始数据

应该限制Redis内存使用量,即maxmemory参数

根据数据特点,明确Redis数据淘汰策略


这些策略是Key范围+Key选择算法的搭配组合,范围有allkeys和volatile两种,算法有LRU、TTL和LFU三种。



如何选择合适的驱逐算法

算法角度



Redis 4.0以后推出的LFU比LRU更“实用”。试想一下,如果一个Key访问频率是1天一次,但正好在1秒前刚访问过,那么LRU可能不会选择优先淘汰这个Key,反而可能会淘汰一个5秒访问一次但最近2秒没有访问过的Key,而LFU算法不会有这个问题。而TTL会比较“头脑简单”一点,优先删除即将过期的Key,但有可能这个Key正在被大量访问。



Key范围角度


allkeys可确保即使Key没有TTL也能回收,如果使用的时候客户端总是“忘记”设置缓存的过期时间,那么可以考虑使用这系列算法。

而volatile会更稳妥,万一客户端把Redis当做了长效缓存,只是启动时候初始化一次缓存,那么一旦删除了此类没有TTL的数据,可能就会导致客户端出错。


缓存数据同步策略


实际开发中,如果修改了原始数据,考虑到缓存数据更新的及时性,我们可能会采用主动更新缓存的策略:


先更新缓存,再更新数据库


不可行。数据库设计复杂,压力集中,数据库因为超时等原因更新操作失败的可能性较大,此外还会涉及事务,很可能因为数据库更新失败,导致缓存和数据库的数据不一致。



先更新数据库,再更新缓存


不可行:


  • 如果线程A、B先后完成数据库更新,但更新缓存时却是B和A的顺序,那很可能会把旧数据更新到缓存中引起数据不一致
  • 我们不确定缓存中的数据是否会被访问,不一定要把所有数据都更新到缓存


先删除缓存,再更新数据库,访问时候按需加载数据到缓存

不可行。并发情况下,很可能删除缓存后还没来得及更新DB,就有另一个线程先读取旧值到缓存中去。并发量高时,概率还很大。



先更新DB,再删缓存,访问时按需加载数据至缓存

最好。虽然在极端情况下,这种策略也可能出现数据不一致,但概率很低,基本可以忽略。

一个极端的例子,更新数据的时间节点恰好是缓存失效了:



  • 【查询线程A】,先读取到了DB的旧值
  • 随后【更新线程B】操作DB完成更新,并删除缓存后
  • 【查询线程A】再把旧值加入缓存



更新DB后,删除缓存的操作可能失败,若失败则考虑把任务加入延迟队列进行延迟重试,确保数据可以删除,缓存可以及时更新。因为删除操作是幂等的,所以即使重复删,问题也不大,这也是删除比更新缓存好的一个原因。


所以对于缓存更新,推荐缓存中的数据不由数据更新操作主动触发,统一在需要使用的时候按需加载,数据更新后及时删除缓存中的数据即可。

并且要尽量设置合适的缓存过期时间,这样即便真的发生不一致,也可以在缓存过期后数据得到及时同步。


使用缓存系统的时候,要监控缓存系统的内存使用量、命中率、对象平均过期时间等重要指标,以便评估系统的有效性,并及时发现问题。


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
1月前
|
canal 缓存 NoSQL
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;先删除缓存还是先修改数据库,双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
Redis常见面试题(一):Redis使用场景,缓存、分布式锁;缓存穿透、缓存击穿、缓存雪崩;双写一致,Canal,Redis持久化,数据过期策略,数据淘汰策略
|
18天前
|
缓存 NoSQL 关系型数据库
(八)漫谈分布式之缓存篇:唠唠老生常谈的MySQL与Redis数据一致性问题!
本文来聊一个跟实际工作挂钩的老生常谈的问题:分布式系统中的缓存一致性。
69 10
|
29天前
|
存储 缓存 NoSQL
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
高并发架构设计三大利器:缓存、限流和降级问题之Redis用于搭建分布式缓存集群问题如何解决
|
29天前
|
存储 缓存 数据库
分布式篇问题之全量缓存解决数据库和缓存的一致性问题如何解决
分布式篇问题之全量缓存解决数据库和缓存的一致性问题如何解决
|
1月前
|
缓存 Devops 微服务
微服务01好处,随着代码越多耦合度越多,升级维护困难,微服务技术栈,异步通信技术,缓存技术,DevOps技术,搜索技术,单体架构,分布式架构将业务功能进行拆分,部署时费劲,集连失败如何解决
微服务01好处,随着代码越多耦合度越多,升级维护困难,微服务技术栈,异步通信技术,缓存技术,DevOps技术,搜索技术,单体架构,分布式架构将业务功能进行拆分,部署时费劲,集连失败如何解决
|
3月前
|
缓存 监控 数据库
分布式系统中缓存穿透问题与解决方案
在分布式系统中,缓存技术被广泛应用以提高系统性能和响应速度。然而,缓存穿透是一个常见而严重的问题,特别是在面对大规模请求时。本文将深入探讨缓存穿透的原因、影响以及一些有效的解决方案,以确保系统在面对这一问题时能够保持稳定和高效。
76 13
|
2月前
|
存储 缓存 NoSQL
了解Redis,第一弹,什么是RedisRedis主要适用于分布式系统,用来用缓存,存储数据,在内存中存储那么为什么说是分布式呢?什么叫分布式什么是单机架构微服务架构微服务的本质
了解Redis,第一弹,什么是RedisRedis主要适用于分布式系统,用来用缓存,存储数据,在内存中存储那么为什么说是分布式呢?什么叫分布式什么是单机架构微服务架构微服务的本质
|
3月前
|
存储 缓存 NoSQL
缓存、分布式缓存和持久化
这篇内容介绍了缓存的概念和Redis的作用,以口袋与公文包的比喻解释了缓存如何提高数据访问速度。Redis是一个内存中的高级缓存系统,能提升系统响应速度。接着讨论了为何需要分布式缓存,通过多个“篮子”(Redis节点)解决单点故障和性能瓶颈,保证高可用性和数据安全性。最后提到了Redis的两种持久化机制——RDB(定期数据快照)和AOF(记录写操作日志),分别用照片备份和实时同步来比喻,说明它们在数据丢失风险和恢复速度上的权衡。
|
3月前
|
缓存 监控 负载均衡
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(数据缓存不一致分析)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(数据缓存不一致分析)
102 2
|
3月前
|
缓存 应用服务中间件 数据库
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
【分布式技术专题】「缓存解决方案」一文带领你好好认识一下企业级别的缓存技术解决方案的运作原理和开发实战(多级缓存设计分析)
103 1