分布式缓存和Redis面试总结

分布式缓存:

LRU(最近最少使用)算法实现:可以使用一个有序的单链表来实现。当有一个新的数据被访问时,如果存在于单链表之中,则直接读取该数据,然后把该节点插入链表头部。如果不存在单链表之中,先判断是否还有缓存,如果有则将该节点插入单链表的头部,如果没有先删除单链表尾部的节点,然后再将节点插入到单链表头部。

引入缓存常见的问题:缓存穿透、雪崩、击穿、数据一致性。

缓存穿透解决方案:缓存空对象;布隆过滤器。

缓存雪崩解决方案:缓存高可用;本地缓存;请求DB限流;服务降级。

缓存击穿解决方案(针对一个key,真实存在):使用互斥锁;手动过期。

数据一致性相关:

产生的原因:并发场景下读取老DB更新到缓存;缓存和DB的操作不在一个事务,一个成功一个失败。

解决方案:todo

Redis:

优点:速度快;支持持久化存储;支持丰富的数据类型;丰富的特性。

支持的数据类型:String、List、Set、Sorted Set、Hash

效率高的原因:完全内存的操作;非阻塞的IO多路复用;单线程操作避免了上下文切换;Hash

持久化的方式:RDB(全量)和AOF(增量)

过期策略:主动删除;被动删除;maxmemory

淘汰策略:volatile-lru;volatile-ttl;volatile-random;allkeys-lru;allkeys-random;no-enviction;

实现分布式锁:set指令;redlock

实现消息队列:用list结构实现,rpush 生产消息,lpop 消费消息。

为什么用跳表不用红黑树:redis主要的操作有插入单个数据、删除单个数据、查找单个数据、查找某个区间的数据,对于前三个操作来说红黑树和跳表差不多,但是对于第四个操作,跳表明显优于红黑树。

 

 

你可能感兴趣的:(面经,Redis)