美文网首页我爱编程
redis学习笔记(四)redis缓存与数据库一致性问题

redis学习笔记(四)redis缓存与数据库一致性问题

作者: 加油小杜 | 来源:发表于2018-01-04 14:23 被阅读564次

redis系列文章目录

使用spring-data-redis实现incr自增

Redis 利用Hash存储节约内存

Redis学习笔记(九)redis实现时时直播列表缓存,支持分页[热点数据存储]

Redis学习笔记(八)redis之lua脚本学习

Redis学习笔记(七)jedis超时重试机制注意事项

Redis学习笔记(六)redis实现分布式锁

Redis学习笔记(五)jedis(JedisCluster)操作Redis集群 redis-cluster

redis学习笔记(四)缓存与数据库一致性问题

redis学习笔记(三)数据淘汰策略

redis学习笔记(二)JedisCluster + redis 3.2.5集群

redis学习笔记(一)redis3.2.5集群安装与测试

redis与数据库数据一致性问题是个老生常谈的问题了,这里也没啥新鲜玩意,就是总结一下

不一致产生的原因

我们在使用redis过程中,或者网上一些资料,通常会这样做:先读取缓存,如果缓存不存在,则读取数据库。伪代码如下:

Object stuObj =newObject();publicStugetStuFromCache(String key){        Stu stu = (Stu) redis.get(key);if(stu ==null){synchronized(stuObj) {                stu = (Stu) redis.get(key);if(stu ==null){                    Stu stuDb = db.query();                    redis.set(key, stuDb);                }            }        }returnstu;    }

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

上面加锁是为了防止过多的查询走到数据库层

写数据库伪代码:

publicvoidsetStu(){    redis.del(key);    db.write(obj);}

1

2

3

4

不管是先写库,再删除缓存;还是先删缓存,再写库,都有可能出现数据不一致的情况 

因为写和读是并发的,没法保证顺序,如果删了缓存,还没有来得及写库,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。如果先写了库,再删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。 

如果是redis集群,或者主从模式,写主读从,由于redis复制存在一定的时间延迟,也有可能导致数据不一致。

优化思路

双删 + 超时

在写库前后都进行redis.del(key)操作,并且设定合理的超时时间。这样最差的情况是在超时时间内存在不一致,当然这种情况极其少见,可能的原因就是服务宕机。此种情况可以满足绝大多数需求。 

当然这种策略要考虑redis和数据库主从同步的耗时,所以在第二次删除前最好休眠一定时间,比如500毫秒,这样毫无疑问又增加了写请求的耗时

异步淘汰缓存

通过读取binlog的方式,异步淘汰缓存。 

好处:业务代码侵入性低,将缓存与数据库不一致的时间尽可能缩小。

参考文献

缓存与数据库一致性保证

主从DB与cache一致性

版权声明:本文为博主原创文章,未经博主允许不得转载,转载请注明出处. 博主博客地址是 http://blog.csdn.net/liubenlong007

本文已收录于以下专栏:

redis学习教程

相关文章

  • Redis常用缓存读写策略

    数据库与Redis保持缓存一致性问题 旁路缓存模式 这是平时使用比较多的一个缓存读写模式,比较适合读请求比较多的场...

  • Redis缓存和数据库不一致怎么解决

    Redis缓存和数据库不一致怎么解决 不管是先写MySQL数据库,再删除Redis缓存;还是先删除缓存,再写库,都...

  • redis学习笔记(四)redis缓存与数据库一致性问题

    redis系列文章目录 使用spring-data-redis实现incr自增 Redis 利用Hash存储节约内...

  • Redis

    Redis 从应用到系统内核: Redis的几个话题 Redis删除策略的比较 I/O 模型 数据库和缓存双写一致...

  • 缓存

    通过本文档,你将会了解到 为什么要使用缓存 本地缓存它不香么?为什么要使用redis缓存, 缓存一致性问题,缓存穿...

  • redis学习笔记

    redis学习笔记 简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存...

  • redis安装 & 数据类型

    一,缓存数据库介绍 1,缓存数据库用处 2,常用的缓存数据库 3,redis介绍 二,redis安装 命令行模式 ...

  • 高并发架构修炼

    redis缓存策略 分布式缓存一致性 redis常见的问题 redis分布式锁 http://ifeve.com/...

  • Redis 与数据库的一致性

    title: Redis 与数据库的一致性date: 2021/05/26 17:00 首先,给缓存设置过期时间是...

  • 97 基于Binlog实现MySQL与Redis数据一致性问题

    mysql 与Redis 数据一致性问题 直接将Redis清空中间件 canal框架 基于 docker环境构建 ...

网友评论

    本文标题:redis学习笔记(四)redis缓存与数据库一致性问题

    本文链接:https://www.haomeiwen.com/subject/tjernxtx.html