1. 数据类型
五大基本类型
- String
- hash -> 类似map
- list
- set ->
- zset -> 基于set的有序集合
新增
- bitmaps:其实就是string,主要用于位运算,应用如登录记录等
- HyperLogLog:基数计算
- Geospatial:地图经纬度
2. 发布与订阅
发布者与订阅者在同一个频道时,订阅者可接收到发布者发布的消息。
3. 事务
队列模式,首先组队,然后依次执行。非原子性,
- 若组队中出错,则组队失败,不执行队列
- 若执行时出错,出错的语句执行失败,其他语句正常执行,不回滚
可以使用lua脚本,执行时具有原子性。
4. 锁
- redis乐观锁:使用watch监视key,然后使用队列,队列exec时,检查监视的key版本号是否更改,以此决定是否执行。
- 分布式锁:setnx命令
- 设置一个key value 在整个集群有效,同一时间只有一个人能拿到这个锁(key)
- 当锁的持有者删除这个锁时,其他人才能拿到
- 为了防止死锁,设置过期时间,要与加锁操作同时(原子性)
- 为防止操作到他人的锁,可以给value值设置一个自己的唯一值,如UUID
5. 持久化
分为rdb与aop,两者根据需求决定是否开启
- rdb为快照记录,损失数据的可能性较大,性能较好
- aop为日志记录,数据丢失率小,占用内存较多,性能较差
6. 主从
- 通过设置主机与从机,将多个redis联合
- 主机做增删改操作,从机只能读
- 薪火相传:主机有从机,从机又可以有从机,薪火相传。
- 反客为主:主机挂掉之后,从机可手动上升为主机,原来的主机变为从机
- 哨兵:通过哨兵监视主机的运行状态,若判定主机挂掉,则在从机中选举一个晋升为主机,原来的主机降级为从机,选举受影响最大的是设置的优先级。
7. 集群
- 最少六台redis服务器才能组建集群
- 至少一主一从,主机挂掉从机自动上位,主机降级。
- redis集群采用无中心化方式,即无论从集群中哪一台服务器连接,都可以操作整个集群。
- 插槽:集群会给每个主机分配插槽,当插入数据时,首先会通过key计算出插槽值,然后插到对应插槽中,
- 可以设置集群的故障处理方式,当一个模块挂掉之后,整个集群停止或者能用的继续用。
8. 应用问题及解决
1. 缓存穿透
原因:
- 大量请求访问数据库和缓存中没有的数据,由于缓存中查不到,到数据库中查询,把数据库挤爆了,多发于恶意攻击
解决思路:
- 将查询的没有的字段也添加到缓存中,设置较短的过期时间,缓解数据库压力。
- 过滤拦截,如bitmaps或者布隆过滤器(二进制位图+哈希函数)
- 加锁,会降低效率
2. 缓存击穿
原因:
- 每个热门key过期了,导致一瞬间大量请求涌向数据库,数据库挂。
解决思路:
- 预防:监控热门key,快过期时自动添加时长;主动将一些热门的信息加到缓存中;延长这些key的过期时间。
- 锁
3. 缓存雪崩
原因:
- 某个时刻有大量key过期,导致数据库压力巨大,挂。
解决思路:
- 预防:避免大量key同时失效,即分散key的过期时间,可以使用随机数。
- 加锁
- 多级缓存架构,nginx+redis+ehcache等,繁琐
- 监视,在快过期时更新
4. 分布式锁问题
分布式锁的死锁等问题,见上方锁部分