应用篇
Redis有哪些数据结构?
- 字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。
- HyperLogLog基数统计、Geo地理位置、Pub/Sub发布/订阅
Redis分布式锁
先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。 同时把setnx和expire合成一条指令来用的!防止expire之前进程意外crash。
假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?
使用keys指令可以扫出指定模式的key列表。 这个时候可以使用scan指令(无阻塞,需要去重)
Redis做异步队列
list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。 使用pub/sub主题订阅者模式,可以实现1:N的消息队列。 实现延时队列:sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用zrangebyscore指令获取N秒之前的数据轮询进行处理。
如果有大量的key需要设置同一时间过期,一般需要注意什么?
如果大量的key过期时间设置的过于集中,到过期的那个时间点,redis可能会出现短暂的卡顿现象。一般需要在时间上加一个随机值,使得过期时间分散一些。
Redis如何做持久化的?
- bgsave做镜像全量持久化
- aof做增量持久化,1s1次。日志
Redis会定期做aof重写。 Redis4.0之后有了混合持久化的功能,将bgsave的全量和aof的增量做了融合处理,这样既保证了恢复的效率又兼顾了数据的安全性。
Pipeline有什么好处,为什么要用pipeline?
可以将多次IO往返的时间缩减为一次,前提是pipeline执行的指令之间没有因果相关性。使用redis-benchmark进行压测的时候可以发现影响redis的QPS峰值的一个重要因素是pipeline批次指令的数目。