双写一致性 :当修改了数据库的数据也要同时更新缓存的数据,缓存和数据库的数据要保持一致。
修改了mysql的数据同时也要修改redis的数据,要保证redis缓存的数据和mysql的数据一致。
读操作:缓存命中,直接返回;缓存未命中查询数据库,写入缓存,设定超时时间。
写操作:延迟双删
删除缓存
1.为什么要双删?
先删除缓存,或者先修改数据库,都容易出现数据不一致的情况。所以需要删除两次缓存。
2.为什么要延时删除?
因为主从数据库是有延时性的,所以等到数据库同步之后再延时删除。值得注意的是这种方法也只能做到降低出现脏数据的概率,并不能保证完全一致。
redis缓存存的都是读多写少的数据,如果是写多读少的数据也用不着缓存了,直接写到数据库就好。
共享锁:读锁readlock,加锁之后,其他现场可以共享读操作
排他锁:独占锁writeLock也叫,加锁之后,阻塞其他线程读写操作
读数据。写数据
共享锁:读数据。读读不互斥,写互斥。
排他锁:读写互斥
1.为什么要双删?
先删除缓存,或者先修改数据库,都容易出现数据不一致的情况。所以需要删除两次缓存。
2.为什么要延时删除?
因为主从数据库是有延时性的,所以等到数据库同步之后再延时删除。值得注意的是这种方法也只能做到降低出现脏数据的概率,并不能保证完全一致。
redis缓存存的都是读多写少的数据,如果是写多读少的数据也用不着缓存了,直接写到数据库就好。
共享锁:读锁readlock,加锁之后,其他现场可以共享读操作
排他锁:独占锁writeLock也叫,加锁之后,阻塞其他线程读写操作
读数据。写数据
共享锁:读数据。读读不互斥,写互斥。
排他锁:读写互斥
允许延时一致的业务,采用异步通知
1.使用mq中间件,更新数据之后,通知缓存删除
2.利用canal中间件,不需要修改业务代码,伪装为mysql的一个从节点,canal通过读取binlog数据更新缓存
强一致性的,采用redisson提供的读写锁
1)共享锁:读锁readlock,加锁之后,其他线程可以共享读操作
2)排他锁:独占锁writeLock,加锁之后,阻塞其他线程读写操作
异步通知保证数据的最终一致性