Redis基础命令汇总,看这篇就够了

打印 上一主题 下一主题

主题 602|帖子 602|积分 1806

本文首发于公众号:Hunter后端
原文链:Redis基础命令汇总,看这篇就够了
本篇笔记将汇总 Redis 基础命令,包括几个常用的通用命令,和各个类型的数据的操作,包括字符串、哈希、列表、集合、有序集合等在内的基本操作。
以下是本篇笔记目录:

  • 通用命令
  • 字符串命令
  • 哈希命令
  • 列表命令
  • 集合命令
  • 有序集合命令
1、通用命令

keys *

返回所有 key,可以使用通配符来查询。
  1. # 查看所有 key
  2. keys *
  3. # 查看以 hel 开头的 key
  4. keys hel*
  5. # 查看 ph + 一个字符
  6. keys ph?
复制代码
注意:一般不要使用 keys 这个操作,Redis 是单线程,执行之后如果耗时过久会造成阻塞。
dbsize

统计当前 db key 的总数:
  1. select 1
  2. dbsize
复制代码
exists key

查看某个 key 是否存在,存在则返回 1,不存在返回 0
  1. exists key
  2. # 1
复制代码
del key [key ...]

删除一个或多个 key:
  1. # 删除 key
  2. del key1
  3. # 删除 key1、key2
  4. del key1 key2
复制代码
成功删除 n 个 key,返回整数 n
expire key n

给 key 设置 n 秒后过期
假设给 key 为 hello 的数据设置 3 秒后过期:
  1. expire hello 3
复制代码
三秒后,我们尝试获取 hello 数据,就会发现返回空了。
  1. # after 3 seconds ...
  2. get hello
复制代码
ttl key

查看 key 剩余过期时间,假设我们前面设置的过期时间很长,在数据未过期的时候使用这个命令:
  1. ttl hello
复制代码
就会返回 hello 剩余的过期时间。
persist key

在 key 还未过期的时候,使用这个命令,可以去除 key 上的过期时间:
  1. persist hello
复制代码
type key

返回 key 的类型,后面我们会介绍 Redis 的几种基本数据类型。
Redis 几种数据类型是:字符串、哈希、列表、集合、有序集合
2、字符串命令

在 Redis 中存储字符串,就是一个 key-value 的结构。
其中,value 可以是字符串,也可以是数字,对于数字 Redis 会自动识别,且可以使用一些字符串没有的操作,比如增加、减少等。
但在设置和存储的过程中,字符串和数字都是一样的使用方式。
1.字符串的增删改查

字符串的增删改查操作是 get、set、del。其中 set 操作可以是增加数据,也可以是更新数据。
接下来我们对 key 为 hello 的数据进行操作:
  1. # 增加 hello 的值为 world
  2. set hello world
  3. # 获取 hello 的值
  4. get hello
  5. # 更新 hello 的值为 "new world"
  6. set hello "new world"
  7. # 删除 hello
  8. del hello
复制代码
2.set 操作数据的几种用法

前面介绍的 set,如果存在则更新,不存在则增加,如果我们想要实现存在 key 就更新,以及不存在 key 则创建的逻辑,可以如此操作:
不存在则设置,存在则不操作

setnx 可以实现我们这个逻辑:
  1. if not exists:
  2.     insert
  3. else:
  4.     pass
复制代码
比如我们执行:
  1. del a
  2. setnx a 1
  3. setnx a 2
复制代码
上面的操作之后,尽管我们的 setnx 执行了两遍,但前面已经设置过了 a 的值,所以第二个操作不会执行了。
存在则更新,不存在则不操作

set key value xx,注意,xx 是固定用法,比如我们想 a 的值如果存在于系统,则更新 a 的值为 2,不存在的话则不操作,可以如下:
  1. set a 2 xx
复制代码
那么如果系统之前没有 a 的值存在,那么执行这个命令之后,系统也不会有 a 这个 key。
3.整数的操作

对于字符串类型的数据,可以存储字符串也可以存储整数,对于整数,有一些额外的操作,比如自增1,自减1,自增n,自减n。
incr 自增 1
  1. # 为 a 初始化设置值为 3
  2. set a 3
  3. # 进行自增 1 的操作
  4. incr a
复制代码
decr 自减 1
  1. decr a
复制代码
注意:如果 incr 和 decr 的 key 之前在 Redis 中不存在,那么系统会默认先 set key 0,然后进行自增自减的操作
incrby 自增 n
  1. # 对 a 进行自增 5
  2. incrby a 5
复制代码
decrby 自减 n
  1. # 对 a 进行自减 5
  2. decrby a 5
复制代码
4.小数的操作

对应于整数,小数也可以进行自增的操作
incrbyfloat 自增某个小数
  1. incrbyfloat a 3.4
复制代码
但是,并没有相应的小数数自减操作,但是我们可以通过在 value 加负号来表示自减操作:
  1. incrbyfloat a -3.4
复制代码
5.字符串的范围操作

对于一个字符串,比如我们设置:
  1. set a "this is a string"
复制代码
getrange

我们通过 get 可以获取 a 的全量字符串,也可以通过 getrange 下标来指定范围获取:
  1. getrange a 1 3
复制代码
表示获取从 1 开始到 3 之间的字符串,下标从 0 开始。
setrange

也可以通过下标设置字符串内容:
  1. setrange a 5 xxxx
复制代码
上面的操作表示将 a 字符串在第 6 个的位置的字符串替换成 xxxx,那么 a 的结果应该是:
  1. get a
  2. # "this xxxx string"
复制代码
6.字符串的字符操作

getset

先获取 key 的 value,然后对 key 设置新的 value:
  1. getset a "new value"
复制代码
append

将 value 追加到 key 的旧 value 的末尾:
  1. set a "abc"
  2. append a "def"
  3. get a
  4. # "abcdef"
复制代码
strlen

获取字符串的长度:
  1. strlen a
  2. # 6
复制代码
7.批量操作

mget

批量获取 key 列表的值,比如我们有 a,b,c 三个 key,我们想同时返回三个 key 的数据:
  1. mget a b c
  2. # 以下是返回:
  3. #1) "abcdef"
  4. #2) "1"
  5. #3) "world"
复制代码
mset

批量设置 key 列表的值,一个 key 后跟一个 value,比如我们设置三个 key,a、b、c 的 value 分别是 1,2,3:
  1. mset a "1" b "2" c "3"
复制代码
3、哈希命令

因为 Redis 存储的数据类型是一个 key-value 的结构,而哈希本身的数据类型也是一个 key-value 的类型,所以哈希数据相当于是一个嵌套的类型,这个地方需要了解清楚它的概念。
在下面的例子中,我们将 Redis 中的 key 称为 key,而哈希中的 key-value 中对应的 key 称为 field 以示区分。
哈希命令的前面都带一个 h,这是哈希命令的一个特点。
接下来,我们以一个例子来介绍哈希命令,我们想要存入一个这样的数据,key 为 student,它有 name,number,rank 三个 field 属性,大致如下:
  1. {
  2.     "student":
  3.         {
  4.             "name": "Hunter",
  5.             "number": "00001",
  6.             "rank": 1
  7.         }
  8. }
复制代码
1.哈希数据的增删改查

这里我们要设置 student 的几个属性值,创建和更新都用 heset:
  1. hset student name "Hunter"
  2. hset student number "00001"
  3. hset student rank 1
复制代码
使用 hget 查询数据:
  1. hget student name
复制代码
使用 hdel 删除数据:
  1. hdel student name
复制代码
如果是直接删除 student 这个 key 呢,直接使用 del:
  1. del student
复制代码
2. hexists 和 hlen

hexists 是用于查看 key 下某个 field 属性是否存在,假设前面的 student 数据没有删除,我们这样使用:
  1. hexists student name
  2. # 1
复制代码
返回的结果是 1 则表示 name 这个 field 存在,不存在的话会返回 0
hlen 用于查看 key 下存在多少个 field 属性:
  1. hlen student
复制代码
3. hmget 和 hmset

批量查看和设置哈希数据下的属性。
比如我们想一次性查看 student 下的 name 和 number 属性的值,可以使用 hmget:
  1. hmget student name number
  2. #1) "Hunter"
  3. #2) "00001"
复制代码
也可以使用 hmset 来批量设置:
  1. hmset student name "Jack" rank "2"
复制代码
4. 查看某个 key 下所有数据

如果我们想查看某个 key 下所有的 field 属性,可以使用 hkeys:
  1. hkeys student
  2. #1) "name"
  3. #2) "number"
  4. #3) "rank
复制代码
返回的是所有 field 属性
如果我们想查看某个 key 下所有的 field 属性下的值,可以使用 hvals
  1. hvals student
  2. #1) "Jack"
  3. #2) "00001"
  4. #3) "2"
复制代码
如果我们想查看某个 key 下所有的 field 属性和对应的值,可以使用 hgetall:
  1. hgetall student
  2. #1) "name"
  3. #2) "Jack"
  4. #3) "number"
  5. #4) "00001"
  6. #5) "rank"
  7. #6) "2"
复制代码
会将 field-name 依次返回。
4、列表命令

对于 Redis 中的列表数据,一般是以 l 开头,为了方便记忆,可以理解成是 List,或者是 Left 中的 L,为什么要提 Left 以及说一般是以 l 开头呢,因为有一些操作是 r 开头,这个表示是对列表的右边进行数据操作。
1. 列表数据的增加

lpush

从列表左边添加一个或多个数据:
  1. lpush rank 1
  2. lpush rank 2 8
复制代码
rpush

从列表右边添加一个或多个数据:
  1. rpush rank 3
  2. rpush rank 4 5
复制代码
linsert

在指定的 value 前或者后面插入一个 new_value,比如我们在 2 前插入 1.5
  1. linsert rank before 2 1.5
复制代码
或者在 2后面插入 2.5:
  1. linsert rank after 2 2.5
复制代码
如果列表中有重复数据怎么办?
系统会从左边开始寻找,找到的第一个目标数据的位置就停止查找,然后插入。
2. 列表数据的查看

lrange

通过下标查看数据范围,比如我们想查看第二个到第五个之间的数据:
  1. lrange rank 1 4
复制代码
如果想查看全部列表数据:
  1. lrange rank 0 -1
复制代码
lindex

通过下标索引获取数据,比如想查看第三个数据:
  1. lindex rank 2
复制代码
llen

获取列表长度:
  1. llen rank
复制代码
3. 列表数据的删除

lpop

从列表左边弹出一个数据:
  1. lpop rank
复制代码
rpop

从列表右边弹出一个数据:
  1. rpop rank
复制代码
lrem

这是一个遍历删除的操作,它的命令示例如下:
  1. lrem key count value
复制代码
当 count 大于 0 时,表示从左到右删除最多 count 个值为 value 的数据
当 count 小于 0 时,表示从右到左删除最多 count 个值为 value 的数据
当 count 等于 0 时,表示删除列表中全部值为 value 的数据
比如我们设置 rem_list 的值如下:
  1. lpush rem_list 1 3 3 5 3 8 5
复制代码
接下来我们从左到右删除两个 value 等于 3 的数据:
  1. lrem rem_list 2 3
复制代码
执行之后,rem_list 中应该还剩一个 3
如果我们想删除 rem_list 中全部 value 等于 5 的数据:
  1. lrem rem_list 0 5
复制代码
ltrim

按照索引范围修剪列表:
  1. ltrim key start end
复制代码
比如我们只保留从最开始到第四个元素的数据:
  1. rpush trim_list 0 1 2 3 4
  2. ltrim trim_list 0 3
复制代码
4. 列表数据的修改

lset

修改某个索引的数据,比如修改第三个位子的数据:
  1. lset a 2 8
复制代码
5、集合命令

集合中的数据是无序的,无重复的。
集合相关的命令都是以 s 开头的
1. 集合的增删改查

sadd

向集合中添加数据,可添加单个或多个元素
  1. del a
  2. sadd a 1
  3. sadd a 2 3 4
复制代码
smembers

查看集合中所有元素:
  1. smembers a
复制代码
sismember

查看元素是否在集合中,这个命令就是 is member:
  1. sismember a 2
复制代码
scard

获取集合中元素的总数:
  1. scard a
复制代码
srandmember

使用命令示例为 srandmember key [count]
表示从 key 中获取 count 个元素,如果不定义 count,则默认取出一个元素
  1. # 取出一个元素
  2. srandmember a
  3. # 取出两个元素
  4. srandmember a 2
复制代码
注意:这个命令为获取元素,但是并非从集合中弹出,而是单纯的获取,原集合不会变
srem

从集合中弹出一个或多个指定元素:
  1. # 从集合中弹出 2 4 8 三个元素
  2. srem a 2 4 8
复制代码
spop

从集合中弹出一个或多个元素,这个命令执行之后集合中就会将该元素剔除:
  1. spop a
  2. # 从集合中弹出两个元素
  3. spop a 2
复制代码
2. 集合间操作

sdiff

求取两个集合的差值,比如两个集合为 a 和 b,结果即为 a - b:
  1. sadd a 1 2 3
  2. sadd b 3 4 5
  3. sdiff a b
  4. # 1 2
复制代码
sinter

求取两个集合交集:
  1. sinter a b
  2. # 3
复制代码
sunion

两个集合并集:
  1. sunion a b
  2. # 1 2 3 4 5
复制代码
6、有序集合命令

有序集合兼具了列表和集合的特点,它是无重复的,但是是有序的
我们通过给元素添加额外的分数属性来实现元素的有序操作。
1. 元素的增加

zadd

命令示例为:
  1. zadd key score element
复制代码
假设我们要实现 Python、Java、Golang 三个元素的排名分别在 1、2、3,可以这样操作:
  1. del a
  2. zadd a 2 Java
  3. zadd a 1 Python 3 Golang
复制代码
2. 元素的查看

zrange

查看元素指定索引范围元素,可以通过 WITHSCORES 参数决定是否返回对应的排名分值:
  1. zrange a 0 2
  2. #1) "Python"
  3. #2) "Java"
  4. #3) "Golang"
复制代码
返回排名 score:
  1. zrange a 0 2 WITHSCORES
  2. #1) "Python"
  3. #2) "1"
  4. #3) "Java"
  5. #4) "2"
  6. #5) "Golang"
  7. #6) "3"
复制代码
zrangebyscore

通过分数区间返回元素:
  1. zrangebyscore a 1 3
复制代码
返回有序集合中分数在 1 和 3 之间的元素
zscore

返回指定元素的分数:
  1. zscore a Python
复制代码
zrank

返回指定元素的排名次序:
  1. zrank a Python
复制代码
zcard

返回元素的总个数:
  1. zcard a
复制代码
zcount

返回指定分数区间元素个数,比如返回分数在 1 到 3 之间,包括 1 和 3 的元素个数:
  1. zcount a 1 3
复制代码
3. 元素分数操作

zincrby

指定元素增加/减少分数
比如指定元素为 Python 的分数 +1
  1. zincrby a 1 Python
复制代码
4. 删除操作

zrem

删除某个元素:
  1. zrem a Java
复制代码
zremrangebyrank

删除指定排名內的元素
前面我们通过 zrank 返回指定元素的排名,这里是删除操作:
  1. zremrangebyrank a 1 3
复制代码
zremrangebyscore

删除指定分数段内的元素
  1. zremrangebyscore a 1 3
复制代码
如果想获取更多后端相关文章,可扫码关注阅读:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

石小疯

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表