首页 > 数据库 >Redis和数据库双写情况下,客户端展示信息未及时生效

Redis和数据库双写情况下,客户端展示信息未及时生效

时间:2022-10-31 13:56:19浏览次数:58  
标签:缓存 请求 版本号 数据库 Redis 更新 双写 客户端

问题现象:后端更新完数据库记录版本号后,前端展示的记录版本号仍然为老的版本号

问题分析:

客户端展示的版本号是从缓存中获取的,在更新后端数据库记录的时候,采用双写的方式,但是双写过程中,存在部分业务代码没有删除缓存。

双写的意思是既对sql数据库进行了修改(修改的意思就是增删改),又对redis缓存进行了修改。首先解释下为什么对数据库修改还要改缓存。

引入缓存的目的就是为了减少数据库的访问压力。客户端请求数据时,服务端收到请求后,如果能在缓存中命中数据,就不需要查询数据库,从而减轻数据库的压力,提高服务端的性能。

如果对数据库数据修改,就需要同时修改redis缓存,保证数据库和缓存数据的一致性。问题出现的原因就是数据库和缓存数据不一致, 数据库实际上版本号已经更新过来了,但是缓存还是老的。导致客户端获取到的是更新前的包版本号。接下来谈谈保证数据库和缓存数据一致性的方法。

方法一:先更新数据库,再更新缓存,结果:写并发导致导致不一致现象

举个例子,现在同时两个请求A和B并发修改同一条数据,分别将数据修改成C和D,由于更新数据库和更新缓存属于两个操作,在请求A更新完数据库后,此时数据库状态为C。如果请求B此时进行数据库更新和缓存更新,数据库和缓存状态均为D。在B请求处理后,A请求再一次进行更新缓存操作,将缓存更新为C,就出现了不一致情况。解决办法,将两个操作加上分布式锁,避免这种情况发生(但是分布式锁会使得并发能力下降)或者给缓存加上超时时间,过一段时间客户端重新获取数据时,缓存失效,重新从数据库获取数据,并写入缓存,但是这会给用户造成延时生效的现状。

 

方法二:先更新缓存,再更新数据库,结果:写并发导致不一致现象

还是方法一的例子,在请求A中如果先进行缓存更新后,请求B中此时进行缓存更新和数据库更新,此时缓存状态为D, 之后请求A的数据库更新将数据库状态改为C,从而出现问题不一致情况,解决方法和方法一一致

 

方法三:写策略:删除缓存,并更新数据库  读策略:客户端查询时如果没有缓存将从数据库中查询数据库值并写入缓存(旁路缓存策略 Cache Aside)

继续举例子:请求A将修改数据库数库的某条数据从C修改成D,此时刚好有一条查询请求B,希望获取数据C。 那么这个时候需要考虑两个情况,先删缓存还是先更新数据库

情况1: 先删缓存,再更新数据库, 读写并发导致不一致现象

如果请求A将缓存删除后,查询请求B发现缓存未命中,首先从数据库获取到数据为C,然后将C写入缓存中,之后请求A又将数据库改成了D,所以出现不一致现象

情况2:先更新数据库,再删缓存,理论上和情况1一致也会出现不一致情况,但是概率更小,因为缓存写操作远快于数据库的写操作

查询请求B发现缓存未命中,首先从数据库获取到数据为C,此时请求A将数据库更新为D后,并将缓存删除后,查询请求将C写入缓存,所以出现不一致现象,但是发生概率很小,因为缓存写操作远快于数据库的写操作,为了避免这种情况,可以给缓存加上超时时间

以上三种情况可得,方法三先更新数据库,再删除缓存比较合适,但是这种操作对缓存命中有一定影响。

标签:缓存,请求,版本号,数据库,Redis,更新,双写,客户端
From: https://www.cnblogs.com/kevin-zsq/p/16844004.html

相关文章

  • Redis学习笔记
    Redisshodan:"product:Redis"shodan:product:"Rediskey-valuestore"fofa:protocol="redis"Redis基础Redis相关文章细数redis的几种getshell方法......
  • SpringBoot集成Redisson报错RedissonReactiveRedisConnection.close()
    SpringBoot集成redisson-spring-boot-starter报错:点击查看代码2022-10-3109:30:10.255WARN92312---[isson-netty-2-4]io.netty.util.concurrent.DefaultPromise......
  • 浅谈Redis与分布式锁
    后续进行补充,先放个链接在这,哈哈 https://zhuanlan.zhihu.com/p/378797329#:~:text=%E6%83%B3%E8%A6%81%E5%AE%9E%E7%8E%B0%E5%88%86%E5%B8%83%E5%BC%8F%E9%94%81%EF%BC......
  • 比Xshell 还好用的 SSH 客户端神器
    个人试用后的确好用界面也还凑合,主要是解决了crt的长连接问题推荐链接:https://mp.weixin.qq.com/s?__biz=MzU2NDc4MjE2Ng==&mid=2247493070&idx=3&sn=531a178d919516a0ef......
  • Redis缓存
    什么是缓存缓存就是数据交换的缓冲区(称作Cache),是存贮数据的临时地方,一般读写性能较高。缓存的作用降低后端负载提高读写效率,降低响应时间缓存的成本数据一致性成......
  • Redis实现分布式缓存
    单机的Redis存在四大问题:数据丢失、并发能力弱、故障恢复问题、存储能力1、Redis持久化(解决数据丢失问题)有两种持久化方案:RDB/AOF★RDB(数据备份文件):把内存......
  • 高并发技巧-redis热key问题处理技巧
    热key问题,简单来说就是对某一资源的访问量过高问题,再简单一点来说就是对某个资源访问的qps过高,而解决访问量高的问题通常我们使用分布式缓存,最常见的就是redis,这个资源对应r......
  • 部署redis-cluster
    1、环境准备☆每个Redis节点采用相同的相同的Redis版本、相同的密码、硬件配置☆所有Redis服务器必须没有任何数据#所有主从节点执行:[root@ubuntu2004~]#bashinstall......
  • redis-dump 工具安装
    说明redis-dump是一个第三方的工具,这就意味着需要安装才能使用,它依赖与ruby。经过踩坑发现对ruby版本还是有要求的,Centos7.+使用yuminforuby发现版本为2.0.0.+,这个时候......
  • 部署redis-cluster
     1、环境准备☆每个Redis节点采用相同的相同的Redis版本、相同的密码、硬件配置☆所有Redis服务器必须没有任何数据#所有主从节点执行:[root@ubuntu2004~]#......