redis 键操作
keys key-pattern:返回匹配的 key 列表,比如:keys foo* 表示查找 foo 开头的 keys。
代码语言:javascript复制keys my*
查看所有键
代码语言:javascript复制keys*
其中,pattern 可以用 “?” 来代替一位字符,用“*”来匹配零个、一个或多个字符,还可以用正则表达式的方式来匹配(模式匹配)。keys *
命令虽然可以返回所有的键,但是在项目里键的数量一般会很多,全部返回没有意义,所以一般不怎么使用。
返回当前数据库的 key 的总数。
代码语言:javascript复制dbsize
判断一个 key 是否存在,存在返回 1,否则返回 0。
代码语言:javascript复制exists key
删除某个 key,或是一系列 key,比如:del key1 key2 key3 key4。成功返回 1,失败返回 0(key 值不存在)。
代码语言:javascript复制del key [key2] [...]
在实际项目里,虽然能用 del 同时删除多个键,但是为了防止误删,尽量每次仅删除一个键,或者在确认的情况下每次删除少量键。
返回某个 key 元素的数据类型(none:不存在,string:字符,list:列表,set:元组,zset:有序集合,hash:哈希),key 不存在返回空。
代码语言:javascript复制type key
随机获得一个已经存在的 key,如果当前数据库为空,则返回空字符串。
代码语言:javascript复制randomkey
更改 key 的名字,新键如果存在将被覆盖。
代码语言:javascript复制rename oldname newname
更改 key 的名字,新键如果存在则更新失败。
代码语言:javascript复制renamenx oldname newname
设置过期时间 TTL 和 Ptll
Redis Expire 命令用于设置 key 的过期时间,key 过期后将不再可用。单位以秒计。
代码语言:javascript复制redis 127.0.0.1:6379> Expire KEY_NAME
如果在还没有过期的时候,再次对值进行改变,那么新值会覆盖老值, 老值会自动失效.
设置过期时间
- ttl 命令以秒为单位返回 key 的剩余过期时间。
- Pttl 命令以毫秒为单位返回 key 的剩余过期时间。
当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以毫秒为单位,返回 key 的剩余生存时间。
注意:在 Redis 2.8 以前,当 key 不存在,或者 key 没有设置剩余生存时间时,命令都返回 -1 。
键过期
代码语言:javascript复制expire key seconds
返回键的剩余过期时间
代码语言:javascript复制ttl key
通过 persist 命令,能删除键的生存时间,之后该键永不过期。该命令的格式如下:
代码语言:javascript复制persist key
查找 key
scan 命令里包含一个记录迭代位置的游标(cursor),每次执行scan 命令时,除了会返回查找到的键以外,还会返回一个记录迭代位置的游标数值,如果返回的迭代位置数值是 0,则表示已经返回全部的键。scan 命令的基本用法如下:
代码语言:javascript复制scan cursor [MATCH pattern] [COUNT count]
scan 命令里包含一个记录迭代位置的游标(cursor),每次执行scan 命令时,除了会返回查找到的键以外,还会返回一个记录迭代位置的游标数值,如果返回的迭代位置数值是 0,则表示已经返回全部的键。
第 1 行的scan命令表示从 0 号游标开始查找键,其中表示返回键数量的 COUNT 值默认是 10,也就是说该命令将从头开始返回 10 个键的名称。
代码语言:javascript复制127.0.0.1:6379> scan 0
1) "0"
2) 1) "tel"
2) "nu"
3) "a"
4) "ddd"
5) "likai"
6) "mylist"
7) "b"
8) "kai"
由于当前键的数量大于 5 个,因此第 2 行表示下次迭代的游标数值是 3,返回了 5 个键的名称。由此大家可以看到“部分查找”的效果。
代码语言:javascript复制127.0.0.1:6379> scan 0 match * count 5
1) "3"
2) 1) "tel"
2) "nu"
3) "a"
4) "ddd"
5) "likai"
127.0.0.1:6379> scan 3 match * count 5
1) "0"
2) 1) "mylist"
2) "b"
3) "kai"
和 keys 命令相比,scan 命令是以非阻塞的方式查找并返回键,也就是说,在大多数场景下 scan 能替代 keys 命令。如果待查找的键个数比较少,那么用 keys 命令尚可,否则建议使用 scan 命令。
清除 key
flushdb:清空当前数据库中的所有键。 flushall:清空所有数据库中的所有键。
键的数据结构类型
查看键的数据结构类型
代码语言:javascript复制type key
查询内部编码
代码语言:javascript复制object encoding key
设置相关命令
清除界面。
代码语言:javascript复制clear
CONFIG GET and CONFIG SET config get:用来读取运行 Redis 服务器的配置参数。 config set:用于更改运行 Redis 服务器的配置参数。 auth:认证密码。
重置报告 config resetstat:重置数据统计报告,通常返回值为“OK”。
查询配置信息
info [section]:查询 Redis 相关信息。
info 命令可以查询 Redis 几乎所有的信息,其命令选项有如下:
server: Redis server 的常规信息 clients: Client 的连接选项 memory: 存储占用相关信息 persistence: RDB and AOF 相关信息 stats: 常规统计 replication: Master/Slave 请求信息 cpu: CPU 占用信息统计 cluster: Redis 集群信息 keyspace: 数据库信息统计 all: 返回所有信息 default: 返回常规设置信息
综合案例
代码语言:javascript复制set mykey hello
exists mykey
del mykey
exists mykey
HyperLogLog
HyperLogLog 其实是 Redis 里用来统计基数的一个对象。比如用来统计网站访问总人数。
用 pfadd 命令能向其中添加键值对,并可在此基础上用 pfcount 命令统计某个键的基数值。
代码语言:javascript复制127.0.0.1:6379> pfadd peter math computer piano
(integer) 1
127.0.0.1:6379> pfcount peter
(integer) 3
127.0.0.1:6379> pfadd marry math math piano
(integer) 1
127.0.0.1:6379> pfcount marry
(integer) 2
127.0.0.1:6379>
用 pfcount 可以查看一个或多个键的基数。如果对应的key不存在,则返回 0。
代码语言:javascript复制127.0.0.1:6379> pfcount peter marry existkey
(integer) 3
这里需要说明的是,该命令返回的是对应基数的近似值,也就是说,当基数量很大时统计结果未必是精确值。
通过 pfmerge 命令,能把多个 HyperLogLog 合并成一个,该命令的格式如下:
代码语言:javascript复制pfmerge destkey sourcekey [sourcekey ...]
lua 脚本相关命令
lua 是一种比较轻量的脚本语言,可以嵌入应用程序中,能以较小的代价定制功能。在 Redis 里,也可以通过使用 lua 脚本来实现特定的效果。
lua 脚本是一个和 Redis 独立的技术,不仅能用在 Redis 里,还能用在其他场景中。
把 lua 脚本装载到缓存里
代码语言:javascript复制127.0.0.1:6379> script load "return 1 2"
"e412f6a7f0b07176d9824bb91205d9d54e88fdc0"
从第 2 行的输出里能看到该脚本的 sha1 校验和。随后可以通过script exists 命令来判断指定校验和的脚本是否存在于缓存中,该命令的用法如下:
代码语言:javascript复制script exists e412f6a7f0b07176d9824bb91205d9d54e88fdc0
可以通过 evalsha 命令来执行缓存中的脚本,该命令的格式如下:
代码语言:javascript复制evalsha sha1 numkeys key [key ...] arg [arg ...]
案例
代码语言:javascript复制127.0.0.1:6379> evalsha e412f6a7f0b07176d9824bb91205d9d54e88fdc0 0
(integer) 3
可以通过 script flush 命令来清空缓存中所有的 lua 脚本
代码语言:javascript复制script flush
用 eval 命令执行 lua 脚本
代码语言:javascript复制eval script numkeys key [key ...] arg [arg ...]
在第1行里,通过 eval 命令运行了双引号里的 lua 脚本,eval 命令的参数 1 表示有 1 个参数,name 和 'Peter' 分别对应于脚本里的KEYS[1] 和 ARGV[1]。由于本脚本是通过 return 语句返回 KEYS[1] 和 ARGV[1] 的,因此在第 2 行和第 3 行里能看到打印对应的值。
代码语言:javascript复制eval "return {KEYS[1], ARGV[1]}" 1 name peter
当某个脚本出现死循环或者出于其他原因需要终止当前正在运行的脚本时,可以使用 script kill 命令,如果当前并没有脚本在运行,那么执行该命令会看到如下第2行所示的输出结果。
代码语言:javascript复制127.0.0.1:6379> script kill
(error) NOTBUSY No scripts in execution right now.
排序命令
在 sort 命令里,可以通过 asc 参数进行升序排列操作,通过desc参数进行降序排列操作。
如果要对字符串类型的元素排序,需要加上 alpha 参数。
此外还可以通过 by 参数设置排序的模式。
用 limit 参数返回部分排序结果。
对于给定的数据对象,如果经常需要用相对固定的模式进行排序,就可以用 store 参数来缓存结果,这样每次做相同的排序动作时就不需要耗费资源从头做起了,可以从缓存中直接得到结果。
参考
基于 Docker 的 Redis 入门与实战-金华 胡书敏编著-微信读书 https://weread.qq.com/web/reader/f2932520725d0bbff2948bckc81322c012c81e728d9d180