Redis九问

1 Redis有哪些数据结构?

基本回答:字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。
中高级用户会加上下面几种数据结构:HyperLogLog、Geo、Pub/Sub。
更高级:Redis Module。比如BloomFilter、RedisSearch、Redis-ML。

2 Redis的分布式锁

使用setnx(set if not exists)来争抢锁,再用expire给锁加一个过期时间防止忘记释放锁。
为防止setnx之后执行expire之前进程意外crash或者重启维护,可同时把setnx和expire合成一条指令。

3 假如Redis里有10亿个key,其中有10万个key是以某个固定的已知的前缀开头的,如何将它们全部找出来?

使用keys指令可以扫出指定模式的key列表。
但redis是单线程的,keys指令会导致线程堵塞,直到指令执行完成,影响线上服务。
可使用scan指令,scan指令可以无阻塞地取出指定模式的key列表,但会有一定的重复概率,需要在客户端进行去重。

4 如何使用Redis做异步队列?

一般使用List结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息时,可适当sleep一会再试。
也可不用sleep,List的另一个指令blpop,在没有消息的时候,它会阻塞直到消息到来。
能否生产一次消费多次?使用pub/sub主题订阅者模式,可以实现1:N的消息队列。但使用pub/sub也有缺点,在消费者下线的情况下,生产的消息会丢失。
如果要实现延时队列呢?可使用Sortedset,拿时间戳作为score,消息内容作为key,调用zadd来生产消息,消费者使用zrangebyscore指令获取N秒之前的数据轮询进行处理。

5 如果有大量的key需要设置同一时间过期,一般需要注意什么?

如果大量的key过期时间设置的过于集中,到过期的那个时间点,redis可能会出现短暂的卡顿现象。一般会在过期时间上加一个随机值,使得过期时间分散一些。

6 Redis如何做持久化的?

bgsave做镜像全量持久化,AOF做增量持久化。因为bgsave会耗费较长时间,不够实时,在停机时会导致大量数据丢失,所以需要AOF来配合使用。在Redis实例重启时,优先使用AOF来恢复内存的状态,如果没有AOF日志,则使用rdb文件进行恢复。
如果机器掉电会怎么样?取决于AOF日志sync属性的设置,如果不要求性能,在每条写指令后都sync一下磁盘,就不会丢失数据。但是在高性能要求下每次写操作都进行磁盘sync操作是不现实的,一般都使用定时sync,比如1秒1次,这个时候最多就丢失1秒的数据。

7 Pipeline有什么好处?为什么要用Pipeline?

Redis客户端与Redis服务器之间使用TCP协议进行连接,一个客户端可以通过一个socket连接发起多个请求命令。每个请求命令发出后client通常会阻塞并等待redis服务器处理,redis处理完请求命令后会将结果通过响应报文返回给client,因此当执行多条命令的时候都需要等待上一条命令执行完毕才能执行。如下图所示:

Redis九问_第1张图片
普遍模式

而管道(pipeline)可以一次性发送多条命令并在执行完后一次性将结果返回,pipeline通过减少客户端与redis的通信次数来实现降低往返延时时间,而且Pipeline 实现的原理是队列,而队列的原理是时先进先出,这样就保证数据的顺序性。 其过程如下图所示:client可以将三个命令放到一个tcp报文一起发送,server则可以将三条命令的处理结果放到一个tcp报文返回。

Redis九问_第2张图片
Pipeline模式

不过在编码时需要注意,pipeline期间将“独占”链接,此期间将不能进行非“管道”类型的其他操作,直到pipeline关闭;如果你的pipeline的指令集很庞大,为了不干扰链接中的其他操作,你可以为pipeline操作新建Client链接,让pipeline和其他正常操作分离在2个client中。不过pipeline事实上所能容忍的操作个数,和socket-output缓冲区大小/返回结果的数据尺寸都有很大的关系;同时也意味着每个redis-server同时所能支撑的pipeline链接的个数,也是有限的,这将受限于server的物理内存或网络接口的缓冲能力。

8 Redis的同步机制是怎样的?

9 Redis集群原理是什么?

Redis Sentinal着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务。
Redis Cluster着眼于可扩展性,在单个redis内存不足时,使用Cluster进行分片存储。

你可能感兴趣的:(Redis九问)