Redis
优点:速度快
缺点:只适合存储一些较为简单的数据,不合适复杂查询的数据,不适合持久化储存海量数据
持久化:
**RDB:**把数据以快照的形式保存在磁盘上。save,bgsave,自动化redis.conf
优点:全量备份适用于备份和灾难恢复
缺点:快照持久化期间修改的数据不会被保存
**AOF:**开启AOF后RDB默认会失效
优点:AOF可以更好的保护数据不丢失
缺点:AOF日志文件通常比RDB数据快照文件更大
Redis集群:
主从复制:
主备切换(哨兵):
cluster集群(卡槽):
可能遇到的问题
缓存击穿:
原因:某个热门key突然过期
- 热门数据设置永不过期
- 加互斥锁
缓存穿透:
原因:请求缓存与数据库中都没有的数据
- 布隆过滤器
- 从数据库中也没有取到数据时,将key-null存入redis,设置短暂的有效时间
- 加互斥锁
缓存雪崩:
原因:大量缓存一段时间内集中过期了
- 缓存失效时间设为随机值
- 热点数据永不过期
- 互斥锁
- 双缓存
五种常用的数据类型
String(字符串): 浏览量和分布式锁
setnx 如果不存在,则set 用作分布式锁
psetex 生存时间毫秒
setex 生存时间秒
decr 数字减一
incr 数字加一
Hash(哈希表):实现购物车,相当于Map<String,Map<object,object>>
Hgetall 返回所有的域和值
HDel
HLen 域的数量
Hincrby 域的值加上增量
hval
List(列表)实现消息流
LRange之类
Set(集合)抽奖,点赞,关注,收藏
Smembers 返回集合中所有的成员
Srandmember key [] 返回集合中随机元素 抽奖
Sinter 交集
Sunion 并集
SDiff 差集
Z-Set(有序集) 热搜
跳表/压缩列表
跳表:空间换时间
其他不常用 bitmap位图、hyperloglogs统计、geospatial地理位置
setnx+lua脚本实现分布式锁
如果不使用lua脚本的话,需要multi开启一个事务,watch之类,事务乐观锁机制
分布式锁:redis和zookeeper
redis:ap 异步复制可能造成锁丢失
zookeeper:cp
Synchnorized和ReentrantLock单机锁无法解决分布式超卖现象。
redis分布式锁的两大问题:
1.如何确保redisLock过期时间大于业务执行时间
2.集群下锁丢失的问题
redis内存配置
一般配3/4,默认是全部。redis满了会报OOM
删除策略
1.定时删除 cpu很忙
2.惰性删除 对内存不友好
3.定期删除 每隔一段时间执行一次,删除过期的键操作(随机抽取)
内存淘汰策略
1.noveiction:不会驱逐任何key
2.allkeys-lru:对所有的key使用lru算法进行删除
3.volatile-lru:对设置过期时间的key使用lru算法
4.allkeys-random:对所有的key随机删除
5.volatile-random:对设置了过期时间的key随机删除
6.volotile-ttl:要过期的key删除
7.allkeys-lfu:对所有的key使用lfu算法进行删除
8.volatile-lfu:对设置了过期时间的key进行lfu算法进行删除