base
字典:
hget/hset
在redis字典中值只能是字符串,使用渐进式进行rehash。在rehash的过程中,会保留两个hash结构;查询时会同时查询两个结构;逐渐完成hash的迁移。
- 如果大部分时候使用结构中的大部分数据,可以选择将整个结构序列化,使用string类型存储。
- 如果大部分时候使用结构中的小部分数据,可以将结构进行拆分再序列化存储。
当hash最后一个元素被删除时,回收内存。
键值对:
get/set
setnx = set if not exist
setex //可以指定ttl
键值对的方式进行存储,可以批量处理键值对。而且能够设置key的过期时间
setex A 5 tyuio # 5s 后过期,等价于 set+expire
set A tyuio
expire A 5
setnx可以实现锁,redis的setnx
- 并发量较高时,缓存到期失效,可能出现大规模访问数据库,需要锁,可以setnx实现;
- 创建了锁却由于宕机没有解开锁崩盘,setnx需要tll,
setnx+expire
; - 只有一个请求的 setnx 可以成功,但是任何一个请求的 Expire 却都可以成功(
lua脚本
) - 新版redis只用set指令就可以实现上面功能
- 如果一个请求更新缓存的时间比较长,甚至比锁的有效期还要长,导致在缓存更新过程中,锁就失效了,此时另一个请求会获取锁,但前一个请求在缓存更新完毕的时候,如果不加以判断直接删除锁,就会出现误删除其它请求创建的锁的情况,所以我们在创建锁的时候需要引入一个随机值(在val加上随机值,删除时判断下?这个只能解决删除不对应锁的问题)
- 坏情况是每次请求都出现了锁超时,但通过ttl可以保证DB请求的间隔,避免雪崩
集合set
Set可以看成一个特殊的字典
set //列表,去重
zset //有序列表,去重+排序
zset的排序主要通过跳跃列表实现,能够进行快速查找
《Redis 深度历险:核心原理与应用实践》