1.什么是redis?
redis可以从四个方面来讨论
- 它是一个高性能的基于k-v结构存储的NoSql数据库
- 目前市面上绝大部分都采用redis来实现分布式缓存,从而提高数据的一个检索效率
- redis具备以下特点:
- 内存存储,进行数据IO时可以达到非常高的qps,官方测试达到10万以上
- 提供了非常多的数据结构,string,hash,list,set,zset等
- redis底层采用单线程处理请求,数据层面不需要考虑并发安全性,进而其实现算法的时间复杂度基本上是常量级别
- 同时redis提供持久化机制,避免因为服务宕机出现数据丢失等
- redis基于其特点redis一般用来实现分布式缓存,从而降低应用程序对关系型数据库检索带来的性能影响
此外redis还可以实现分布式锁,分布式队列,排行榜,查找附近的人等功能,为复杂应用提供非常方便和成熟的解决方案。
2.什么是延迟双删?
如何保证mysql和redis的数据双写一致性?
看看有哪些策略
- 先更新缓存,再更新数据库
对于第一种,如果更新了缓存成功,但是更新数据库失败,那么直接导致数据不一致。
- 先更新数据库,再更新缓存
对于第二种,若更新数据库成功,但是更新缓存失败,这样同样会导致缓存和数据库数据不一致。
- 先删除缓存,再更新数据库
对于第三种,看似没有问题,但是在并发情况下可能出现
这样同样会导致数据不一致,这里解决的办法就是,在线程1更新完成数据库之后再延迟删除数据一次(延迟的时间一定要大于一次业务一次读操作时间,并且需要保证删除成功【循环删除】)
- 先更新数据库,再删除缓存
对于第四种,和第三种类似,在并发场景下,若缓存中先没有数据,线程1查询到数据(旧值),此时线程2来更新数据库,然后线程2删除了缓存,接着线程1将查询到的数据放入缓存,这也就导致了数据的不一致。
解决这个办法同样是延迟删除,延迟一次读操作的时间删除缓存并且保证必须删除成功,若删除失败需要放入队列继续删除,直到删除成功。