前言
在正式介绍5种数据结构之前,了解一下Redis的一些全局命令、数据结构和内部编码等。
全局命令
-
查看所有键
keys * —o(n) -
键总数
dbsize —o(1) -
检查键是否存在
exists key—o(1)如果键存在则返回1,不存在则返回0 -
删除键
del key [key ...]—o(1)通用所有的数据结果 -
键过期
expire key seconds 设置过期时间
ttl key 剩余过期时间,它有3种返回值:(1)大于等于0的整数:键剩余的过期时间。(2)-1:键没设置过期时间。(3)-2:键不存在 -
键的数据结构类型
type key
5种数据结构
字符串
字符串类型是Redis最基础的数据结构,字符串类型的值实际可以是字符串(简单的字符串、复杂的字符串(例如JSON、XML)、数字(整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能超过512MB。
字符串数据结构.png * 命令(1)设置值
set key value [ex seconds] [px milliseconds] [nx|xx]
set hello world
OK
set命令有几个选项:
·ex seconds:为键设置秒级过期时间。
·px milliseconds:为键设置毫秒级过期时间。
·nx:键必须不存在,才可以设置成功,用于添加。
·xx:与nx相反,键必须存在,才可以设置成功,用于更新。
除了set选项, Redis还提供了setex和setnx两个命令:
setex key seconds value
setnx key value
(2)获取值
get key
127.0.0.1:6379> get hello
"world"
(3)批量设置/获取值
mset/mget key value [key value ...]
(4)计算相关
incr key (自增)、decr(自减)、 incrby(自增指定数字)、decrby(自减指定数字)、 incrbyfloat(自增浮点数)
(5)不常用命令
append key value(追加)、strlen key(字符长度)、getset key value(设置并返回原值)、setrange key offeset value(设置指定位置的字符)等
-
内部编码
(1)int: 8个字节的长整型。
(2)embstr:小于等于39个字节的字符串。
(3)raw:大于39个字节的字符串 -
典型使用场景
(1)缓存功能
(2)计数
(3)共享Session
(4)限速等
哈希
哈希类型是指键值本身又是一个键值对结构,形如value={{field1, value1}, ...{fieldN,valueN}} 字符串和哈希类型对比.png-
命令
(1)设置/获取值
hset/hget key field value
(2)删除field
hdel key field [field ...]
(3)批量设置或获取field-value
hmget key field [field ...]/hmset key field value [field value ...]
(4)判断field是否存在
hexists key
(5)获取所有field/获取所有value
hkeys/ hvals key
(6)其他等
hgetall key(获取所有的field-value)、hincrby key field,hincrbyfloat key field(像incrby和incrbyfloat命令一样,但是它们的作用域是filed)、hstrlen key field(计算长度)等
哈希类型命令的时间复杂度.png -
内部编码
(1)ziplist(压缩列表):当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个)、同时所有值都小于hash-max-ziplist-value配置(默认64字节时, Redis会使用ziplist作为哈希的内部实现, ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
(2)hashtable(哈希表):当哈希类型无法满足ziplist的条件时, Redis会使用hashtable作为哈希的内部实现,因为此时ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1) -
使用场景
(1)缓存对象信息,省去string序列化消耗
(2)哈希类型是稀疏的
列表
列表( list)类型是用来存储多个有序且重复的字符串。
-
命令
(1)添加操作
rpush key value [value ...](右边添加)、lpush key value [value ...](左边添加)、linsert key before|after pivot value(向某个元素前或者后插入元素)
(2)查询
lrange key start end(指定范围内的元素列表)、lindex key index(列表指定索引下标的元素)、llen key(列表长度)
(3)删除
lpop key(左边删除)、rpop key(右边删除)、lrem key count value(删除指定元素)
(4)修改
lset key index newValue
列表命令时间复杂度.png -
内部编码
(1)ziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置(默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节), Redis会选用ziplist来作为列表的内部实现来减少内存的使用。
(2)linkedlist(链表):当列表类型无法满足ziplist的条件时, Redis会使用linkedlist作为列表的内部实现。 -
使用场景
(1)消息队列
(2)文章列表
集合
集合( set)类型也是用来保存多个的字符串元素,但和列表类型不一样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素。 集合类型.png-
命令
(1)集合内操作
sadd key element [element ...](添加元素)、srem key element [element ...](删除元素)、scard key(计算个数)、sismember key element(判断是否在集合中)、srandmember key [count](随即取指定元素)、spop key(随即弹出元素)、smembers key(获取所有元素)
(2)集合间操作
sinter key [key ...](交集)、suinon key [key ...](并集)、sdiff key [key ...](差集)
集合常用命令时间复杂度.png -
内部编码
(1)intset(整数集合):当集合中的元素都是整数且元素个数小于set-maxintset-entries配置(默认512个)时, Redis会选用intset来作为集合的内部实
现,从而减少内存的使用。
(2)hashtable(哈希表):当集合类型无法满足intset的条件时, Redis会使用hashtable作为集合的内部实现。 -
使用场景
(1)打标签。
(2)计算共同爱好用户等。
有序集合
有序集合相对于哈希、列表、集合来说会有一点点陌生,但既然叫有序集合,那么它和集合必然有着联系,它保留了集合不能有重复成员的特性,但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下标作为排序依据不同的是,它给每个元素设置一个分数( score)作为排序的依据。
-
命令
(1)集合内操作
zadd key score member [score member...](添加元素)、zscore key member(计算某个成员的分数)、zcard key(计算个数)、zrank/zrevrank key member(排名)等
(2)集合间操作
zinterstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max](交集)、zunionstore destination numkeys key [key ...] [weights weight [weight ...]] [aggregate sum|min|max](并集)
这个命令参数较多,下面分别进行说明:
(1)destination:交集计算结果保存到这个键。
(2)numkeys:需要做交集计算键的个数。
(3)key[key...]:需要做交集计算的键。
(4)weights weight[weight...]:每个键的权重,在做交集计算时,每个键中的每个member会将自己分数乘以这个权重,每个键的权重默认是1。
(5)aggregate sum|min|max:计算成员交集后,分值可以按照sum(和)、min(最小值)、 max(最大值)做汇总,默认值是sum。
eg:
127.0.0.1:6379> zinterstore user:ranking:1_inter_2 2 user:ranking:1
user:ranking:2
(integer) 3
有序集合命令的时间复杂度.png
-
内部编码
(1)ziplist(压缩列表):当有序集合的元素个数小于zset-max-ziplistentries配置(默认128个),同时每个元素的值都小于zset-max-ziplist-value配置(默认64字节)时, Redis会用ziplist来作为有序集合的内部实现,ziplist可以有效减少内存的使用。
(2)skiplist(跳跃表):当ziplist条件不满足时,有序集合会使用skiplist作为内部实现,因为此时ziplist的读写效率会下降。 -
使用场景
(1)添加用户赞数。
(2)取消用户赞。
(3)展示获取赞数最多的十个用户。
(4)展示用户信息以及用户分数。
列表、集合和有序集合三者的异同点.png
注意事项:命令遍历所有的键,分别是keys和scan
网友评论