redis的存储结构是key-value类型,有5种存储类型
a. key-string
b. key-hash
c. key-list
d. key-set
e. key-sortedset
所有的类型都可以用expire设置过期时间,其中string类型和sortedset类型不仅可以用expire命令,还可以加参数设置过期时间
key-string
字符串类型,最常用最简单的类型,可以用 help @string查出所有相关的命令,也可以去redis官网查看具体的说明:https://redis.io/commands/?group=string
- redis用的是安全二进制传输,string类型底层也是存的二进制,所以string类型有很多二进制命令,而且没有长度限制,故可以直接用原生的redis命令实现很多需要大bit的场景:如查询电话号码是否注册,统计登录/签到等
- string的set命令能带nx,xx,ex,px参数,基于这个命令可实现redis分布式锁。
nx:当key不存在时可以写入,只能新建,与xx互斥
xx:当key存在时可以写入,只能更新,与nx互斥
ex:设置过期时间 单位s,与px互斥
px: 设置过期时间 单位ms,与ex互斥
key-list
简单的字符串列表,按照插入顺序排序。你可以添加/弹出一个元素到列表的头部(左边)或者尾部(右边)。可以用 help @list查出所有相关的命令,也可以去redis官网查看具体的说明:https://redis.io/commands/?group=list
- 既可以是队列,也可以是栈。队列的实用场景不多,因为更好实现队列功能的有MQ,用redis实现队列的比较少,但是游戏的全服/跨服匹配系统是可以用redis队列实现的。
key-hash
是一个 string 类型的 field(字段) 和 value(值) 的映射表,可以用 help @hash查出所有相关的命令,也可以去redis官网查看具体的说明:https://redis.io/commands/?group=hash
- hash类型可以有效的把一个对象的信息存储起来,比如张三[姓名:张三,年龄:男,职业:法外狂徒],如果用string类型存储,则对象的信息就分散开了,而用hash存的话就可以有效的聚合起来。典型的hash类型的实用场景是session:key是sessionId,field是attributeKey,value是attributeValue。当然如果要缓存mysql的数据,hash类型也是不二之选
- 选择hash类型,而不选择string,除了可以聚合数据之外,还可以减少key的数量,因为key上除了存储key的名字外,还需要存储过期时间等信息,这加大了存储空间
key-set
Set 是 String 类型的无序集合。集合成员是唯一
可以用 help @set查出所有相关的命令,也可以去redis官网查看具体的说明:https://redis.io/commands/?group=set
1、因为set是无序集合且全员唯一,所以用来做抽奖系统非常合适,其原生命令SPOP可直接实现
key-sortedset
sortedset是 String 类型的有序集合。集合成员是唯一
可以用 help @sorted_set查出所有相关的命令,也可以去redis官网查看具体的说明:https://redis.io/commands/?group=sorted-set
- sorted sets里面当items内容大于64的时候同时使用了hash和skiplist两种设计实现。这也会为了排序和查找性能做的优化
添加和删除都需要修改skiplist,所以复杂度为O(log(n))。
但是如果仅仅是查找元素的话可以直接使用hash,其复杂度为O(1)
其他的range操作复杂度一般为O(log(n))
如果是小于64的时候,因为是采用了ziplist的设计,其时间复杂度为O(n) - sorted sets的实际典型场景有:排行榜,统计