Redis 笔记

Redis 笔记(一)

Redis基础

https://juejin.im/post/5db66ed9e51d452a2f15d833

  1. Redis 数据结构

    ​ String、Hash、List、Set、SortedSet(ZSet),以上是最常用的5种基本数据类型;除此之外,还有HyperLogLog、Geo、Pub/Sub、RedisModule

    • 知识盲区:HyperLogLog、Geo、Pub/Sub、RedisModule(BloomFilter,RedisSearch,Redis-ML )
  2. 如果有大量的key需要设置同一时间过期,一般需要注意什么?

    ​ 如果大量的key过期时间设置的过于集中,到过期的那个时间点,Redis可能会出现短暂的卡顿现象。严重的话会出现缓存雪崩,我们一般需要在时间上加一个随机值,使得过期时间分散一些。

    电商首页经常会使用定时任务刷新缓存,可能大量的数据失效时间都十分集中,如果失效时间一样,又刚好在失效的时间点大量用户涌入,就有可能造成缓存雪崩

  3. 那你使用过Redis分布式锁么,它是什么回事?

    ​ 先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。

  4. 这时候对方会告诉你说你回答得不错,然后接着问如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?

    ​ set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的!

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

    ​ 使用keys指令可以扫出指定模式的key列表

  6. 如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题?

    ​ Redis的单线程的。keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长。

    ​ 不过,增量式迭代命令也不是没有缺点的: 举个例子, 使用 SMEMBERS 命令可以返回集合键当前包含的所有元素, 但是对于 SCAN 这类增量式迭代命令来说, 因为在对键进行增量式迭代的过程中, 键可能会被修改, 所以增量式迭代命令只能对被返回的元素提供有限的保证 。

  7. 使用过Redis做异步队列么,你是怎么用的?

    ​ 一般使用list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。

  8. 可不可以不用sleep呢?

    ​ list还有个指令叫blpop,在没有消息的时候,它会阻塞住直到消息到来。

  9. 如果对方接着追问能不能生产一次消费多次呢?

    ​ 使用pub/sub主题订阅者模式,可以实现 1:N 的消息队列。

  10. 如果对方继续追问 pub/sub有什么缺点?

    ​ 在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如RocketMQ等

  11. Redis如何实现延时队列?

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

  12. Redis是怎么持久化的?服务主从数据怎么交互的?

    ​ RDB做镜像全量持久化,AOF做增量持久化。因为RDB会耗费较长时间,不够实时,在停机的时候会导致大量丢失数据,所以需要AOF来配合使用。在redis实例重启时,会使用RDB持久化文件重新构建内存,再使用AOF重放近期的操作指令来实现完整恢复重启之前的状态。
    ​ 这里很好理解,把RDB理解为一整个表全量的数据,AOF理解为每次操作的日志就好了,服务器重启的时候先把表的数据全部搞进去,但是他可能不完整,你再回放一下日志,数据不就完整了嘛。不过Redis本身的机制是 AOF持久化开启且存在AOF文件时,优先加载AOF文件;AOF关闭或者AOF文件不存在时,加载RDB文件;加载AOF/RDB文件城后,Redis启动成功; AOF/RDB文件存在错误时,Redis启动失败并打印错误信息


文章作者: ClarkRao
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ClarkRao !
  目录