缓存与数据库双写不一致的问题及解决方式
问题描述:当线程1正常更新数据库并删除redis的数据 ,在线程2第一次查询时,线程3更新数据并删除redis的数据,这时线程2才执行到更新redis,就会出现数据库与缓存双写不一致的问题。
一般而言,我们在更新数据库时会把redis的值删除掉,然后第一次查询时从数据库查询并且更新到redis中。但从数据库查询然后更新到redis中这并不是原子操作,可能出现并发问题。
使用redisson读写锁来解决
@RequestMapping ( "/getStock" ) public String getStock(){ String lockKey = "product_01001" ; //获取一个读锁 RReadWriteLock readWriteLock = redisson.getReadWriteLock(lockKey); RLock rLock = readWriteLock.readLock(); //加锁 rLock.lock(); String stock = stringRedisTemplate.opsForValue().get( "stock" ); if (StringUtils.isEmpty(stock)){ System.out.println( "查询对应商品的id的库存" ); stringRedisTemplate.opsForValue().set( "stock" , "数据库查询出来的值" ); } else { return "stock" ; } //解锁 rLock.unlock(); return "stock" ; } @RequestMapping ( "/updateStock" ) public String updateStock(){ String lockKey = "product_01001" ; //获取一个写锁 RReadWriteLock readWriteLock = redisson.getReadWriteLock(lockKey); RLock rLock = readWriteLock.writeLock(); //加锁 rLock.lock(); System.out.println( "更新数据库对应商品的id的库存" ); stringRedisTemplate.delete( "stock" ); //解锁 rLock.unlock(); return "end" ; } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App