在开发中出现很多关于缓存和数据共存问题,本小G网上翻阅cache aside pattern 一些资料,加上项目体验写下
写下这一小简,大家一块来探讨:
使用场景:在使用redis来做数据缓存,减轻数据压力和速度,但是有一个问题就是缓存和mysql数据如何数据一致
一般开发设计为:重点内容
- 查询流程:如果在缓存查询到数据,就直接返回缓存数据,流程end;
- 查询流程:如果查询不到,就查询数据库,然后进行insert cache数据,流程end;
- 更新流程:更新库,update或dele缓存,流程end;
- 更新流程:新增库,
一般开发流程如上(1,2,3,4),但是会出现并发read和write操作,这样就可以会出现读时候在insert cahe的时候会insert,库更新之前数据,产生脏数据,小G:虽然读一般比较快,这种概率很低但是还是存在如上,但是会出现并发read和write操作,这样就可以会出现读时候在insert cahe的时候,会insert,库更新之前数据,产生脏数据,小G:虽然读一般比较快,这种概率很低但是还是存在
个人设计简介:
在数据并不是很大(其他文章中提到:canal阿里这中原理,不过感觉动静有点大,哈,如果并发不是很大),首先
个人认为如果不进行锁(小G:如果加锁可以在,insert cache时候进行判断是否有锁,如果有不进行insert操作,这中设计我个人感觉,还是影响力比较小),这种脏数据都会存在,但是针对不是很注重这种事物脏数据,可以放宽下,
设计如下:
1、加锁对数据在进行缓存操作下(业务不是很注重脏数据可以忽略这点)
2、进行先加缓存然后再更新库,如果更新库有问题,进行删除缓存,这样就不会出现类似长时间存在脏数据无法解决问题
3、增加缓存的有效时间,这样也可以减少脏数据存活周期;