1.什么是redis?

redis可以从四个方面来讨论

  1. 它是一个高性能的基于k-v结构存储的NoSql数据库
  2. 目前市面上绝大部分都采用redis来实现分布式缓存,从而提高数据的一个检索效率
  3. redis具备以下特点:
    1. 内存存储,进行数据IO时可以达到非常高的qps,官方测试达到10万以上
    2. 提供了非常多的数据结构,string,hash,list,set,zset等
    3. redis底层采用单线程处理请求,数据层面不需要考虑并发安全性,进而其实现算法的时间复杂度基本上是常量级别
    4. 同时redis提供持久化机制,避免因为服务宕机出现数据丢失等
  4. redis基于其特点redis一般用来实现分布式缓存,从而降低应用程序对关系型数据库检索带来的性能影响

此外redis还可以实现分布式锁,分布式队列,排行榜,查找附近的人等功能,为复杂应用提供非常方便和成熟的解决方案。

2.什么是延迟双删?

如何保证mysql和redis的数据双写一致性?
看看有哪些策略

  1. 先更新缓存,再更新数据库

对于第一种,如果更新了缓存成功,但是更新数据库失败,那么直接导致数据不一致。

  1. 先更新数据库,再更新缓存

对于第二种,若更新数据库成功,但是更新缓存失败,这样同样会导致缓存和数据库数据不一致。

  1. 先删除缓存,再更新数据库

对于第三种,看似没有问题,但是在并发情况下可能出现
image.png
这样同样会导致数据不一致,这里解决的办法就是,在线程1更新完成数据库之后再延迟删除数据一次(延迟的时间一定要大于一次业务一次读操作时间,并且需要保证删除成功【循环删除】

  1. 先更新数据库,再删除缓存

对于第四种,和第三种类似,在并发场景下,若缓存中先没有数据,线程1查询到数据(旧值),此时线程2来更新数据库,然后线程2删除了缓存,接着线程1将查询到的数据放入缓存,这也就导致了数据的不一致。
image.png
解决这个办法同样是延迟删除,延迟一次读操作的时间删除缓存并且保证必须删除成功,若删除失败需要放入队列继续删除,直到删除成功。

3.Redis BigKey如何查找及处理?