1、Redis有哪些数据结构
字符串String、字典Hash、列表List、集合Set、有序集合SortSet。
2、Redis分布式锁
先拿setnx来争抢锁,抢到之后,再到expire给锁加一个过期时间防止锁忘记了释放。可以同时把setnx和expire合成一条指令来使用。
3、在1亿个key上面找出某个已知前缀开头
使用keys指令可以扫除指定模式的key列表
4、如果这个redis是正在给线上的业务提供服务,使用keys会有什么问题?
redis是单线程的,keys指令会导致线程阻塞一段时间,线上服务会停顿,知道命令执行完毕,服务才能恢复。可以使用scan指令,可以无阻塞提取指定key列表,但是有概率会重复,可以在客户端去重,时间也会长一些。
5、redis做异步队列
一般使用list结构作为队列,rpush生产消息,lpop消费消息,当没lpop没有消息的时候可以适当sleep。如果生产一次消费多次,可以使用pub/sub主题订阅者模式,可以实现1:n的消息队列。
6、pub/sub模式有什么缺点?
在消费者下线的情况下,生产的消息会消失,得使用专业的消息队列如rabbitmq等。
7、redis实现延时队列?
使用 sortedset,拿时间作为score,消息内容作为key调用zadd来生成消息,消费者使用zrangebyscore指令获取N秒之前的数据轮训进行处理。
8、如果有大量的key需要设置同一时间过期,一般需要注意什么?
如果大量的key过期设置的过于集中,到过期的那个时间点,redis可能会出现短暂的卡顿现象。一般需要在时间上加一个随机值,是的过期时间分散一些。
9、redis如果做持久化?
bgsave做镜像全量持久化,aof做增量吃就好。因为bgsave会耗费较长时间,不够实时,在停机的时候会导致大量丢失数据,所以需要aof来配合使用。在redis实例重启时,会使用bgsave持久化文件重新构建内存,在使用aof重放近期的操作指令来实现完整回复重启之前的状态。
10、Pipeline有什么好处?为什么使用pipeline?
可以将多次IO往返的时间缩减为一次,前提是pipeline执行的指令之间没有因果相关性。使用redis-benchmark进行压测的时候可以发现影响redis的QPS峰值的一个重要因素是pipeline批次指令数目。
11、redis的同步机制了解么?
redis可以使用主从同步、从从同步。第一次同步时,主节点做一次bgsave,并同时将后续修改操作记录到内存buffer,待完成后将rdb文件全量同步到复制节点,复制节点接收完成后将rdb镜像加载到内存。加载完成后,在通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。
12、redis集群的原理是什么?
Redis sentinel 着眼于高可用,在master宕机时会自动将slave提升为master,继续提供服务。
Redis Cluster 着眼于扩展性,在单个redis内存不足时,使用Cluster可以分片存储。