redis数据结构命令

1.全局命令
1.1 查看说有键
keys *
1.2 查看键的总数
dbsize
1.3 检查键是否存在
exists key
如果键存在则返回1,不存在则返回0
1.4 删除键
del key
返回结果为成功删除键的个数,假设删除一个不存在的键,就会返回 0
同时del命令可以支持删除多个键
1.5 键过期
expire key seconds
Redis支持对键添加过期时间,当超过过期时间后,会自动删除键,例 如为键hello设置了10秒过期时间
ttl命令会返回键的剩余过期时间,它有3种返回值:
大于等于0的整数: 键剩余的过期时间
-1: 键没设置过期时间
-2:键不存在
通过ttl命令观察键hello的剩余过期时间
1.6 查看键的数据结构类型
type key
3. 数据类型—字符串
3.1 常用命令
1)设置值
set key value [ex seconds] [px milliseconds] [nx|xx]
例: set hello world

set命令有几个选项:
ex seconds: 为键设置秒级过期时间
px milliseconds: 为键设置毫秒级过期时间
nx : 键必须不存在,才可以设置成功,用于添加
xx: 与nx相反,键必须存在,才可以设置成功,用于更新

除了set选项,Redis还提供了setex和setnx两个命令:
setex key seconds value
setnx key value
它们的作用和ex和nx选项是一样的
2)获取值
get key
如果要获取的键不存在,则返回nil(空)

3)批量设置值
mset key value [key value …]
下面操作通过mset命令一次性设置4个键值对:
127.0.0.1:6379> mset a 1 b 2 c 3 d 4

mget key [key …]
下面操作批量获取了键a、b、c、d的值:
127.0.0.1:6379> mget a b c d
如果有些键不存在,那么它的值为nil(空),结果是按照传入键的顺序返回,
批量操作命令可以有效提高开发效率,假如没有mget这样的命令,要执 行n次get命令

5)计数
incr命令用于对值做自增操作,返回结果分为三种情况:
·值不是整数,返回错误。
·值是整数,返回自增后的结果。
·键不存在,按照值为0自增,返回结果为1。

除了incr命令,Redis提供了decr(自减)、incrby(自增指定数字)、 decrby(自减指定数字)、incrbyfloat(自增浮点数)、
3.2 不常用命令
1)追加值
append key value
append可以向字符串尾部追加值,例如:
127.0.0.1:6379> get key
“redis”
127.0.0.1:6379> append key world
(integer) 10
127.0.0.1:6379> get key
“redisworld”

2)字符串长度
strlen key

3)设置并返回原值
getset key value
getset和set一样会设置值,但是不同的是,它同时会返回键原来的值
127.0.0.1:6379> getset hello world
(nil)
127.0.0.1:6379> getset hello redis
“world”

4)设置指定位置的字符
setrange key offeset value
例:
127.0.0.1:6379> set redis pest
OK
127.0.0.1:6379> setrange redis 0 b
(integer) 4
127.0.0.1:6379> get redis
“best”

5)获取部分字符串
getrange key start end
start和end分别是开始和结束的偏移量,偏移量从0开始计算,例如下面操作获取了值best的前两个字符
127.0.0.1:6379> getrange redis 0 1
“be”
4.哈希
4.1命令
1)设置值
hset key field value
127.0.0.1:6379> hset user:1 name tom
(integer) 1
如果设置成功会返回1,反之会返回0。此外Redis提供了hsetnx命令,它 们的关系就像set和setnx命令一样,只不过作用域由键变为field。

  1. 获取值
    hget key field
    如果键或field不存在,会返回nil

3)删除field
hdel key field [field …]

4)计算field个数
hlen key

5)批量设置或获取field-value
hmget key field [field …]
hmset key field value [field value …]
hmset和hmget分别是批量设置和获取field-value,hmset需要的参数是key和多对field-value,
hmget需要的参数是key和多个field
127.0.0.1:6379> hmset user:1 name mike age 12 city tianjin
OK
127.0.0.1:6379> hmget user:1 name city
1) “mike”
2) “tianjin”

6)判断field是否存在
hexists key field
例如,user:1包含name域,所以返回结果为1,不包含时返回0:
127.0.0.1:6379> hexists user:1 name
(integer) 1

7)获取所有field
hkeys key
hkeys命令应该叫hfields更为恰当,它返回指定哈希键所有的field,例如:
127.0.0.1:6379> hkeys user:1
1) “name”
2) “age”
3) “city”

8)获取所有value
hvals key
下面操作获取user: 1全部value:
127.0.0.1:6379> hvals user:1
1) “mike”
2) “12”
3) “tianjin”

9)获取所有的field-value
hgetall key
127.0.0.1:6379> hgetall user:1
1) “name”
2) “mike”
3) “age”
4) “12”
5) “city”
6) “tianjin”
10)hincrby hincrbyfloat
hincrby key field
hincrbyfloat key field
hincrby和hincrbyfloat,就像incrby和incrbyfloat命令一样,但是它们的作用域是filed。

11)计算value的字符串长度
hstrlen key field
5.列表
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
5.1 命令
1)从右边插入元素
rpush key value [value …]
下面代码从右向左插入元素c,b,a
rpush listkey c b a

lrange 0 -1 命令可以从左到右获取列表的所有元素:
127.0.0.1:6379> lrange listkey 0 -1
1) “c”
2) “b”
3) “a”

2)从左边插入元素
lpush key value [value …]
使用方法和rpush相同,只不过从左侧插入

3)向某个元素前或者后插入元素
linsert key before|after pivot value
linsert命令会从列表中找到pivot元素,在其前(before)或者后(after)插入一个新的元素value,例如下面操作会在列表的元素b前插入java:
127.0.0.1:6379> linsert listkey before b java
(integer) 4
127.0.0.1:6379> lrange listkey 0 -1
1) “c”
2) “java”
3) “b”
4) “a”

4)查找
获取指定范围内的元素列表
lrange key start end
lrange操作会获取指定范围所有的元素。索引下标有两个特定:
第一,索引下标从左到右分别别是0到N-1,但是从右到左分别是-1到-N
第二,lrange中的end选项包含了自身,这个和很多编程语言不包含end不太相同
127.0.0.1:6379> lrange listkey 1 3
1) “java”
2) “b”
3) “a”

获取列表指定索引下标的元素
lindex key index
例如当前列表最后一个元素为a:
127.0.0.1:6379> lindex listkey -1
“a”

获取列表长度
llen key

5)删除
5.1从列表左侧弹出元素
lpop key
如下操作将列表最左侧的元素c会被弹出,弹出后列表变为java,b,a
127.0.0.1:6379>t lpop listkey
“c”
127.0.0.1:6379> lrange listkey 0 -1
1) “java” 2) “b” 3) “a”

5.2从列表右侧弹出
rpop key

5.3删除指定元素
lrem key count value
lrem 命令会从列表中找到等于value的元素进行删除,根据count的不同分为三种情况:
count>0 从左到右,删除最多count个元素
count<0 从右到左,删除最多count绝对值个元素
count=0 删除所有

5.4 按照索引范围修剪列表
ltrim key start end

6)修改指定索引下标的元素
lset key index newValue
127.0.0.1:6379> lset listkey 2 python
OK
127.0.0.1:6379> lrange listkey 0 -1
1) “java” 2) “b” 3) “python”

7)阻塞操作
阻塞式弹出如下:
blpop key [key …] timeout
brpop key [key …] timeout
blpop和brpop是lpop和rpop的阻塞版本,它们除了弹出方向不同,使用 方法基本相同,所以下面以brpop命令进行说明,brpop命令包含两个参数:
·key[key…]:多个列表的键。
·timeout:阻塞时间(单位:秒)。
1)列表为空:如果timeout=3,那么客户端要等到3秒后返回,如果 timeout=0,那么客户端一直阻塞等下去:
127.0.0.1:6379> brpop list:test 3
(nil) (3.10s)
127.0.0.1:6379> brpop list:test 0
…阻塞…
如果此期间添加了数据element1,客户端立即返回:
127.0.0.1:6379> brpop list:test 3
1) “list:test” 2) “element1” (2.06s)

2)列表不为空:客户端会立即返回
127.0.0.1:6379> brpop list:test 0
1) “list:test” 2) “element1”
7.集合
集合中不允许有重复元素,并且集合中的元素是无序的,不能通过索引下标获取元素,一个集合最多可以存储2^32-1个元素
在这里插入图片描述
7.1集合内操作
1 ) 添加元素
sadd key element [element …]
返回结果为添加成功的元素个数,例如:
127.0.0.1:6379> exists myset
(integer) 0
127.0.0.1:6379> sadd myset a b c
(integer) 3
127.0.0.1:6379> sadd myset a b
(integer) 0

2)删除元素
srem key element [element …]
返回结果为成功删除元素个数,例如:

3)计算元素个数
scard key
scard的时间复杂度为O(1),它不会遍历集合所有元素,而是直接用Redis内部的变量,例如:
127.0.0.1:6379> scard myset
(integer) 1

4)判断元素是否在集合中
sismember key element
如果给定元素element在集合内返回1,反之返回0,例如:
127.0.0.1:6379> sismember myset c
(integer) 1

5)随机从集合返回指定个数元素
srandmember key [count]
[count]是可选参数,如果不写默认为1,例如:
127.0.0.1:6379> srandmember myset 2
1) “a” 2) “c”
127.0.0.1:6379> srandmember myset
“d”

6)从集合中随机弹出元素
spop key
spop操作可以从集合中随机弹出一个元素,例如下面代码是一次spop
127.0.0.1:6379> spop myset
“c”
127.0.0.1:6379> smembers myset
1) “d” 2) “b” 3) “a”
需要注意的是Redis从3.2版本开始,spop也支持[count]参数。

            srandmember和spop都是随机从集合选出元素,两者不同的是spop命令 执行后,元素会从集合中删除,而srandmember不会。

7)获取所有元素
smembers key
下面代码获取集合myset所有元素,并且反回结果是无序的:
127.0.0.1:6379> smembers myset
1) “d” 2) “b” 3) “a”

            smembers和range,hgetall都属于比较重的命令,如果元素过多存在阻塞Redis的可能性,这个时候可以使用sscan来完成

7.2集合间操作
7.2.1 求多个集合的交集
sinter key [key …]
7.2.2 求多个集合的并集
suinon key [key …]
7.2.3 求多个集合的差集
sdiff key [key …]
在这里插入图片描述
7.2.4 将交集,并集,差集的结果保存
sinterstore destination key [key …]
suionstore destination key [key …]
sdiffstore destination key [key …]
集合间的运算在元素较多的情况下会比较耗时,所以redis提供了上面三个命令(原命令+store)将集合间交集,并集,差集保存在destination key中
例如下面操作将user:1:follow和user:2:follow两个集 合的交集结果保存在user:1_2:inter中,user:1_2:inter本身也是集合类型:
127.0.0.1:6379> sinterstore user:1_2:inter user:1:follow user:2:follow
(integer) 2
127.0.0.1:6379> type user:1_2:inter
set
127.0.0.1:6379> smembers user:1_2:inter
1) “it” 2) “sports”
9.有序集合

9.1 集合内命令
9.1.1 添加成员
zadd key score member [score member …]
下面操作向有序集合user:ranking添加用户tom和他的分数251:
127.0.0.1:6379> zadd user:ranking 251 tom
(integer) 1
返回结果代表成功添加成员个数:
127.0.0.1:6379> zadd user:ranking 1 kris 91 mike 200 frank 220 tim 250 martin
(integer) 5

Redis3.2为zadd命令添加了nx、xx、ch、incr四个选项:
·nx:member必须不存在,才可以设置成功,用于添加。
·xx:member必须存在,才可以设置成功,用于更新。
·ch:返回此次操作后,有序集合元素和分数发生变化的个数
·incr:对score做增加,相当于后面介绍的zincrby。
·有序集合相比集合提供了排序字段,但是也产生了代价,zadd的时间 复杂度为O(log(n)),sadd的时间复杂度为O(1)。

9.1.2计算成员个数
zcard key

9.1.3 计算某个成员的分数
zscore key member
tom的分数为251,如果成员不存在则返回nil:
127.0.0.1:6379> zscore user:ranking tom
“251”
127.0.0.1:6379> zscore user:ranking test
(nil)

9.1.4 计算成员的排名
zrank key member
zrevrank key member
zrank是分数从低到高返回排名,zrevrank反之
例如: 计算tom正数第几名 倒数又是第几名
127.0.0.1:6379> zrank user:ranking tom
(integer) 5
127.0.0.1:6379> zrevrank user:ranking tom
(integer) 0

9.1.5删除成员
zrem key member [member …]
返回结果为成功删除的个数

9.1.6 增加成员的分数
zincrby key increment member
下面操作给tom增加了9分,分数变为了260分:
127.0.0.1:6379> zincrby user:ranking 9 tom
“260”

9.1.7 返回指定排名范围的成员
zrange key start end [withscores]
zrevrange key start end [withscores]
有序集合是按照分值排名的,zrange是从低到高返回,zrevrange反之。 下面代码返回排名最低的是三个成员,如果加上withscores选项,同时会返
回成员的分数:
127.0.0.1:6379> zrange user:ranking 0 2 withscores
1) “kris” 2) “1” 3) “frank” 4) “200” 5) “tim” 6) “220”
127.0.0.1:6379> zrevrange user:ranking 0 2 withscores
1) “tom” 2) “260” 3) “martin” 4) “250” 5) “tim” 6) “220”

9.1.8 返回指定分数范围的成员
zrangebyscore key min max [withscores] [limit offset count]
zrevrangebyscore key max min [withscores] [limit offset count]
其中zrangebyscore按照分数从低到高返回,zrevrangebyscore反之。例如下面操作从低到高返回200到221分的成员,withscores选项会同时返回每个成员的分数。[limit offset count]选项可以限制输出的起始位置和个数:
127.0.0.1:6379> zrangebyscore user:ranking 200 +inf withscores
1) “frank” 2) “200” 3) “tim” 4) “220”
127.0.0.1:6379> zrevrangebyscore user:ranking 221 200 withscores
1) “tim” 2) “220” 3) “frank” 4) “200”
同时min和max还支持开区间(小括号)和闭区间(中括号), -inf和+inf分布代表无限小和无限大:
127.0.0.1:6379> zrangebyscore user:ranking (200 +inf withscores
1) “tim” 2) “220” 3) “martin” 4) “250” 5) “tom” 6) “260”

9.1.9 返回指定分数范围成员个数
zcount key min max
下面操作返回200到221分的成员的个数:
127.0.0.1:6379> zcount user:ranking 200 221
(integer) 2

9.1.10 删除指定排名内的升序元素
zremrangebyrank key start end
下面操作删除第start到第end名的成员
127.0.0.1:6379> zremrangebyrank user:ranking 0 2
(integer) 3

9.1.11 删除指定分数范围的成员
zremrangebyscore key min max
下面操作将250分以上的成员全部删除,返回结果为成功删除的个数:
127.0.0.1:6379> zremrangebyscore user:ranking (250 +inf
(integer) 2

9.2集合间的操作

在这里插入图片描述

127.0.0.1:6379> zadd user:ranking:1 1 kris 91 mike 200 frank 220 tim 250 martin
251 tom
(integer) 6
127.0.0.1:6379> zadd user:ranking:2 8 james 77 mike 625 martin 888 tom
(integer) 4

9.2.1 交集
zinterstore destination numkeys key [key …] [weights weight [weight …]] [aggregate sum|min|max]
参数说明:
·destination:交集计算结果保存到这个键。
·numkeys:需要做交集计算键的个数。
·key[key…]:需要做交集计算的键。
·weights weight[weight…]:每个键的权重,在做交集计算时,每个键中 的每个member会将自己分数乘以这个权重,每个键的权重默认是1。
·aggregate sum|min|max:计算成员交集后,分值可以按照sum(和)、 min(最小值)、max(最大值)做汇总,默认值是sum。
下面操作对user:ranking:1和user:ranking:2做交集,weights和 aggregate使用了默认配置,可以看到目标键user:ranking:1_inter_2对分值 做了sum操作:
127.0.0.1:6379> zinterstore user:ranking:1_inter_2 2 user:ranking:1 user:ranking:2
(integer) 3
127.0.0.1:6379> zrange user:ranking:1_inter_2 0 -1 withscores
1) “mike” 2) “168” 3) “martin” 4) “875” 5) “tom” 6) “1139”
如果想让user:ranking:2的权重变为0.5,并且聚合效果使用max,可以执行如下操作:
127.0.0.1:6379> zinterstore user:ranking:1_inter_2 2 user:ranking:1 user:ranking:2 weights 1 0.5 aggregate max
(integer) 3
127.0.0.1:6379> zrange user:ranking:1_inter_2 0 -1 withscores
1) “mike” 2) “91” 3) “martin” 4) “312.5” 5) “tom” 6) “444”

9.2.2并集
zunionstore destination numkeys key [key …] [weights weight [weight …]] [aggregate sum|min|max]
该命令的所有参数和zinterstore是一致的,只不过是做并集计算,例如 下面操作是计算user:ranking:1和user:ranking:2的并集,weights和 aggregate使用了默认配置,可以看到目标键user:ranking:1_union_2对分值 做了sum操作:
127.0.0.1:6379> zunionstore user:ranking:1_union_2 2 user:ranking:1 user:ranking:2
(integer) 7
127.0.0.1:6379> zrange user:ranking:1_union_2 0 -1 withscores
1) “kris” 2) “1” 3) “james” 4) “8” 5) “mike” 6) “168” 7) “frank” 8) “200” 9) “tim” 10) “220” 11) “martin” 12) “875” 13) “tom” 14) “1139”

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值