Redis 的数据类型(数据结构)
- string (二进制安全,可以存储任意类型的数据)
- list(链表)
- 字典(就是hashmap)
- set(不重复无序的hashmap)
- zset(按照给定的 score 排序的 set)
- HyperLogLog(来做基数统计的算法,简介)
- Geo(支持地理位置的操作,使用简介)
- Pub/Sub
- BloomFilter
- RedisSearch
- Redis-ML
缓存雪崩(缓存击穿)
他们出现的原理都是访问缓存的时候,key 刚好失效,导致直接访问 DB,压垮后台。
解决办法就是让 key 的过期时间分散开,不要集中失效
分布式锁
使用 setnx 命令后为了防止死锁,需要对 key 施加 expire 命令,防止死锁,但是存在执行 expire 命令前宕机,造成死锁的发生。
解决办法就是使用复杂的 setnx 命令,他可以把 setnx 和 expire 一起原子执行
如何寻找有固定前缀的 key
使用 KEYS pattern 命令,如:KEYS alib*
但是因为 Redis 是单线程的,执行该命令后会导致 Redis 阻塞住。
解决办法就是使用 scan 命令,scan 命令可以无阻塞的提取出指定模式的 key 列表,但是会有一定的重复概率,在客户端做一次去重就可以了,但是整体所花费的时间会比直接用 keys指令长
scan 命令的特点:
Redis中的Scan命令的使用 - MSSQL123 - 博客园www.cnblogs.com如何用 Redis 做异步队列
使用 list 数据结构,在一遍加入,另一边取出,若取出来的是 null,则消费线程应该 sleep,或者消费线程不使用 lpop 或 rpop 命令,改为 blpop 或者 brpop 命令,若没有元素可取,它会阻塞列表直到等待超时或发现可弹出元素为止。
如何生产一次,消费多次
使用发布订阅模式
但是在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如 rabbitmq
Redis 如何实现延时队列
使用 zset ,用时间戳作为 score,消息会按照时间顺序排序
然后使用 zrangebyscore key min max [WITHSCORES] [LIMIT offset count] 来取出比当前时间小的 key 的 value
持久化
Redis 4.0 时代以 RDB 为主,AOF 只记录上一次 RDB 到现在的更改记录
开启混合持