1.单线程的redis为毛这么快?
从以下几点回答,纯内存操作,单线程操作避免了频繁上下文切换,采用非阻塞的多路复用机制。
redis-client在操作的时候,产生不同类型的事件的socket,服务端的IO多路复用程序,将其放入队列,事件派发器会去队列中取,转发到不同的事件处理器中处理。
2.redis数据类型有哪些?
-
String 常见的get/set操作。
-
hash value可以存放一些结构化的对象信息。
-
list 可以作为简单的队列使用,利用lrange做分页查询。
-
set 存放不重复的集合。
-
sorted set 带有score权重的set集合,可以做排行榜需求。
3.redis的过期策略有哪些?
-
定时删除:定时器监控key,过期自动删除,过程消耗cpu,一般不采用。
-
定期删除+惰性删除:每隔100ms检查一次,有过期key则删除,惰性删除是在尝试获取某个key时进行检查,进行删除操作。
-
内存淘汰机制:可以设置redis的配置 maxmemory-policy volatile-lru,在内存不足时对使用最少的key进行淘汰。
4.redis缓存穿透和雪崩怎么解决?
缓存穿透:
-
互斥锁;
-
异步更新:维护value的失效时间,异步线程进行更新;
-
布隆过滤器进行拦截;
防止雪崩:
-
失效事件随机,避免集体失效;
-
互斥锁,存在性能问题;
-
多级缓存;
5.redis并发key竞争如何解决?
一般的采用redis的事务机制,但是在集群环境下数据已经分片就很难搞,redis的事务就显得鸡肋。
分情况讨论:
-
对顺序没有要求,采用分布式锁进行排队,属于悲观锁方式。
-
对顺序有要求,采用时间戳方式,在set之前比对时间戳,属于乐观锁方式。