首页 > 数据库 >Redis缓存更新策略

Redis缓存更新策略

时间:2024-10-14 14:17:30浏览次数:8  
标签:缓存 20 数据库 Redis 更新 缓存数据 线程

缓存更新策略

内存淘汰超时剔除主动更新
说明利用Redi的内存淘汰机制,当内存不足时自动淘汰部分数据,下次查询时更新缓存给缓存数据添加TTL(即缓存存在时间)的时间,到期后自动删除缓存,下次查询时更新缓存在修改数据库的同时,更新缓存
一致性一般
维护成本

业务使用场景:

  • 低一致性需求:使用内存淘汰机制。
  • 高一致性需求:主动更新,并以超时剔除作为兜底方案。

主动更新策略方案

  • (推荐)由缓存的调用者,在更新数据库的同时更新缓存。
  • 缓存与数据库整合作为一个服务,由服务来维护一致性。调用者调用该服务,无需关心缓存一致性问题。
  • 调用者只操作缓存,由其他线程异步的将要缓存持久化到数据库,保证最终的一致性。

在更新数据库的同时更新缓存方案

在更新数据库的同时更新缓存需要考虑以下问题:

(1)删除缓存还是更新缓存?

  • 删除缓存(推荐):更新数据库时让缓存失效,查询时再更新缓存
  • 更新缓存:每次更新数据库都要更新缓存,无效写操作较多

(2)如何保证缓存操作与数据库操作同时失败与成功?

  • 单体系统:将缓存与数据库操作放在一个事务
  • 分布式系统:利用TCC等分布式事务

(3)先操作数据库还是缓存?

一、先删除缓存。再操作数据库

正常业务场景:

缓存数据:20;数据库数据:20

  • 线程A:删除缓存,更新数据库为10

此时:缓存数据:空;数据库数据:10

  • 线程B:查询缓存,未命中,查询数据库,写入缓存

此时:缓存数据:10;数据库数据:10

异常业务场景:

缓存数据:20;数据库数据:20

  • 线程A:删除缓存

此时:缓存数据:空;数据库数据:20

  • 线程B:查询缓存,未命中,查询数据库,写入缓存

此时:缓存数据:20;数据库数据:20

  • 线程A:更新数据库10

此时:缓存数据:20;数据库数据:10

这种情况就造成了缓存与数据库不一致的情况。

因为操作数据库的时间远大于删除缓存的时间,这种情况出现的可能性会比较大。

二、(推荐)先操作数据库,再删除缓存

正常业务场景:

缓存数据:20;数据库数据:20

  • 线程A:更新数据库10,删除缓存

此时:缓存数据:空;数据库数据:10

  • 线程B:查询缓存未命中,查询数据库,写入缓存

异常业务场景:

缓存数据:空;数据库数据:20

  • 线程A:查询缓存,未命中,查询数据库20

此时:缓存数据:空;数据库数据:20

  • 线程B:更新数据库10,删除缓存

此时:缓存数据:空;数据库数据:10

  • 线程A:写入缓存20

此时:缓存数据:20;数据库数据:10

这种情况就造成了缓存与数据库不一致的情况。

为什么更推荐使用这种方式,因为作数据库的时间远大于删除缓存的时间,这种情况出现的可能性相对于上面一种要小。

缓存更新策略的最佳实践方案

(1)低一致性要求:使用redis自带的内存淘汰机制

(2)高一致性要求:主动更新,并以超时剔除作为兜底方案

1.读操作

  • 缓存命中则直接返回
  • 缓存未命中则查询数据库,并写入缓存,设定超时时间

2.写操作

  • 先写数据库,然后再删除缓存
  • 要确保数据库与缓存之间的原子性

标签:缓存,20,数据库,Redis,更新,缓存数据,线程
From: https://blog.csdn.net/gs2516230558/article/details/142856119

相关文章

  • redis缓存穿透、雪崩、击穿
    缓存穿透缓存穿透:客户端请求的数据在缓存和数据库都不存在。这样缓存永远不会生效,这些请求都会打到数据库中。解决方案缓存空对象(常用)优点:实现简单,维护方便缺点:额外的内存消耗;可能造成短期的不一致(可以设置TTL时间,缓解不一致的情况)布隆过滤器(常用)优点:内存占用少,没用多......
  • app版本更新---全量更新,热更新等等
    全量更新代码isFirst:trueonLoad(){this.versionCheck(true)compareVersion(version1,version2){constarr1=version1.split('.').map((e)=>e*1)constarr2=version2.split('.').map((e)=>e*1)const......
  • 最全 低速无人驾驶数据集(不定期更新)
    低速无人驾驶是未来智能交通与智慧城市建设的重要组成部分,是下一代智能地面运载工具演变的基础,对我国智能交通发展具有重要意义。近年来,物流配送、环卫清扫、无人港口、安防巡逻、移动零售、救援侦查、矿区开采车、高尔夫球车、园区巴士等运营场景对低速无人车的需求日益旺盛,产......
  • 有关C语言中的数据类型(持续更新)
    有关计算机中的数据单位:计算机存储容量基本单位是字节(byte)字节byte:8个二进制位(bit)为一个字节(B),最常用的单位。一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。计算机的最小存储单位:比特(bit)位bit(比特)(BinaryDigits):存放一位二进制数,即......
  • langchain更新初体验
    文章目录前言写一个基本的demo配置文件.streamlit/secrets.toml获得大模型对象Chain退场,上场的是Runnable总结前言在上一篇文章中(已同步到博客langchain更新初体验),探讨了langchain在0.2.1......
  • Redis 缓存预热,缓存雪崩,缓存击穿,缓存穿透
    Spring-data-redis说明:在SpringBoot2.x之后,原来使用的jedis被替换为了lettucejedis:采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用jedispool连接池lettuce:采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据了1......
  • Github和git的学习(不定期更新)
    学习GitHub和Git可以使用GitHub和Git来开展工作协作。[官方文档直达]([GitHub入门文档-GitHub文档](关于Git-GitHub文档))关于GitHubGitHub是一种基于云的平台,可在其中存储、共享并与他人一起编写代码。通过将代码存储在GitHub上的“存储库”中,你将可以:“展......
  • 滚雪球学Redis[3.3讲]:Redis数据持久化深入探讨:从 AOF 到混合持久化的演进
    全文目录:前言混合持久化1.RDB与AOF之间的权衡2.混合持久化的工作原理工作机制详解3.配置与实践实例演示4.实际应用中的案例分析5.深入探讨混合持久化的优势与局限6.扩展思考:如何选择Redis的持久化策略?总结附:案例与代码配置文件示例:测试代码:模拟数据恢复:下......
  • rsa基本攻击手法总结大全(还在更新中)
    一些关于分解n的常用手法:1.最简单的就是直接使用yafu分解2.费马分解然后我们令p=a+b,q=a-b,此时n=\(a^{2}-b^{2}\),那么\(b^2=a^2-n\),那么\(b=\sqrt{a^2-n}\),我们就让a=\(\sqrt{n}\)开始然后慢慢加1开始遍历,直到找到能够使得\(a^2-n\)能够为一个平方数即可得到我们的b,那么我......
  • Redis 必知概念
    Redis为什么快基于内存实现:Redis将数据存储在内存中,读写操作不会受到磁盘IO速度限制;CPU不是Redis的瓶颈,Redis的瓶颈在于机器内存的大小或者网络带宽I/O多路复用模型的使用:Redis线程不会阻塞在某一个特定的客户端请求处理上;可以同时和多个客户端连接并处理请求,从......