一文了解Redis常用命令

2022-09-13 00:16:49 浏览数 (1)

前言

本文包括Redis中常用的一些命令,包括针对所有的键相关的命令,以及5种常用数据类型:字符串、哈希、列表、集合以及有序集合的一些命令。

鉴于个人水平有限,文章中若有不对之处,烦请大家留言指正。

键相关

查看所有的键

keys会遍历所有的键,它的时间复杂度是O(n),因此当Redis保存了大量的键时,这个命令会非常耗时,因此生产环境下禁止使用该命令。

代码语言:txt复制
keys *
代码语言:txt复制
//初始化数据
study:0>set zhangsan 20
"OK"
study:0>get zhangsan
"20"
study:0>set lisi 25
"OK"
study:0>set wangwu 30
"OK"
//使用
study:0>keys *
 1)  "lisi"
 2)  "zhangsan"
 3)  "wangwu"

keys命令也支持模糊匹配,比如我们想获取所有以zhang开头的键,可以这样写:

代码语言:txt复制
keys zhang*
代码语言:txt复制
study:0>keys zhang*
 1)  "zhangsan"

获取键的总数

代码语言:txt复制
dbsize
代码语言:txt复制
study:0>dbsize
"3"

dbsize命令在计算键总数时不会遍历所有的键,而是直接获取Redis内置的键总数变量,所以dbsize命令的时间复杂度是O(1)

检查键是否存在

代码语言:txt复制
exists key

这个命令返回1或者0,1表示键存在,0表示键不存在

代码语言:txt复制
study:0>exists zhangsan
"1"
study:0>exists dalao
"0"

删除键

代码语言:txt复制
del key [key2, key3....]

这个命令返回删除成功的键总数,如果删除的键都不存在,则返回0

代码语言:txt复制
study:0>del zhangsan
"1"
study:0>del dalao
"0"

设置键的过期时间

Redis支持给键设置过期时间,当键过期后,该键会在Redis中被自动删除。

代码语言:txt复制
//初始化键
study:0>set hello world
"OK"
//给键设置50秒的过期时间
study:0>expire hello 50
"1"

设置过期时间之后,我们也可以通过ttl命令返回键的剩余过期时间,ttl命令有3种返回值:

  1. 大于等于0的整数:键的剩余过期时间
  2. -1表示键没有设置过期时间
  3. -2表示键不存在(有可能是最开始就不存在,有可能是键的过期时间到了被自动删除了)
代码语言:txt复制
study:0>ttl hello
"10"
study:0>ttl hello
"3"
study:0>ttl hello
"-2"

键的数据类型

代码语言:txt复制
type key
代码语言:txt复制
study:0>set hello world
"OK"
study:0>type hello
"string"

若key的类型是字符串类型,则返回string。若key的类型是列表类型,则返回list。

若key不存在,则返回none

代码语言:txt复制
study:0>type abc
"none"

字符串类型

设置值

代码语言:txt复制
set key value [ex seconds] [px milliseconds] [nx|xx]
代码语言:txt复制
study:0>set me water76016
"OK"

set命令的选项说明

  • ex seconds:为键设置秒级过期时间
  • px milliseconds:为键设置毫秒级过期时间
  • nx:键必须不存在才能设置成功,用于新增
  • xx:键必须存在才能设置成功,用于更新

其他set命令

Redis提供了setnx和setex两个命令,作用和ex和nx参数是一样的。

代码语言:txt复制
//命令格式
setex key seconds value
setnx key value
代码语言:txt复制
//setex使用范例(设置键为hello,20秒的过期时间)
study:0>setex hello 20 world
"OK"

//setnx使用范例(第一次键不存在设置成功,第二次键已经存在设置失败)
study:0>setnx me water76016
"1"
study:0>setnx me water76016
"0"

获取值

代码语言:txt复制
get key

如果获取的键不存在,则会返回null(空)

代码语言:txt复制
study:0>get me
"water76016"
study:0>get abcd
null

批量设置值

代码语言:txt复制
mset key value [key value ...]
代码语言:txt复制
//mset使用范例
study:0>mset one 1, two 2, three 3
"OK"

批量获取值

代码语言:txt复制
mget key1 [key2 key3]
代码语言:txt复制
//mget使用范例
study:0>mget one two three
 1)  "1,"
 2)  "2,"
 3)  "3"

Redis每次执行时中间需要耗费网络时间,使用批量操作有利用减少网络时间的损耗,但每次放入的批量操作的key不是无节制的,一次太多有可能导致Redis短时间阻塞。

计数

代码语言:txt复制
//key值自增1
incr key

//key值自减1
decr key

//自增指定数字
incrby key increment

//自减指定数字
incrby key decrment

下面以incr命令进行详细说明:

incr命令可以对值进行自增,使用该命令存在3种情况:

  1. 值如果不是整数,返回错误
  2. 值是整数,返回自增后的结果
  3. 键不存在,认为该键的初始化为0,会新增一个键进去,并返回1
代码语言:txt复制
//值不是整数示例
study:0>set hello world
"OK"
study:0>incr hello
"ERR value is not an integer or out of range"
代码语言:txt复制
//值是整数示例
study:0>set me 20
"OK"
study:0>incr me
"21"
代码语言:txt复制
//键不存在示例
study:0>get you
null
study:0>incr you
"1"
study:0>get you
"1"

哈希类型

设置值

代码语言:txt复制
hset key field value

如果设置成功,会返回 1。设置失败会返回0

代码语言:txt复制
//使用示例
study:0>hset user:1 one zhangsan
"1"

获取值

代码语言:txt复制
hget key field
代码语言:txt复制
//使用示例
study:0>hset user:1 one zhangsan
"1"
study:0>hget user:1 one
"zhangsan"

删除field

hdel命令支持同时删除多个field,返回的结果是删除成功的field的个数

代码语言:txt复制
hdel key field [field ...]
代码语言:txt复制
//使用示例
study:0>hdel user:1 one
"1"

批量设置和获取值

代码语言:txt复制
//批量设置值
hmset key field value [field value...]

//批量获取值
hmget key field [field2...]
代码语言:txt复制
//使用示例
study:0>hmset user:2 id 2 name zhangsan age 20
"OK"
study:0>hmget user:2 id name age
 1)  "2"
 2)  "zhangsan"
 3)  "20"

判断field是否存在

代码语言:txt复制
hexists key field
代码语言:txt复制
//使用示例
study:0>hexists user:2 id
"1"
study:0>hexists user:2 school
"0"

获取所有的field

代码语言:txt复制
hkeys key
代码语言:txt复制
//使用示例
study:0>hkeys user:2
 1)  "id"
 2)  "name"
 3)  "age"

获取所有的value

代码语言:txt复制
hvals key
代码语言:txt复制
//使用示例
study:0>hvals user:2
 1)  "2"
 2)  "zhangsan"
 3)  "20"

获取所有的field-value

注意事项:如果获取的值较多,有可能会阻塞Redis。如果获取部分值,可以使用hmget命令。如果一定要获取全部的键值,可以使用hscan命令,该命令会渐进式地获取所有的键值,并不是一次全部获取。

代码语言:txt复制
hgetall key
代码语言:txt复制
//使用示例
study:0>hgetall user:2
 1)  "id"
 2)  "2"
 3)  "name"
 4)  "zhangsan"
 5)  "age"
 6)  "20"

列表类型

Redis中的列表类型有两个特点,分别是:

  1. 列表中的元素是有序的
  2. 列表中的元素是可以重复的

添加元素

添加元素添加成功后,返回的是当前List中元素的总数

从右边添加元素

代码语言:txt复制
rpush key value [value...]
代码语言:txt复制
//添加元素示例
study:0>rpush my_list 1 2 3
"3"

从左边添加元素

代码语言:txt复制
lpush key value[value...]
代码语言:txt复制
//添加元素示例
study:0>lpush my_list 1 2 3
"6"

查找

获取指定范围内的元素

代码语言:txt复制
lrange key start end

注意,索引的下标从左到右分别是:0到N-1,但是从右到左是-1到-N。

代码语言:txt复制
//使用范例
study:0>lrange my_list 0 5
 1)  "3"
 2)  "2"
 3)  "1"
 4)  "1"
 5)  "2"
 6)  "3"

获取指定索引下标的元素

代码语言:txt复制
lindex key index
代码语言:txt复制
//使用示例
study:0>lindex my_list 3
"1"

获取列表长度

代码语言:txt复制
llen key
代码语言:txt复制
//使用示例
study:0>llen my_list
"6"

删除元素

从列表左侧弹出元素

代码语言:txt复制
lpop key
代码语言:txt复制
//使用示例
study:0>lpop my_list
"3"

从列表右侧弹出元素

代码语言:txt复制
rpop key
代码语言:txt复制
//使用示例
study:0>rpop my_list
"3"

删除指定元素

代码语言:txt复制
lrem key count value

lrem命令会从列表中找到等于value的元素进行删除,根据count的不同,可能存在以下3种情况:

  • count > 0。从左到右,删除最多count个元素
  • count < 0。从右到左,删除最多count个元素
  • count = 0。删除所有等于value的元素
代码语言:txt复制
//使用示例
study:0>lpush temp_list 3 3 3 3
"4"
study:0>lrem temp_list 1 3
"1"
study:0>lrem temp_list -1 3
"1"
study:0>lrem temp_list 0 3

保留指定索引范围的元素列表

代码语言:txt复制
ltrim key start end

列表的下标从0开始,这个命令会保留下标从start到end的所有元素。

代码语言:txt复制
//使用示例
study:0>lpush temp_list 1 2 3 4 5
"5"
study:0>ltrim temp_list 2 3
"OK"

修改元素

代码语言:txt复制
lset key index newValue
代码语言:txt复制
//使用示例
//修改列表的第一个元素为10
study:0>lset temp_list 0 10
"OK"
//查看列表的第一个元素是否为10,看是否修改成功
study:0>lindex temp_list 0
"10"
//设置的索引超过列表范围会报错
study:0>lset temp_list 10 100
"ERR index out of range"

阻塞操作

代码语言:txt复制
blpop key [key...] timeout
brpop key [key...] timeout

key key...表示可以同时传入多个键进行处理

timeout表示阻塞的超时时间。

blpop是从左弹出元素,brpop是从右弹出元素,两个除了弹出方向不同,其余基本相同。下面主要以brpop进行说明:

  1. 当列表为空的时候,加入timeout=3,那么客户端会等待3秒后进行返回。如果timeout=0。那么客户端会一直等待下去。
  2. 当列表不为空的时候,会立即返回相应的值
  3. 如果是多个键,那么brpop会从左到右遍历键,一旦某个键有元素,则立即返回
  4. 如果是多个客户端同时执行相同的阻塞命令,那么最先执行的那个客户端,可以获取到对应的值

集合类型

集合也是用来保存多个元素的,但其中的元素是无序的,并且不能够重复。

添加元素

代码语言:txt复制
sadd key element[element...]

返回结果是添加成功的元素个数

代码语言:txt复制
//使用示例
study:0>sadd temp_set 1 2 3 4 5
"5"

删除元素

代码语言:txt复制
srem key element [element...]

返回结果为成功删除元素的个数

代码语言:txt复制
//使用示例
study:0>sadd temp_set 1 2 3 4 5
"5"
study:0>srem temp_set 2 3
"2"

计算元素个数

代码语言:txt复制
scard key
代码语言:txt复制
//使用示例
study:0>scard temp_set
"3"

判断元素是否在集合中

代码语言:txt复制
sismember key element
代码语言:txt复制
//使用示例
study:0>sismember temp_set 3
"0"
study:0>sismember temp_set 1
"1"

随机返回元素

代码语言:txt复制
srandmember key [count]

srandmember命令会随机从集合中返回count个元素,如果count不填写,则默认为1

代码语言:txt复制
//使用示例
study:0>srandmember temp_set 2
 1)  "5"
 2)  "1"
study:0>srandmember temp_set
"1"

随机弹出元素

代码语言:txt复制
spop key

spop会随机从集合中弹出一个元素,并把该元素从集合中删除

代码语言:txt复制
//使用示例
study:0>spop temp_set
"1"

获取集合所有元素

代码语言:txt复制
smembers key
代码语言:txt复制
study:0>smembers temp_set
 1)  "4"
 2)  "5"

求多个集合的交集

代码语言:txt复制
sinter key [key2 key3...]

交集:顾名思义,就是每个集合所共有的元素。如果入参是2个集合,那么就是2个集合共同拥有的元素。如果入参是3个集合,那么入参就是3个集合共同拥有的元素

代码语言:txt复制
//使用示例
//集合one中具有元素1,one_two中具有元素1和2,three中具有元素3
study:0>sadd one 1
"1"
study:0>sadd one_two 1 2
"2"
study:0>sadd three 3
"1"
//取交集(one one_two three三个集合没有共同元素,返回空)
study:0>sinter one one_two three
//取交集(one two中具有共同元素,返回)
study:0>sinter one one_two
 1)  "1"

求多个集合的并集

代码语言:txt复制
sunion key [key2 key3...]

并集,顾名思义,就是每个集合所有的元素合并起来进行返回。示例和取交集类似,这里不再过多赘述。

求多个集合的差集

代码语言:txt复制
sdiff key [key2 key3...]

差集,就是取自身有,但其他人没有的那部分元素。如果传入多个集合,那么就是取自己有,但所有其他人都没有的那部分元素。大家理解意思即可,这里不再过多赘述。

有序集合

有序集合中的元素可以排序,但它并不是按索引下标进行排序,而是给每个元素都指定了一个分数,按照分数来进行排序。

有序集合中的元素不可以重复,但是分数是可以重复的。

添加元素

代码语言:txt复制
zadd key score member [score member...]
代码语言:txt复制
//使用示例
study:0>zadd class_grade 88 xiaoming
"1"

计算成员个数

代码语言:txt复制
zscard key
代码语言:txt复制
//使用示例
study:0>zcard class_grade
"1"

获取某个成员的分数

代码语言:txt复制
zscore key member
代码语言:txt复制
//使用示例
study:0>zscore class_grade xiaoming
"88"

计算成员的排名

代码语言:txt复制
//从低到高排名
zrank key member

//从高到低排名
zrerank key member

删除成员

代码语言:txt复制
zrem key member [member...]

增加某个成员的分数

代码语言:txt复制
zincrby key incrment member

0 人点赞