Redis 常用命令集合

2020-09-14 · xiejiahe

在学习Redis时整理的一些命令,方便日后快速查找。

Redis 命令不区分大小写, 即 SET name xjh 等价于 set name xjh

目录

字符串

设置一个值

命令: SET key value

SET name xiejiahe

设置多个值

命令: MSET key value key value ...

# 返回的是一个数组
MSET name xiejiahe age 18

获取一个key值

命令:GET key

GET name

获取多个key值

命令:GET key key...

GET name age

获取字符串长度

命令:STRLEN key

# 返回 3
STRLEN name

追加字符串

命令:APPEND key value,如果key不存在则创建,等价于 SET key value

# xjh + _hi = xjh_hi
APPEND name _hi

列表

列表类似于编程当中的数组。

向头部添加元素

向左(头部)添加一个或多个元素,返回列表长度, 命令: LPUSH key value value...

LPUSH names xjh 1 2 3

向尾部添加元素

向右(尾部)添加一个或多个元素,返回列表长度, 命令: RPUSH key value value...

RPUSH names xjh 1 2 3

提取指定范围元素

提取列表指定范围元素,支持负数,-1最后一个,-2倒数第二个, 命令: LRANGE key index index

# 提取所有元素
LRANGE names 0 -1

向左弹出一个元素

向左弹出一个元素, 返回弹出的元素,如果没有元素返回 null, 命令: LPOP key

LPOP names

向右弹出一个元素

向右弹出一个元素,返回弹出的元素,如果没有元素返回 null, 命令: RPOP key

RPOP names

上限列表

上限列表,只保留前面指定N个元素,其他元素移除掉, 有点类似于JS splice, 命令: LTRIM key start end

LTRIM names 0 2

阻塞操作

LPOP 有点类似,等待 Key 列表元素,如果超时了仍然没有元素可弹出返回nil, 命令: BLPOP key seconds

接收2个参数,第一个是 Key, 第二个是超时单位秒,如果为0表示不超时,永久阻塞直到有新元素。

# 左边
BLPOP names 5
BLPOP name age 5 # 支持多个key

# 右边
BRPOP names 5

获取列表元素个数

获取列表元素个数, 如果不存在返回 0, 命令: LLEN key

LLEN names

删除数组指定元素

删除数组指定元素, 如果是正数从左边开始删N个元素的值,如果是负数则从右边删N个元素的值,如果是0删除所有指定元素, 命令: LREM key index value

LREM names 2 zhangsan

获取指定索引元素值

获取指定索引元素值, 索引从0开始, 命令: LINDEX key index

# xiejiahe
LINDEX names 0

设置指定索引元素值

设置指定索引元素值, 索引从0开始,如果索引不存在则报错, 命令: LSET key index value

LSET names 1 xiejiahe

Hash

Redis 哈希/散列相当于编程语言当中的 Map

设置一个字段

设置一个字段, 如果字段存在则覆盖,命令:HSET key 键 值

HSET user:001 username xiejiahe

设置多个字段

设置多个字段, 如果字段存在则覆盖,命令:HMSET key 键 值 键 值...

HMSET user:001 username xiejiahe age 18

读取字段的值

读取字段的值, 命令:HGET key 键

HGET user:001 username

读取多个字段的值

读取多个字段的值,命令:HMGET key 键 键...

HMGET user:001 username age

获取所有字段键和值

获取所有字段键和值, 返回的是列表 [键, 值, 键, 值], 单数是键,偶数是值。命令:HGETALL key

# name
# 谢家和
# age
# 18
HGETALL user:001

获取字段数量

获取字段数量, 命令:HLEN key

# 10
HLEN user:001

删除字段键

删除字段一个或多个键, 命令:HDEL key 键...

# 删除 name 和 age
HDEL user:001 name age

获取所有字段键名

获取所有字段键名, 返回列表, 命令:HKEYS key

# names
# age
HKEYS user:001

获取所有字段值

获取所有字段值, 返回列表, 命令:HVALS key

# xiejiahe
# 18
HVALS user:001

自增数量

自增是原子的,如果字段不存在则创建为0然后增加指定数值, 命令:HINCRBY key 键 number

# 首次创建 like 字段不存在则为 0 + 2 = 2
HINCRBY user:001 like 2

检查字段是否存在

检查字段是否存在, 存在返回 1, 否则返回 0, 命令:HEXISTS key 键

# 返回 1
HEXISTS user:001 name

字段不存在创建

字段不存在创建, 如果字段存在则跳过, 命令:HSETNX key 键 值

# 跟 HSET 命令一致,区别于如果字段存在了则不创建
HSETNX user:001 name 谢家和

集合

Redis 集合是无序的字符串集合且唯一, 每次调用时随意顺序返回元素。

添加元素

添加一个或多个元素,命令: SADD key value value...

SADD users 1 2 3
SADD users 1 2 3 5 # 因为是唯一的,所以只有5会被添加进去

删除元素

删除一个或多个元素,命令: SREM key value value...

SREM users 1 2 3...

获取集合所有元素

获取集合所有元素, 命令: SMEMBERS key

# 1
# 2
# 3
# 5
SMEMBERS users

检查指定元素是否存在

检查指定元素是否存在, 返回 1 成功,0 失败, 命令: SISMEMBER key value

# 返回 1
SISMEMBER users xiejiahe

获取集合元素个数

获取集合元素个数, 命令: SCARD key

# 返回 10
SCARD names

随机获得集合中的元素

随机获得集合中的元素, 命令: SRANDMEMBER key [number]

# 不指定数量,随机获取一个元素
SRANDMEMBER names

# 指定随机获取 10 个元素
SRANDMEMBER names 10

从集合中弹出一个元素

从集合中弹出一个元素, 因为集合是无序的,所以会随机弹出一个元素, 命令: SPOP key

# 随机弹出一个元素
SPOP names

有序集合

有序集合类型为集合中的每个元素都关联了一个分数(score)。

添加元素

添加1个或多个元素, value 在集合不能重复,否则被覆盖,score 可以正负数也可以浮点数, 命令: ZADD key score value...

# 添加多个元素
ZADD score 99 xjh 88 zhangsan

# 添加一个元素, score 为浮点数
ZADD score 100.1 xjh

根据value修改score

根据 value 修改 score, 命令: ZADD key score value

# 将 xjh 分数修改为 100
ZADD score 100 xjh

根据value获得score值

根据 value 获得元素的 score 值, 命令: ZSCORE key value

# 返回 100
ZSCORE score xjh

通过索引获取元素范围

通过索引获取元素范围, 类似 LRANGE 命令,支持负数, 命令: ZRANGE key start end <WITHSCORES>

# xjh
# zhangsan
ZRANGE score 0 -1

# xjh
# 100
# zhangsan
# 99
ZRANGE score 0 -1 WITHSCORES # 可选参数 WITHSCORES 返回包含 value 和 score

根据分数score范围获取元素

根据分数 score 范围获取元素, 可选标识符 (, 命令: ZRANGEBYSCORE key index index <WITHSCORES>

# xjh
# zhangsan
# lisi
ZRANGEBYSCORE score 60 100 # 返回 60 - 100 元素

# 可以在 数值 前面加 "(" 表示不包含此分数
ZRANGEBYSCORE score 60 (100 # 取60-100,但不包含100
ZRANGEBYSCORE score (60 100 # 取60-100,但不包含60

# 支持正负无穷数, +inf / -inf
ZRANGEBYSCORE score 60 +inf # 取60含60以上的分数

# xjh
# 100
# zhangsan
# 99
ZRANGEBYSCORE score 60 +inf WITHSCORES # 额外参数 WITHSCORES, 同时返回 value 和 score

获取分数范围并限制条数

ZREVRANGEBYSCORE 有点类似 ZRANGE 命令,但是支持 LIMIT 用于限制条数。命令:ZREVRANGEBYSCORE key max min LIMIT index index

注意:结果按照从大到小进行排序。

# xiejiahe
# zhangsan
# wangwu
ZREVRANGEBYSCORE score 100 0 LIMIT 0 3

增加或减少元素分数

如果value存在则在现有基础上增加,否则添加一个新元素并设置相应的数值,命令:ZINCRBY key number value

number 支持负数,所以可以用来减少元素的分数。

ZINCRBY score 98 xiejiahe

# 支持负数
ZINCRBY score -98 xiejiahe

获得集合元素数量

命令:ZCARD key

# 5
ZCARD score

获得集合指定分数范围元素数量

命令:ZCOUNT key min max

# 在 0 - 60 分数中元素数量
ZCOUNT score 0 60

删除元素

删除一个或多个元素,命令:ZREM key value value...

# 删除一个
ZREM score xiejiahe
# 删除多个
ZREM score xiejiahe wangwu

按照排名范围删除元素

ZREMRANGEBYRANK 按照元素分数从小到大的顺序进行删除。 命:ZREMRANGEBYRANK key start stop

# 3 (返回删除元素数量)
ZREMRANGEBYRANK score 0 3

按照分数范围删除元素

ZREMRANGEBYSCORE 按照分数范围删除所有元素,返回删除的元素数量。命令:ZREMRANGEBYSCORE key min max

# 删除0-60的所有元素
ZREMRANGEBYSCORE score 0 60

获取元素的排名

ZRANK 命令按照元素分数从小到大进行排序获得指定元素的排名,从0开始,命令:ZRANK key value

# 返回1, xiejiahe 排在第二
ZRANK score xiejiahe

计数器

Redis 字符串可以当做计数器使用, 内部会自动做类型转换, 常用于点赞、访问量等场景。

自增

自增,如果 key 不存在则默认为 0, 命令:INCR key

INCR number

自增指定数值

自增指定数值, 命令:INCRBY key number

number 支持负数,所以可以替代 DECRBY 命令。

INCRBY number 10

递减

递减,如果 key 不存在则默认为 -1, 命令:DECR key

DECR number

递减指定数值

递减指定数值, 命令:DECRBY key number

DECRBY number 10

自增或递减指定浮点数

自增或递减指定浮点数, 命令:INCRBYFLOAT key number

INCRBYFLOAT number 2.2
INCRBYFLOAT number -2.2

事务

执行事务

2个关键字: MULTI 开始事务, EXEC 执行事务。

注意:Redis不像关系型数据库那样可以回滚 rollback,一旦失败只能交给开发者擦屁股。

事务中的命令是在 EXEC 之后才执行的。

一个简单例子:

# 开始事务
> MULTI

# 中间是执行命令
> INCR num

> GET num

# 执行事务并返回所有结果集合
> EXEC

WATCH

监控一个或多个键,一旦其中有一个键被修改或删除,之后的事务就不会执行,一直持续到 EXEC 命令。

因为事务是在 EXEC 命令之后才执行的,假如在事务内执行原子自增,当其他客户也在执行原子自增就会出现竞态。

可以把 WATCH 理解为锁,锁住键防止其他客户端修改或删除。

# OK, 先设置一个值
> SET name xiejiahe

# OK, 监控 name
> WATCH name

# OK, 这里是能执行的,因为监控的是事务内的执行
> SET name facai

# 开启事务
> MULTI

# 修改 name, 如果其他客户端修改 name 那么这里执行失败,否则成功
SET name wangwu

# 执行事务
> EXEC

WATCH 命令还有一个对应的 UNWATCH 用于取消监控:

# 监控一个键
> WATCH num

# ...其他操作


# 取消监控,为了不影响下一个事务
UNWATCH num

# ...

排序

SORT

SORT 命令可以对 列表类型、集合类型、有序集合类型进行排序。

注意:只能对数字元素进行排序,如果是非数字会出错。

# 创建一个列表
LPUSH score 99 5 3 -1 -55 9 100 88

# 排序
SORT score
# 1)  "-55"
# 2)  "-1"
# 3)  "3"
# 4)  "5"
# 5)  "9"
# 6)  "88"
# 7)  "99"
# 8)  "100"

倒序

默认情况下 SORT 是升序排序的从小到大。大多数情况下用倒序比较多,通过 DESC 参数可以实现倒序:

SORT score DESC

字典排序

有时候并非所有元素都是数字,比如是字母或其他情况。通过 ALPHA 参数实现按照字典顺序排列。

# 设置一个列表为字母元素
LPUSH letter b d z a o p

# 排序
SORT letter ALPHA
# 1)  "a"
# 2)  "b"
# 3)  "d"
# 4)  "o"
# 5)  "p"
# 6)  "z"

限制条数

SORT 命令还支持 LIMIT 参数,和 SQL 语句一样,可以用于分页。命令: SORT key LIMIT offset count

SORT score DESC LIMIT 1 5

发布订阅

发布

发布的命令是 PUBLISH, 完整命令使用: PUBLISH channel message

channel 是信道或频道或者理解为是房间,往某个房间发送数据。

执行后返回返回收到这条消息的订阅者数量,如果没有客户端订阅就返回 0;

发布不是持久化的,当发布后接着客户端订阅当前信道接收不到之前的消息。

# 往 room:0 发送 Hello
PUBLISH room:01 Hello

订阅

有发布肯定有订阅, 订阅命令是 SUBSCRIBE, 完整命令使用:SUBSCRIBE channel ...

当执行 SUBSCRIBE 命令后将进入订阅状态。

# 订阅 room:01
SUBSCRIBE room:01

# 进入订阅状态
Switch to Pub/Sub mode. Close console tab to stop listen for messages.
 1)  "subscribe"    # 订阅成功反馈信息
 2)  "room:01"
 3)  "1"
 1)  "message"      # 收到的消息
 2)  "room:01"
 3)  "hello"

取消订阅

UNSUBSCRIBE 命令可以取消订阅信道, 如果不指定信号将取消所有订阅信道。

注意:如果是在 redis-cli ,无法执行 UNSUBSCRIBE 因为执行订阅后当前实例会被阻塞, 无法执行其他命令。

# 取消指定订阅信道
UNSUBSCRIBE room:01

# 取消全部订阅
UNSUBSCRIBE

检查、类型

检查key是否存在

检查 key 是否存在,存在返回 1,否则 0, 命令:EXISTS key

EXISTS names

获取key类型

获取key类型, 命令:TYPE key

# "string"
TYPE names

过期时间

可以让一个键在某个时间段删除。 通常会用在获取验证码频繁,登录次数过多等场景。

目前Redis过期时间误差值在 0 ~ 1 毫秒之间。

给指定Key设置过期时间

给指定 key 设置过期时间,单位秒(整数), 命令: EXPIRE key seconds

# 方法一:在已存在的key设置过期时间
EXPIRE names 10

# 或者在设置值时指定过期时间
SET name xiejiahe EX 10

检查Key的生存剩余时间

检查Key的生存剩余时间(秒), 命令: TTL key

TTL name

删除过期时间

删除过期时间,使 Key 永久存在, 命令: PERSIST key

PERSIST name

除了 PERSIST, 还可以使用 SET 命令赋值也会删除过期时间

# 设置过期时间为10秒
EXPIRE key 10

# 重新赋值会删除过期时间
SET key 1

删除

删除Key

删除一个或多个任何类型的 key, 命令: DEL key...

DEL name
DEL name age # 支持删除多个

清空所有数据库中的数据

清空所有数据库中的数据, 相当于还原Redis初始状态, 命令: FLUSHALL

# 0-16 数据库数据全部清空
FLUSHALL

清空当前数据库所有数据

# 当前数据库中的所有数据将被清除
FLUSHDB

管理

配置文件设置

配置文件位于 redis 的安装目录下的 redis.conf 文件。 除了通过配置文件设置以外还支持命令进行配置查看。

设置命令 CONFIG SET key value

需要注意不是所有配置都可以用命令设置,有一些配置就必须在 redis.conf 文件中设置,比如 rename-command

# 这里增加一个配置name 为 xjh
CONFIG SET name xjh

查看配置 CONFIG GET key

CONFIG GET name

设置密码

redis 数据库只有密码可以设置,没有用户名一说,redis的设计初衷就是简洁为美。

设计密码很简单,就是通过设置配置文件字段 requirepass, 命令: CONFIG SET requirepass 密码

密码一定要设置得复杂一点,因为很容易被穷举。

CONFIG SET requirepass ddj1ja@9)..

当数据库设置密码后每次连接 redis 都要进行授权:

# AUTH 后面跟着密码
AUTH ddj1ja@9)..

命令重命名

有些命令比较长很难记,这时候可以给命令进行重命名。需要在 redis.conf 文件中进行设置。

# 将 SET 命令重命名为 s
rename-command SET s

禁用命令

有一些大厂就比较规范,会将一些比较耗性能或危险的命令给禁用掉。 需要在 redis.conf 文件中进行设置。

# 禁掉 FLUSHALL 命令
rename-command FLUSHALL ""

其他

获取所有key名字

获取所有key名字, 支持正则, 此命令不建议生产环境使用,因为会遍历所有键,当键较多时会影响性能, 命令: KEYS key

# 正则通配符、正则
KEYS *
KEYS n*

获取当前数据库Key数量

获取当前数据库Key数量, 命令: DBSIZE

DBSIZE

修改键名

RENAME 命令可以将存在的键名修改为新的键名。

SET inc 0

# 修改键名
RENAME inc increment
SQL
原创文章,转载请注明出处。