附上学习资料
是一个高性能的 key-value 数据库
key都是字符串,不同类型的数据结构的差异就在于 value的结构不一样
- string 可以存放字符串,数字,二进制
- set 无序的唯一的
- list 存放多个字符串
- hash 键值对结构
- zsort 有序 分数
布隆过滤器
判断对象是否存在的数据结构
由大型的位数组和几个不一样的无偏 hash 函数组成
缓存雪崩
解决方法:
1、将缓存可以时间分散
2、使用锁或队列机制:使用锁或队列保证不会有大量线程一次性对数据库进行读写。该方法不适用于高并发情况。
缓存击穿:
解决方案:
1、预先设置热门数据:在 redis 高峰访问之前,把一些热门数据提前存入到 redis 里面,加大这些热门数据 key 的时长。
2、对于热点key设置永不过期。
缓存穿透:
解决方案:
1、缓存空对象
2、采用布隆过滤器
bitmap
geo
//
keys
o(n),一次性,没有limit
scan
游标分步,有limit(单次遍历的字典槽位数量)
管道 :增加存取效率
事务 multi exec discard 不满足原子性 只满足隔离性
watch 乐观锁 结合事务指令进行 当exec时发现变量改变了,执行失败
Aof(定期重写) rdb 区别
- 增量数据/全量数据(两次持久化间的增量数据丢失)
- 重放慢(重写)/重放快
- 数据量大/数据量较小 数据集大的时候,比 rdb 启动效率低
- 指令记录文本/二进制
过期策略
惰性策略:就是在客户端访问这个 key 的时候,redis 对 key 的过期时间进行检查,如果过期了就立即删除。
+
定时扫描策略
淘汰策略
内存达到最大值,处理机制
集群
单实例的内存和cpu受限 ,集群可扩容
- codis 代理中间件 每个redis实例都会分到一部分槽位 1024 crc32
- cluster 去中心化 16384 每个节点都有槽位信息 包括客户端 crc32 可以给每个主节点设置从节点 ,需要手动迁移
sentinel 实现主从高可用 集群 主从切换
主从同步:
分布式锁:
1、setnx 与设置超时时间的原子性
2、删除自己拿到的锁,与删除锁时对比是不是自己拿到的锁与删除锁的原子性问题
3、续约问题 redission看门狗 。默认锁30秒,每隔10秒检查一下,如果客户端还持有锁key,那么就会不断的延长锁key的生存时间,默认每次续命又从30秒新开始
4、主从复制的问题
Redlock redission 也提供了解决方案