深圳做网站要多少钱,做一个网站的计划书,网站专题页策划,实施网站推广的最终目的#x1f4e2; 大家好#xff0c;我是 【战神刘玉栋】#xff0c;有10多年的研发经验#xff0c;致力于前后端技术栈的知识沉淀和传播。 #x1f497; #x1f33b; CSDN入驻不久#xff0c;希望大家多多支持#xff0c;后续会继续提升文章质量#xff0c;绝不滥竽充数… 大家好我是 【战神刘玉栋】有10多年的研发经验致力于前后端技术栈的知识沉淀和传播。 CSDN入驻不久希望大家多多支持后续会继续提升文章质量绝不滥竽充数欢迎多多交流。 文章目录 Redis 与数据库一致性 Redis 与数据库一致性
【问题背景】
使用Redis做一个缓存操作让请求先访问到redis而不是直接访问MySQL等数据库。
读取缓存步骤一般没有什么问题但是一旦涉及到数据更新数据库和缓存更新就容易出现缓存(Redis)和数据库MySQL间的数据一致性问题。
不管是先写MySQL数据库再删除Redis缓存还是先删除缓存再写库都有可能出现数据不一致的情况。
【方案一延时双删】
先删除Redis缓存数据再更新Mysql延迟几百毫秒再删除Redis缓存数据这样就算在更新Mysql时有其他线程读了Mysql把老数据读到了Redis中那么也会被删除掉从而把数据保持一致。延时双删 是一种常见的解决 Redis 和数据库一致性问题的方案它可以有效地降低数据不一致的概率。
原理
写入 Redis 当用户修改数据时先写入 Redis 缓存。异步更新数据库 同时异步地将修改操作发送到数据库进行更新。延时删除 Redis 为了防止数据库更新失败导致数据不一致在数据库更新成功后延时一段时间再删除 Redis 缓存。
优点
提高性能 由于大部分请求都命中缓存可以有效地提高系统性能。降低数据不一致的概率 延时删除可以确保数据库更新成功后Redis 缓存才会被删除从而降低数据不一致的概率。
缺点
存在短暂的数据不一致 在延时删除期间Redis 缓存和数据库数据可能存在短暂的不一致。需要额外的逻辑 需要实现延时删除机制增加代码复杂度。
适用场景
对于对数据一致性要求不高的场景延时双删是一个不错的选择。对于需要高性能的场景延时双删可以有效地提高系统性能。
Component
public class CacheUtil {Autowiredprivate RedisTemplateString, Object redisTemplate;// 删除数据的方法public void deleteWithDelay(String key, String dbKey) {// 第一次删除 Redis 中的数据redisTemplate.delete(key);// 等待一段时间例如 500 毫秒try {TimeUnit.MILLISECONDS.sleep(500);} catch (InterruptedException e) {Thread.currentThread().interrupt();}// 从数据库中删除数据假设有一个数据库操作的方法deleteFromDatabase(dbKey);// 再次删除 Redis 中的数据redisTemplate.delete(key);}// 模拟从数据库中删除数据的方法private void deleteFromDatabase(String dbKey) {// 实际的数据库删除逻辑System.out.println(Deleting from database: dbKey);// 例如repository.deleteById(dbKey);}
}【其他方案】
1、队列 重试机制
2、异步更新缓存(基于订阅binlog的同步机制)