Redis使用的相关问题

Redis用那些数据结构?

  • 字符串类型String
  • 字典Hash
  • 列表List
  • 集合Set
  • 有序集合SortedSet
  • HyperLogLog、Geo、Pub/Sub
  • Redis Module、BloomFilter、RedisSearch、Redis-ML

Redis分布式锁,是什么?

  • 先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。
  • 如果在setnx之后,执行expire之前进程意外crash或重启维护, 那么就需要把setnx和
    expire合成一条指令来用。

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

  • 使用keys指令可以扫出指定模式的key列表。
  • 如果这个redis正在给线上的业务提供服务,那么使用key指令会导致线程阻塞。(redis是单线程的,执行key指令期间,线上服务会卡顿,直到指令执行完成,服务才会恢复)。在这种场景下,就可以使用scan指令,该指令可以无阻塞的提取出指定模式的key列表,但是会有一定重复的概率,可以在客户端做一次去重就好了, 但是整体花费的时间会比直接使用keys指令长。

怎么使用Redis做异步队列?

  • 一般使用list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。(如果不用sleep, list还有个指令blpop, 在没有消息的时候, 他会阻塞住直到有消息到来)。
  • 如果要生产一次消费多次,则需要使用pub/sub主题订阅者模式,可以实现1:N的消息队列。(在消费者下线的情况下,生产的消息会丢失。在这种情况下, 就得使用更专业的消息队列了,例如rabbitmq)

如何实现redis延时队列?

  • 使用sortedset, 拿时间戳作为score, 消息内容作为key调用zadd来生产消息, 消费者用zrangebysocre指令获取N秒之前的数据轮询进行处理。

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

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

redis如何做持久化?

  • bgsave做镜像全量持久化, aof做增量持久化。因为bgsave会耗费较长时间, 不够实时, 在停机的时候会导致大量丢失数据, 所以aof来配合使用。在redis实例重启时, 会使用bgsave持久化文件重新构建内存, 在使用aof重放近期的操作指令来实现完整恢复重启之前的状态。
  • 如果不要求性能, 在每条写指令是都sync一下磁盘, 就不会丢失数据。但是在高性能的要求下每次都sync是不现实的, 一般都使用定时sync, 比如1s1次, 这个时候最大就会丢失1s的数据。
  • bgsave的原理是, fork和cow。fork是指redis通过创建子进程来进行bgsave操作, cow指的是copy on write, 子进程创建后, 父进程通过共享数据段, 父进程继续提供读写服务, 写脏的页面数据会逐渐和子进程分离开来。

pipeline有什么好处?

  • 可以将多次IO往返的时间缩减为一次, 前提是pipeline执行的指令质检没有因果相关性。使用redis-benchmark进行压测的时候可以发现影响redis的QPS峰值的一个重要因素是piepline批次指令的数目。

redis的同步机制是如何操作的?

redis可以使用主从同步, 从从同步。第一次同步时, 主节点做一次bgsave, 并同时将后续修改操作记录到内存buffer, 待完成后将rdb文件全量同步到复制节点, 复制节点接受完成后, 将rdb镜像加载到内存。加载完成后, 再通知主节点将修改期间的操作 记录同步到复制节点进行重放就完成了同步过程。

redis集群的原理?

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

猜你喜欢

转载自www.cnblogs.com/yxhblogs/p/9063913.html