一、Key命令
命令 | 描述 |
---|---|
type | 返回 key 所储存的值的类型。 |
pexpireat | 设置 key 的过期时间亿以毫秒计。 |
rename | 修改 key 的名称 |
persist | 移除 key 的过期时间,key 将持久保持。 |
move | 将当前数据库的 key 移动到给定的数据库 db 当中。 |
randomkey | 从当前数据库中随机返回一个 key 。 |
dump | 序列化给定 key ,并返回被序列化的值。 |
ttl | 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。 |
expire | seconds 为给定 key 设置过期时间。 |
del | 该命令用于在 key 存在是删除 key。 |
pttl | 以毫秒为单位返回 key 的剩余的过期时间。 |
renamenx | 仅当 newkey 不存在时,将 key 改名为 newkey 。 |
exists | 检查给定 key 是否存在。 |
expireat | expireat 的作用和 expire 类似,都用于为 key 设置过期时间。 不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳(unix timestamp)。 |
keys | 查找所有符合给定模式( pattern)的 key 。 |
1.1 keys *
# 返回所有 key,可以使用通配符来查询。
keys *
# 查看以 hel 开头的 key
keys hel*
# 查看 ph + 一个字符
keys ph?
注意:一般不要使用 keys 这个操作,Redis 是单线程,执行之后如果耗时过久会造成阻塞。
1.2 exists key
查看某个 key 是否存在,存在则返回 1,不存在返回 0
exists key
# 1
1.3 del key [key …]
删除一个或多个 key:
# 删除 key
del key1
# 删除 key1、key2
del key1 key2
成功删除 n 个 key,返回整数 n
1.4 expire key n
给 key 设置 n 秒后过期
假设给 key 为 hello 的数据设置 3 秒后过期:
expire hello 3
三秒后,我们尝试获取 hello 数据,就会发现返回空了。
# after 3 seconds ...
get hello
1.5 ttl key
查看 key 剩余过期时间,假设我们前面设置的过期时间很长,在数据未过期的时候使用这个命令:
ttl hello
就会返回 hello 剩余的过期时间。
1.6 persist key
在 key 还未过期的时候,使用这个命令,可以去除 key 上的过期时间:
persist hello
1.7 type key
返回 key 的类型,后面我们会介绍 Redis 的几种基本数据类型。
Redis 几种数据类型是:字符串、哈希、列表、集合、有序集合
二、字符串命令
在 Redis 中存储字符串,就是一个 key-value 的结构。
其中,value 可以是字符串,也可以是数字,对于数字 Redis 会自动识别,且可以使用一些字符串没有的操作,比如增加、减少等。
但在设置和存储的过程中,字符串和数字都是一样的使用方式。
命令 | 描述 |
---|---|
setnx | 只有在 key 不存在时设置 key 的值。 |
getrange | 返回 key 中字符串值的子字符 |
mset | 同时设置一个或多个 key-value 对。 |
mget | 获取所有(一个或多个)给定 key 的值。 |
setex | 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。 |
psetex | 这个命令和 setex 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。 |
set | 设置指定 key 的值 |
get | 获取指定 key 的值。 |
getbit | 对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 |
setbit | 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。 |
decr | 将 key 中储存的数字值减一。 |
decrby | key 所储存的值减去给定的减量值(decrement) 。 |
strlen | 返回 key 所储存的字符串值的长度。 |
msetnx | 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。 |
incrby | 将 key 所储存的值加上给定的增量值(increment) 。 |
incrbyfloat | 将 key 所储存的值加上给定的浮点增量值(increment) 。 |
setrange | 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。 |
append | 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。 |
getset | 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 |
incr | 将 key 中储存的数字值增一。 |
2.1 字符串的增删改查
字符串的增删改查操作是 get、set、del。其中 set 操作可以是增加数据,也可以是更新数据。
接下来我们对 key 为 hello 的数据进行操作:
# 增加 hello 的值为 world
set hello world
# 获取 hello 的值
get hello
# 更新 hello 的值为 "new world"
set hello "new world"
# 删除 hello
del hello
2.2 set 操作数据的几种用法
前面介绍的 set,如果存在则更新,不存在则增加,如果我们想要实现存在 key 就更新,以及不存在 key 则创建的逻辑,可以如此操作:
不存在则设置,存在则不操作
setnx 可以实现我们这个逻辑:
if not exists:
insert
else:
pass
比如我们执行:
del a
setnx a 1
setnx a 2
上面的操作之后,尽管我们的 setnx 执行了两遍,但前面已经设置过了 a 的值,所以第二个操作不会执行了。
存在则更新,不存在则不操作
set key value xx,注意,xx 是固定用法,比如我们想 a 的值如果存在于系统,则更新 a 的值为 2,不存在的话则不操作,可以如下:
set a 2 xx
那么如果系统之前没有 a 的值存在,那么执行这个命令之后,系统也不会有 a 这个 key。
2.3 整数的操作
对于字符串类型的数据,可以存储字符串也可以存储整数,对于整数,有一些额外的操作,比如自增1,自减1,自增n,自减n。
incr 自增 1
# 为 a 初始化设置值为 3
set a 3
# 进行自增 1 的操作
incr a
decr 自减 1
decr a
注意:如果 incr 和 decr 的 key 之前在 Redis 中不存在,那么系统会默认先 set key 0,然后进行自增自减的操作
incrby 自增 n
# 对 a 进行自增 5
incrby a 5
decrby 自减 n
# 对 a 进行自减 5
decrby a 5
2.4 小数的操作
对应于整数,小数也可以进行自增的操作
incrbyfloat 自增某个小数
incrbyfloat a 3.4
但是,并没有相应的小数数自减操作,但是我们可以通过在 value 加负号来表示自减操作:
incrbyfloat a -3.4
2.5 字符串的范围操作
对于一个字符串,比如我们设置:
set a "this is a string"
getrange
我们通过 get 可以获取 a 的全量字符串,也可以通过 getrange 下标来指定范围获取:
getrange a 1 3
表示获取从 1 开始到 3 之间的字符串,下标从 0 开始。
setrange
也可以通过下标设置字符串内容:
setrange a 5 xxxx
上面的操作表示将 a 字符串在第 6 个的位置的字符串替换成 xxxx,那么 a 的结果应该是:
get a
# "this xxxx string"
2.6字符串的字符操作
getset
先获取 key 的 value,然后对 key 设置新的 value:
getset a "new value"
append
将 value 追加到 key 的旧 value 的末尾:
set a "abc"
append a "def"
get a
# "abcdef"
strlen
获取字符串的长度:
strlen a
# 6
2.7 批量操作
mget
批量获取 key 列表的值,比如我们有 a,b,c 三个 key,我们想同时返回三个 key 的数据:
mget a b c
# 以下是返回:
#1) "abcdef"
#2) "1"
#3) "world"
mset
批量设置 key 列表的值,一个 key 后跟一个 value,比如我们设置三个 key,a、b、c 的 value 分别是 1,2,3:
mset a "1" b "2" c "3"
三、哈希命令
因为 Redis 存储的数据类型是一个 key-value 的结构,而哈希本身的数据类型也是一个 key-value 的类型,所以哈希数据相当于是一个嵌套的类型,这个地方需要了解清楚它的概念。
在下面的例子中,我们将 Redis 中的 key 称为 key,而哈希中的 key-value 中对应的 key 称为 field 以示区分。
哈希命令的前面都带一个 h,这是哈希命令的一个特点。
接下来,我们以一个例子来介绍哈希命令,我们想要存入一个这样的数据,key 为 student,它有 name,number,rank 三个 field 属性,大致如下:
{
"student":
{
"name": "Hunter",
"number": "00001",
"rank": 1
}
}
命令 | 描述 |
---|---|
hmset | 同时将多个 field-value (域-值)对设置到哈希表 key 中。 |
hmget | 获取所有给定字段的值 |
hset | 将哈希表 key 中的字段 field 的值设为 value 。 |
hgetall | 获取在哈希表中指定 key 的所有字段和值 |
hget | 获取存储在哈希表中指定字段的值/td> |
hexists | 查看哈希表 key 中,指定的字段是否存在。 |
hincrby | 为哈希表 key 中的指定字段的整数值加上增量 increment 。 |
hlen | 获取哈希表中字段的数量 |
hdel | 删除一个或多个哈希表字段 |
hvals | 获取哈希表中所有值 |
hincrbyfloat | 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。 |
hkeys | 获取所有哈希表中的字段 |
hsetnx | 只有在字段 field 不存在时,设置哈希表字段的值。 |
3.1 哈希数据的增删改查
这里我们要设置 student 的几个属性值,创建和更新都用 heset:
hset student name "Hunter"
hset student number "00001"
hset student rank 1
使用 hget 查询数据:
hget student name
使用 hdel 删除数据:
hdel student name
如果是直接删除 student 这个 key 呢,直接使用 del:
del student
3.2 hexists 和 hlen
hexists 是用于查看 key 下某个 field 属性是否存在,假设前面的 student 数据没有删除,我们这样使用:
hexists student name
# 1
返回的结果是 1 则表示 name 这个 field 存在,不存在的话会返回 0
hlen 用于查看 key 下存在多少个 field 属性:
hlen student
3.3 hmget 和 hmset
批量查看和设置哈希数据下的属性。
比如我们想一次性查看 student 下的 name 和 number 属性的值,可以使用 hmget:
hmget student name number
#1) "Hunter"
#2) "00001"
也可以使用 hmset 来批量设置:
hmset student name "Jack" rank "2"
3.4 查看某个 key 下所有数据
如果我们想查看某个 key 下所有的 field 属性,可以使用 hkeys:
hkeys student
#1) "name"
#2) "number"
#3) "rank
返回的是所有 field 属性
如果我们想查看某个 key 下所有的 field 属性下的值,可以使用 hvals
hvals student
#1) "Jack"
#2) "00001"
#3) "2"
如果我们想查看某个 key 下所有的 field 属性和对应的值,可以使用 hgetall:
hgetall student
#1) "name"
#2) "Jack"
#3) "number"
#4) "00001"
#5) "rank"
#6) "2"
会将 field-name 依次返回。
四、列表命令
对于 Redis 中的列表数据,一般是以 l 开头,为了方便记忆,可以理解成是 List,或者是 Left 中的 L,为什么要提 Left 以及说一般是以 l 开头呢,因为有一些操作是 r 开头,这个表示是对列表的右边进行数据操作。
命令 | 描述 |
---|---|
lindex | 通过索引获取列表中的元素 |
rpush | 在列表中添加一个或多个值 |
lrange | 获取列表指定范围内的元素 |
rpoplpush | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
blpop | 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
brpop | 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
brpoplpush | 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
lrem | 移除列表元素 |
llen | 获取列表长度 |
ltrim | 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 |
lpop | 移出并获取列表的第一个元素 |
lpushx | 将一个或多个值插入到已存在的列表头部 |
linsert | 在列表的元素前或者后插入元素 |
rpop | 移除并获取列表最后一个元素 |
lset | 通过索引设置列表元素的值 |
lpush | 将一个或多个值插入到列表头部 |
rpushx | 为已存在的列表添加值 |
4.1 列表数据的增加
lpush
从列表左边添加一个或多个数据:
lpush rank 1
lpush rank 2 8
rpush
从列表右边添加一个或多个数据:
rpush rank 3
rpush rank 4 5
linsert
在指定的 value 前或者后面插入一个 new_value,比如我们在 2 前插入 1.5
linsert rank before 2 1.5
或者在 2后面插入 2.5:
linsert rank after 2 2.5
如果列表中有重复数据怎么办?
系统会从左边开始寻找,找到的第一个目标数据的位置就停止查找,然后插入。
4.2 列表数据的查看
lrange
通过下标查看数据范围,比如我们想查看第二个到第五个之间的数据:
lrange rank 1 4
如果想查看全部列表数据:
lrange rank 0 -1
lindex
通过下标索引获取数据,比如想查看第三个数据:
lindex rank 2
llen
获取列表长度:
llen rank
4.3 列表数据的删除
lpop
从列表左边弹出一个数据:
lpop rank
rpop
从列表右边弹出一个数据:
rpop rank
lrem
这是一个遍历删除的操作,它的命令示例如下:
lrem key count value
当 count 大于 0 时,表示从左到右删除最多 count 个值为 value 的数据 当 count 小于 0 时,表示从右到左删除最多 count 个值为 value 的数据 当 count 等于 0 时,表示删除列表中全部值为 value 的数据
比如我们设置 rem_list 的值如下:
lpush rem_list 1 3 3 5 3 8 5
接下来我们从左到右删除两个 value 等于 3 的数据:
lrem rem_list 2 3
执行之后,rem_list 中应该还剩一个 3
如果我们想删除 rem_list 中全部 value 等于 5 的数据:
lrem rem_list 0 5
ltrim
按照索引范围修剪列表:
ltrim key start end
比如我们只保留从最开始到第四个元素的数据:
rpush trim_list 0 1 2 3 4
ltrim trim_list 0 3
4.4 列表数据的修改
lset
修改某个索引的数据,比如修改第三个位子的数据:
lset a 2 8
五、集合命令
集合中的数据是无序的,无重复的。
集合相关的命令都是以 s 开头的
命令 | 描述 |
---|---|
sunion | 返回所有给定集合的并集 |
scard | 获取集合的成员数 |
srandmember | 返回集合中一个或多个随机数 |
smembers | 返回集合中的所有成员 |
sinter | 返回给定所有集合的交集 |
srem | 移除集合中一个或多个成员 |
smove | 将 member 元素从 source 集合移动到 destination 集合 |
sadd | 向集合添加一个或多个成员 |
sismember | 判断 member 元素是否是集合 key 的成员 |
sdiffstore | 返回给定所有集合的差集并存储在 destination 中 |
sdiff | 返回给定所有集合的差集 |
sscan | 迭代集合中的元素 |
sinterstore | 返回给定所有集合的交集并存储在 destination 中 |
sunionstore | 所有给定集合的并集存储在 destination 集合中 |
spop | 移除并返回集合中的一个随机元素 |
5.1 集合的增删改查
sadd
向集合中添加数据,可添加单个或多个元素
del a
sadd a 1
sadd a 2 3 4
smembers
查看集合中所有元素:
smembers a
sismember
查看元素是否在集合中,这个命令就是 is member:
sismember a 2
scard
获取集合中元素的总数:
scard a
srandmember
使用命令示例为 srandmember key [count]
表示从 key 中获取 count 个元素,如果不定义 count,则默认取出一个元素
# 取出一个元素
srandmember a
# 取出两个元素
srandmember a 2
注意:这个命令为获取元素,但是并非从集合中弹出,而是单纯的获取,原集合不会变
srem
从集合中弹出一个或多个指定元素:
# 从集合中弹出 2 4 8 三个元素
srem a 2 4 8
spop
从集合中弹出一个或多个元素,这个命令执行之后集合中就会将该元素剔除:
spop a
# 从集合中弹出两个元素
spop a 2
5.2 集合间操作
sdiff
求取两个集合的差值,比如两个集合为 a 和 b,结果即为 a - b:
sadd a 1 2 3
sadd b 3 4 5
sdiff a b
# 1 2
sinter
求取两个集合交集:
sinter a b
# 3
sunion
两个集合并集:
sunion a b
# 1 2 3 4 5
六、有序集合命令
有序集合兼具了列表和集合的特点,它是无重复的,但是是有序的
我们通过给元素添加额外的分数属性来实现元素的有序操作。
命令 | 描述 |
---|---|
zrevrank | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
zlexcount | 在有序集合中计算指定字典区间内成员数量 |
zunionstore | 计算给定的一个或多个有序集的并集,并存储在新的 key 中 |
zremrangebyrank | 移除有序集合中给定的排名区间的所有成员 |
zcard | 获取有序集合的成员数 |
zrem | 移除有序集合中的一个或多个成员 |
zinterstore | 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 |
zrank | 返回有序集合中指定成员的索引 |
zincrby | 有序集合中对指定成员的分数加上增量 increment |
zrangebyscore | 通过分数返回有序集合指定区间内的成员 |
zrangebylex | 通过字典区间返回有序集合的成员 |
zscore | 返回有序集中,成员的分数值 |
zremrangebyscore | 移除有序集合中给定的分数区间的所有成员 |
zscan | 迭代有序集合中的元素(包括元素成员和元素分值) |
zrevrangebyscore | 返回有序集中指定分数区间内的成员,分数从高到低排序 |
zremrangebylex | 移除有序集合中给定的字典区间的所有成员 |
zrevrange | 返回有序集中指定区间内的成员,通过索引,分数从高到底 |
zrange | 通过索引区间返回有序集合成指定区间内的成员 |
zcount | 计算在有序集合中指定区间分数的成员数 |
zadd | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
6.1 元素的增加
zadd
命令示例为:
zadd key score element
假设我们要实现 Python、Java、Golang 三个元素的排名分别在 1、2、3,可以这样操作:
del a
zadd a 2 Java
zadd a 1 Python 3 Golang
6.2 元素的查看
zrange
查看元素指定索引范围元素,可以通过 WITHSCORES 参数决定是否返回对应的排名分值:
zrange a 0 2
#1) "Python"
#2) "Java"
#3) "Golang"
返回排名 score:
zrange a 0 2 WITHSCORES
#1) "Python"
#2) "1"
#3) "Java"
#4) "2"
#5) "Golang"
#6) "3"
zrangebyscore
通过分数区间返回元素:
zrangebyscore a 1
返回有序集合中分数在 1 和 3 之间的元素
zscore
返回指定元素的分数:
zscore a Python
zrank
返回指定元素的排名次序:
zrank a Python
zcard
返回元素的总个数:
zcard a
zcount
返回指定分数区间元素个数,比如返回分数在 1 到 3 之间,包括 1 和 3 的元素个数:
zcount a 1 3
6.3 元素分数操作
zincrby
指定元素增加/减少分数
比如指定元素为 Python 的分数 +1
zincrby a 1 Python
6.4 删除操作
zrem
删除某个元素:
zrem a Java
zremrangebyrank
删除指定排名內的元素
前面我们通过 zrank 返回指定元素的排名,这里是删除操作:
zremrangebyrank a 1 3
zremrangebyscore
删除指定分数段内的元素
zremrangebyscore a 1 3
七、其他命令
7.1 连接命令
命令 | 描述 |
---|---|
echo | 打印字符串 |
select | 切换到指定的数据库 |
ping | 查看服务是否运行 |
quit | 关闭当前连接 |
auth | 验证密码是否正确 |
7.2 服务器命令
命令 | 描述 |
---|---|
client pause | 在指定时间内终止运行来自客户端的命令 |
debug object | 获取 key 的调试信息 |
flushdb | 删除当前数据库的所有key |
save | 异步保存数据到硬盘 |
showlog | 管理 redis 的慢日志 |
lastsave | 返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示 |
config get | 获取指定配置参数的值 |
command | 获取 Redis 命令详情数组 |
slaveof | 将当前服务器转变为指定服务器的从属服务器(slave server) |
debug segfault | 让 Redis 服务崩溃 |
flushall | 删除所有数据库的所有key |
dbsize | 返回当前数据库的 key 的数量 |
bgrewriteaof | 异步执行一个 AOF(AppendOnly File) 文件重写操作 |
cluster slots | 获取集群节点的映射数组 |
config cet | 修改 redis 配置参数,无需重启 |
command info | 获取指定 Redis 命令描述的数组 |
shutdown | 异步保存数据到硬盘,并关闭服务器 |
sync | 用于复制功能(replication)的内部命令 |
client kill | 关闭客户端连接 |
role | 返回主从实例所属的角色 |
monitor | 实时打印出 Redis 服务器接收到的命令,调试用 |
command getkeys | 获取给定命令的所有键 |
client getname | 获取连接的名称 |
config resetstat | 重置 INFO 命令中的某些统计数据 |
command count | 获取 Redis 命令总数 |
time | 返回当前服务器时间 |
info | 获取 Redis 服务器的各种信息和统计数值 |
config rewrite | 对启动 Redis 服务器时所指定的 redis.conf 配置文件进行改写 |
client list | 获取连接到服务器的客户端连接列表 |
client setname | 设置当前连接的名称 |
bgsave | 在后台异步保存当前数据库的数据到磁盘 |
7.3 脚本命令
命令 | 描述 |
---|---|
script kill | 杀死当前正在运行的 Lua 脚本。 |
script load | 将脚本 script 添加到脚本缓存中,但并不立即执行这个脚本。 |
eval | 执行 Lua 脚本。 |
evalsha | 执行 Lua 脚本。 |
script exists | 查看指定的脚本是否已经被保存在缓存当中。 |
script flush | 从脚本缓存中移除所有脚本。 |
7.4 事务命令
命令 | 描述 |
---|---|
exec | 执行所有事务块内的命令。 |
watch | 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。 |
dscard | 取消事务,放弃执行事务块内的所有命令。 |
unwatch | 取消 WATCH 命令对所有 key 的监视。 |
multi | 标记一个事务块的开始。 |
7.5 HyperLogLog命令
命令 | 描述 |
---|---|
pgmerge | 将多个 HyperLogLog 合并为一个 HyperLogLog |
pfadd | 添加指定元素到 HyperLogLog 中。 |
pfcount | 返回给定 HyperLogLog 的基数估算值。 |
7.6 发布订阅命令
命令 | 描述 |
---|---|
unsubscribe | 指退订给定的频道。 |
subscribe | 订阅给定的一个或多个频道的信息。 |
pubsub | 查看订阅与发布系统状态。 |
punsubscribe | 退订所有给定模式的频道。 |
publish | 将信息发送到指定的频道。 |
psubscribe | 订阅一个或多个符合给定模式的频道。 |
7.7 地理位置(geo)命令
命令 | 描述 |
---|---|
GEOHASH | 返回一个或多个位置元素的 Geohash 表示 |
GEOPOS | 从key里返回所有给定位置元素的位置(经度和纬度) |
GEODIST | 返回两个给定位置之间的距离 |
GEORADIUS | 以给定的经纬度为中心, 找出某一半径内的元素 |
GEOADD | 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中 |
GEORADIUSBYMEMBER | 找出位于指定范围内的元素,中心点是由给定的位置元素决定 |