首页 > 数据库 >Redis面试题-如何保持缓存一致性

Redis面试题-如何保持缓存一致性

时间:2024-09-21 12:24:31浏览次数:9  
标签:面试题 缓存 数据库 Redis 更新 一致性 数据

1、延迟双删

延迟双删策略是一种用于解决缓存与数据库之间数据一致性问题的方法。其基本思想是在更新数据库时,通过两次删除缓存的操作来尽可能地保证数据的一致性。具体步骤包括:首先,在更新数据库之前删除缓存;然后,执行数据库更新操作;最后,在延迟一段时间后再次删除缓存。

优点

  • 减少缓存污染:通过两次删除缓存,可以在一定程度上减少在数据库更新过程中缓存被旧数据污染的可能性。
  • 平衡性能与一致性:延迟双删策略通过延迟删除缓存来平衡系统的一致性和性能需求,避免频繁的缓存更新操作对系统性能的影响。

局限性

  • 最终一致性:延迟双删策略只能保证最终一致性,即在一定延迟后缓存与数据库的数据会保持一致,但不能保证强一致性。在高并发场景下,仍然存在数据不一致的风险。
  • 延迟时间设定:延迟时间的设定是一个难题。设置过短可能无法有效防止旧数据写入缓存,设置过长则可能影响系统的响应速度和性能。
  • 并发问题:在高并发环境下,即使采用了延迟双删策略,仍然可能存在多个请求同时操作缓存和数据库的情况,导致数据不一致。

延迟双删策略可以在一定程度上保证Redis缓存与数据库之间的一致性,但它并不能完全保证在所有情况下的一致性,属于弱一致性。

2、异步更新(异步通知)

在更新数据库数据时,同时发送一个异步通知给Redis,让Redis知道数据库数据已经更新,需要更新缓存中的数据。这个过程是异步的,不会阻塞数据库的更新操作。当Redis收到异步通知后,会立即删除缓存中对应的数据,确保缓存中没有旧数据。这样,即使在这个过程中有新的读请求发生,也不会读取到旧数据。等到数据库更新完成后,Redis再次从数据库中读取最新的数据并缓存起来。

这种异步通知的方式,可以确保Redis中的数据与数据库中的数据保持一致,避免出现数据不一致的情况。这种方案可以降低数据不一致的风险,但仍然无法完全避免。因为消息队列本身也可能因为各种原因丢失消息。

3、使用Redis的事务支持

Redis提供了事务(Transaction)支持,可以将一系列的操作作为一个原子操作执行。我们可以利用Redis的事务来实现MySQL和Redis的原子更新。

redisTemplate.execute(new Sessioncallback<Object>(){
    @0verridepublic Object execute(RedisOperations operations) throws DataAccessException {
        // 开启事务
        operations.multi();
        // 更新MySQL
        userMapper.update(user);
        // 更新Redis
        operations.opsForValue().set("user_" + user.getId(),user);
        // 执行事务
        operations.exec();
        return null;
    }
});

使用Redis事务可以确保MySQL和Redis的更新在同一事务中执行,避免了中间出现不一致的情况。但需要注意的是,Redis的事务并非严格的ACID事务,可能存在部分成功的情况。

标签:面试题,缓存,数据库,Redis,更新,一致性,数据
From: https://blog.csdn.net/qq_50801874/article/details/142383671

相关文章

  • 前端开发转行AI大模型?应该如何准备面试?面试题+答案来了!!!
    一、初探大模型:起源与发展1、预热篇:解码注意力机制1.1注意力机制最早是在哪个领域得到应用的1.2以下哪些方法被用于处理序列数据?1.3以下方法被用于处理序列数据的是1.4注意力机制是什么2、变革里程碑:transformer的崛起2.1Transformer模型和注意力机制的关系2.......
  • 面试面经|大模型算法岗常见面试题100道
    本文提供了一份全面的大模型算法岗位面试题清单,包括基础理论、模型结构、训练微调策略、应用框架、分布式训练和模型推理等方面的知识点,旨在帮助求职者准备相关技术面试。一、基础篇1、目前主流的开源模型体系有哪些?Transformer体系:由Google提出的Transformer模型及其......
  • 在一台服务器docker下载mysql和redis镜像,保存到本地,然后在另外一台服务上导入镜像
    要在一台服务器上下载MySQL和Redis的Docker镜像并保存到本地,然后在另一台服务器上导入镜像,您可以按照以下步骤进行操作:步骤1:在第一台服务器上下载MySQL和Redis镜像下载MySQL镜像:dockerpullmysql:latest下载Redis镜像:dockerpullredis:latest步骤2:......
  • 短视频全套源码,解决缓存击穿的常用方案
    短视频全套源码,解决缓存击穿的常用方案一、设置合理的过期时间固定过期时间:为短视频全套源码中的热点数据设置一个合理的固定过期时间,可以有效地减少数据库的访问频率,但不能完全避免缓存击穿问题。随机过期时间:通过为短视频全套源码中的缓存设置不同的随机过期时间,可以使缓......
  • 【Redis入门到精通二】Redis核心数据类型(String,Hash)详解
    目录Redis数据类型1.String类型 (1)常见命令(2)内部编码2.Hash类型(1)常见命令(2)内部编码Redis数据类型    查阅Redis官方文档可知,Redis提供给用户的核心数据类型有以下九个,从上到下依次是字符串,哈希,列表,集合,有序集合,流,位图,位域,地址空间。因为Redis本身就是通......
  • mybatis一级缓存机制
    在mybatis中一级缓存是默认打开的,二级缓存没有默认打开,需要主动配置。今天我们主要来说一级缓存的执行机制。 首先,我们应该了解为什么有缓存如果没有缓存,那么java程序每次去数据库取数据的时候,都会直接去数据库取,如果取的是相同的数据,会大大影响效率,因为与数据库的链接本质......
  • 2024-09-20 如何去除vue前端框架upload组件中的缓存 ==》v-if+setTimeout
    在很多前端框架中的upload组件,比如arco-design的a-upload组件,在遍历渲染过程中会发现上传完成后,切换到另一个a-upload组件,它的图片会显示上一个a-upload组件的缓存 正常上传,然后点击红色,红色对应的图片应该被清空,实际上却并没有,如下解决方案:给a-upload组件加一个条件判断v-if......
  • Redis哨兵机制sentinel集群配置
    一、安装redis1主2从集群略二、复制sentinel.conf文件到指定目录修改sentinel.conf配置port26379dir"/tmp"logfile"/usr/local/redis/logs/sentinel-26379.log"daemonizeyessentinelmonitormymaster10.211.55.763792sentinelauth-passmymasterlinlinsen......
  • redis主从配置启动(1主2从)
    一、安装redis略二、主节点配置文件daemonizeyespidfile/usr/local/redis/logs/redis_6379.pidport6379tcp-backlog1024bind0.0.0.0timeout0tcp-keepalive60loglevelnoticelogfile"/usr/local/redis/logs/redis_6379.log"databases16save""sav......
  • Docker Compose 搭建 Redis 主从复制
    服务器状态IP PORTROLE192.168.142.1576379master192.168.142.1566390slave192.168.142.1556391slave02masterdocker-compose.ymlservices:redis-master:image:hub.atomgit.com/amd64/redis:7.0.13restart:alwayscontainer_name:redis-masterpr......