欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Redis 的键命令、HyperLogLog 命令、脚本命令、连接命令、服务器命令

程序员文章站 2022-05-11 08:05:07
Redis 的键命令、HyperLogLog 命令、脚本命令、连接命令、服务器命令 Redis 的键命令 Redis 的键命令主要用于管理 Redis 的键,如删除键、查询键、修改键及设置某个键等。 1. EXISTS 命令:判断键是否存在 2. KEYS 命令:查找键 KEYS 命令用于按照指定的 ......

redis 的键命令、hyperloglog 命令、脚本命令、连接命令、服务器命令

redis 的键命令

redis 的键命令主要用于管理 redis 的键,如删除键、查询键、修改键及设置某个键等。

1. exists 命令:判断键是否存在

2. keys 命令:查找键

keys 命令用于按照指定的模式(pattern)查找所有的 key。参数 pattern 类似于正则表达式。

● keys*:表示匹配查找数据库中的所有 key。

● keys r?dis:表示匹配 radis、redis、rxdis 等。

● keys r*dis:表示匹配 rdis、redis、reeedis 等。

● keys r[ae]dis:表示匹配 radis 和 redis,但是不会匹配 ridis。

遇到特殊符号需要使用「\」隔开(转义)。

3. object 命令:查看键的对象

object 命令用于从内部查看给定 key 的 redis 对象。该命令通常用在除错或者为了节省空间而对 key 使用特殊编码的情况下。如果要用 redis 来实现与缓存相关的功能,则可以使用 object 命令来决定是否清除 key。

object 命令有如下子命令:

● object refcount key 用于返回给定 key 引用所存储的值的次数,多用于除错。

● object encoding key 用于返回给定 key 所存储的值所使用的底层数据结构。

● object idletime key 用于返回给定 key 自存储以来的空闲时间,以秒为单位。

redis 对象具有多种编码格式。

● 针对字符串可以被编码为 raw(一个字符串)或 int(redis 会将字符串表示的 64 位有符号整数编码为整数来存储,以此来节约内存)。

● 针对列表可以被编码为 ziplist 或 linkedlist。ziplist 是压缩列表,用来表示占用空间较小的列表。

● 针对集合可以被编码为 intset 或 hashtable。intset 是只存储数字的小集合的特殊表示。

● 针对哈希表可以被编码为 zipmap 或 hashtable。zipmap 是小哈希表的特殊表示。

● 针对有序集合可以被编码为 ziplist 或 skiplist。ziplist 主要用于表示小的有序集合;而 skiplist 可以表示任意大小的有序集合。

返回值:object 命令的子命令 refcount 和 idletime 会返回数字,而 encoding 会返回相对应的编码类型。

4. randomkey 命令:随机返回一个键

127.0.0.1:6379> exists student:name
(integer) 1
127.0.0.1:6379> keys *
1) "bookorder"
2) "book"
3) "student:id"
4) "str1"
5) "student:age"
6) "video:10010"
7) "student:name"
8) "student:home"
127.0.0.1:6379> object encoding video:10010
"raw"

5. rename 命令:修改键的名称(如果 newkey 已经存在,则 rename 命令执行后将会覆盖旧值。)

6. renamenx 命令:修改键的名称 (当且仅当 newkey 不存在时才能修改)

127.0.0.1:6379> rename str1 str
ok

7. dump 命令:序列化键

8.restore 命令:对序列化值进行反序列化

使用 dump 命令序列化生成的值具有以下特点:

● 这个值具有 64 位的校验和,用于检测错误。restore 命令在进行反序列化之前,会先检查校验和。

● 这个值的编码格式和 rdb 文件的编码格式保持一致。

● rdb 版本会被编码在序列化值中。如果 redis 的版本不同,那么这个 rdb 文件会存在不兼容,redis 也就无法对这个值进行反序列化。

● 这个序列化的值中没有生存时间信息。

127.0.0.1:6379> dump str
"\x00\xc0{\x06\x00\xde\x0f;a\xf5/[*"

9. pttl 命令:获取键的生存时间(毫秒)

10. ttl 命令:获取键的生存时间(秒)

11. expire 命令:设置键的生存时间(秒)

12. pexpire 命令:设置键的生存时间(毫秒)

13. expireat 命令:设置键的生存 unix 时间戳(秒)

14. pexpireat:设置键的生存 unix 时间戳(毫秒)

127.0.0.1:6379> expire str 10
(integer) 1
127.0.0.1:6379> ttl str
(integer) 5

15. migrate 命令:转移键值对到远程目标数据库

migrate host port key destination-db timeout [copy] [replace]

migrate 命令是原子操作,它在执行的时候会阻塞进行转移的两个数据库,直到转移成功,或转移失败,又或者出现等待超时。

migrate 命令的实现原理为:在当前数据库(源数据库)中,对给定的 key 执行 dump 命令,将它序列化后,转移到目标数据库中,目标数据库再使用 restore 命令对数据进行反序列化,将反序列化后的结果保存到数据库中;源数据库就好像目标数据库的客户端一样,只要遇到 restore 命令返回 ok,就会调用 del 命令删除自己数据库中的 key。

● 参数 timeout:用于设置当前数据库与目标数据库进行转移时的最大时间间隔,单位为毫秒。当转移的时间超过了 timeout 时,就会报请求超时。

migrate 命令需要在 timeout 时间范围内完成 i/o 操作。如果在转移数据的过程中发生了 i/o 操作,或者达到了超时时间,那么该命令将会终止执行,并返回一个特殊的错误:ioerr。出现 ioerr 错误有两种情况:

➢ 源数据库和目标数据库中可能同时存在这个 key。

➢ key 也可能只在源数据库中存在。

此时读者可能会问:会不会存在 key 丢失的情况?答案是:key 丢失的情况是不可能发生的。如果 migrate 命令在执行的过程中出现了其他错误,那么该命令可以保证这个 key 只存在于源数据库中。

● 参数 copy:如果在 migrate 命令中设置了 copy 参数,则表示在转移之后不会删除源数据库中的 key。

● 参数 replace:如果在 migrate 命令中设置了 replace 参数,则表示在转移过程中会替换目标数据库中已经存在的 key。

16. move 命令:转移键值对到本地目标数据库

127.0.0.1:6379> move student:name 1
(integer) 1
127.0.0.1:6379> select 1
ok
127.0.0.1:6379[1]> keys *
1) "student:name"

17. sort 命令:对键值对进行排序

排序默认以数字作为对象,值会被解释为 double 类型的浮点数,然后进行比较。

18. type 命令:获取键对应值的类型

127.0.0.1:6379[1]> type student:name
string

19. del 命令:删除键

127.0.0.1:6379[1]> del student:name
(integer) 1

20. persist 命令:删除键的生存时间

hyperloglog 命令

基数:举一个例子,有数据集{1,3,5,8,5,8,9},去掉重复数据之后,得到这个数据集的基数集为{1,3,5,8,9},这个基数集的基数就是 5。

基数的特点:基数不可重复,且基数估计在误差允许的范围内。

hyperloglog 是 redis 用来做基数统计的算法。当 redis 数据库中的数据量非常庞大时,使用 hyperloglog 命令来计算相关基数时,它具有所需空间固定、所占空间小的优点。在 redis 中,每个 hyperloglog 键只需要耗费 12kb 的内存,就可以计算接近 2^64 个不同元素的基数。hyperloglog 不会存储输入的元素,它仅仅根据输入的元素来计算基数,因此它不会返回输入的元素。

使用hyperloglog可以统计网站每天的uv数据

1.pfadd 命令:向 hyperloglog 中添加键值对。
127.0.0.1:6379> pfadd age-log 18 19 20 12 19 18
(integer) 1
2.pfcount 命令:获取 hyperloglog 的基数。
127.0.0.1:6379> pfcount age-log
(integer) 4

当给定的 key 有多个时,pfcount 命令返回给定 hyperloglog 的并集的近似基数,这个近似基数是通过将所有给定的 hyperloglog 合并到一个临时的 hyperloglog 中计算出来的。

3.pfmerge 命令:合并多个 hyperloglog 为一个新的 hyperloglog。

脚本命令

redis 脚本使用 lua 解释器来执行。使用 redis 脚本可以一次性将多个请求命令发送出去,以减少网络的开销;使用 redis 脚本实现原子操作,redis 会将整个脚本作为一个整体执行,中间不会有其他命令被执行,以此来保证原子性;使用 redis 脚本可以达到复用的目的,因为 redis 会永久保存客户端发送的脚本,所以其他客户端可以直接复用这个脚本。

redis 脚本命令用于操作 redis 脚本。

1.script load 命令:添加 lua 脚本到缓存中

script load 命令用于将脚本 script 添加到脚本缓存中,但是并不会立即执行这个脚本。该命令与 eval 命令相似,但是 eval 命令在将脚本添加到缓存中后,会立即对输入的脚本进行求值操作。如果给定的脚本已经在缓存中存在,那么这个命令什么也不做。脚本被加入缓存中以后,可以通过 evalsha 命令使用脚本的 sha1 校验和来调用这个脚本。

lua 脚本可以在 redis 的缓存中长时间保存,直到遇到 script flush 命令为止。

2.script exists 命令:判断脚本是否已在缓存中

3.eval 命令:对 lua 脚本求值

eval script numkeys key [key ...] arg [arg ...]

● 参数 script 是一段 lua 脚本程序,它运行在 redis 的服务器中。

● 参数 numkeys 用于指定键名参数的个数。

● 键名参数 key [key...]从 eval 命令的第三个参数开始算起,表示脚本中所用到的那些 redis 键(key)。在 lua 脚本中,可以使用全局变量 keys 数组(下标从 1 开始)

来访问这些键名参数。

● 参数 arg [arg...]是附加参数。在 lua 脚本中,可以使用 argv 数组(下标从 1 开始)来访问这些附加参数。

4. evalsha 命令:对缓存中的脚本求值(参数及用法同上)

5. script kill 命令:杀死正在运行的 lua 脚本

针对一个正在运行且没有执行过任何写操作的 lua 脚本,可以使用 script kill 命令来杀死它。script kill 命令主要用于终止运行时间过长的脚本。该命令执行之后,当前正在运行的脚本会被杀死,执行这个脚本的客户端会从 eval 命令的阻塞当中退出,并收到一个错误的返回值。

如果这个正在运行的脚本执行过写操作,那么使用 script kill 命令是无法杀死它的。lua 脚本是原子性执行的。如果你非要杀死这个运行中的 lua 脚本,则可以使用 shutdown nosave 命令来直接关闭整个 redis 进程,进而停止这个脚本的运行,并防止不完整的数据写入数据库中。

6. script flush 命令:清除缓存中的 所有lua 脚本

连接命令

redis 连接命令主要用于连接 redis 的服务,如查看服务状态、切换数据库等

1. auth 命令:用于解锁密码。
2. quit 命令:断开客户端与服务器的连接。
3. ping 命令:查看服务器的运行状态。
127.0.0.1:6379> ping
pong
4. echo 命令:输出打印消息。
5.select 命令:切换数据库。
127.0.0.1:6379> select 1
ok

服务器命令

redis 服务器命令主要用于操作管理 redis 服务,比如,管理 redis 的日志,保存数据,修改相关配置等。

1.client list 命令:获取客户端相关信息
127.0.0.1:6379[1]> client list
id=9 addr=127.0.0.1:52421 fd=10 name= age=457 idle=0 flags=n db=1 sub=0 psub=0 multi=-1 qbuf=0 qbuf-free=32768 obl=0 oll=0 omem=0 events=r cmd=client

返回的域含义如下。

● id:表示客户端编号。

● addr:表示客户端的地址(ip 地址 + 端口)。

● fd:表示套接字所使用的文件描述符。

● age:表示已连接时长,单位为秒。

● idle:表示连接空闲时长,单位为秒。

● flags:表示客户端 flag(见下文)。

● db:指明该客户端正在使用的数据库,数值表示数据库的索引号。

● sub:表示已订阅的消息频道数量。

● psub:表示已订阅模式的数量。

● multi:表示在事务中被执行的命令数量。

● qbuf:表示查询缓冲区的长度,0 表示没有分配查询缓冲区,单位为字节。

● qbuf-free:表示查询缓冲区剩余空间的长度,0 表示没有剩余空间,单位为字节。

● obl:表示输出缓冲区的长度,0 表示没有分配输出缓冲区,单位为字节。

● oll:表示输出列表中包含的对象数量。如果输出缓冲区没有剩余空间,则命令回复会以字符串对象的形式被添加到这个队列中。

● omem:表示输出缓冲区和输出列表占用的内存总量。

● events:表示文件描述符事件。

➢ r:在 loop 事件中,表示套接字是可读的。

➢ w:在 loop 事件中,表示套接字是可写的。

● cmd:表示最近一次执行的命令。

客户端 flag 可以由以下几部分组成。

● o:客户端是 monitor 模式下的附属节点(slave)。

● s:客户端是一般模式下(normal)的附属节点。

● m:客户端是主节点(master)。

● x:客户端正在执行事务。

● b:客户端正在等待阻塞事件。

● i:客户端正在等待 vm i/o 操作(已废弃)。

● d:一个受监视(watched)的键已被修改,exec 命令将执行失败。

● c:在将回复完整地写出来之后,关闭连接。

● u:客户端未被阻塞(unblocked)。

● a:尽可能快地关闭连接。

● n:未设置任何 flag。

2. client getname 命令:获取客户端名字

3. client setname 命令:设置客户端名字

4. client pause 命令:在指定时间范围内停止运行来自客户端的命令

5. client kill 命令:关闭客户端连接
127.0.0.1:6379[1]> client kill 127.0.0.1:52421
ok
6. command 命令:查看 redis 命令的详细信息
127.0.0.1:6379[1]> command
  1) 1) "bitpos"
     2) (integer) -3
     3) 1) readonly
     4) (integer) 1
     5) (integer) 1
     6) (integer) 1
     。。。。。。

7. command count 命令:统计 redis 的命令个数

8. command getkeys 命令:获取指定的所有键

9. command info 命令:查看 redis 命令的描述信息

10. dbsize 命令:统计当前数据库中键的数量

11. info 命令:查看服务器的各种信息

127.0.0.1:6379> info server
# server
redis_version:3.0.504
redis_git_sha1:00000000
redis_git_dirty:0
redis_build_id:a4f7a6e86f2d60b3
redis_mode:standalone
os:windows
arch_bits:64
multiplexing_api:winsock_iocp
process_id:11760
run_id:cf21313e82a0f23bf2cb01e2379739b8076ad2e4
tcp_port:6379
uptime_in_seconds:82434
uptime_in_days:0
hz:10
lru_clock:8057624
config_file:

参数 section 的设置可以让 info 命令只返回某一部分的信息。

info 命令执行后,会返回如下几部分的信息。

● server 部分:该部分主要说明 redis 的服务器信息。

● clients 部分:该部分记录了已连接客户端的信息。

● memory 部分:该部分记录了 redis 服务器的内存相关信息。

● persistence 部分:该部分记录了与持久化(rdb 持久化和 aof 持久化)相关的信息。

● stats 部分:该部分记录了相关的统计信息。

● replication 部分:该部分记录了 redis 数据库主从复制信息。

● cpu 部分:该部分记录了 cpu 的计算量统计信息。

● commandstats 部分:该部分记录了 redis 各种命令的执行统计信息,如执行命令消耗的 cpu 时间、执行次数等。

● cluster 部分:该部分记录了与 redis 集群相关的信息。

● keyspace 部分:该部分记录了与 redis 数据库相关的统计信息,如键的数量。

参数 section 除可以取上面的值以外,它的值还可以是 all(表示返回所有信息)和 default (表示返回默认选择的信息)。

12. lastsave 命令:获取最近一次保存数据的时间(unix 时间戳。)

127.0.0.1:6379> lastsave
(integer) 1585106127

13. monitor 命令:实时打印服务器接收到的命令

14. time 命令:获取当前服务器的时间
15. config set 命令:修改 redis 服务器的配置
16. config get 命令:查看 redis 服务器的配置
127.0.0.1:6379> config set requirepass 123456
ok
127.0.0.1:6379> config get requirepass
(error) noauth authentication required.
127.0.0.1:6379> auth 123456
ok
127.0.0.1:6379> config get requirepass
1) "requirepass"
2) "123456"

17. config resetstat 命令:重置 info 命令中的统计数据

config resetstat 命令用于重置 info 命令中的一些统计数据,具体如下。

● keyspace hits:表示键空间命中次数。

● keyspace misses:表示键空间不命中次数。

● number of commands processed:表示执行命令的次数。

● number of connections received:表示连接服务器的次数。

● number of expired keys:表示过期 key 的数量。

● number of rejected connections:表示被拒绝的连接数量。

● latest fork(2)time:表示最后执行 fork(2)的时间。

● the aof_delayed_fsync counter:表示 aof_delayed_fsync 计数器的值。

18. config rewrite 命令:改写 redis 配置文件

19. bgrewriteaof 命令:执行 aof 文件重写操作

bgrewriteaof 命令用于执行一个 aof 文件重写操作。该命令执行后,会创建一个当前 aof 文件的优化版本。当 bgrewriteaof 命令执行失败时,aof 文件数据并不会丢失。旧的 aof 文件在 bgrewriteaof 命令执行成功之前是不会被修改的,因此不存在数据丢失问题。

在 redis 的高版本(redis 2.4 以后)中,aof 文件的重写将由 redis 自动触发,使用 bgrewriteaof 命令只是用于手动触发重写操作。

20. save 命令:将数据同步保存到磁盘中

save 命令用于保存数据到磁盘中。save 命令具体执行的是一个同步保存操作,它以 rdb 文件的形式将当前 redis 的所有数据快照保存到磁盘中。在生产环境中,不建议使用 save 命令来保存数据,因为它在执行后会阻塞所有客户端。推荐使用 bgsave 命令来异步执行保存数据的任务。如果后台子进程保存数据失败,或者出现其他问题,则可以使用 save 命令来做最后的保存

21.bgsave 命令:将数据异步保存到磁盘中

bgsave 命令用于在 redis 服务后端采用异步的方式将数据保存到当前数据库的磁盘中。

bgsave 命令的执行原理:在 bgsave 命令执行后会返回 ok,之后 redis 启动一个新的子进程,原来的 redis 进程(父进程)继续执行客户端请求操作,而子进程则负责将数据保存到磁盘中,然后退出。

我们可以使用 lastsave 命令来查看相关信息,进而判断 bgsave 命令是否将数据保存成功。

22. sync 命令,psync 命令

sync, psync 命令是 redis 复制功能的内部命令

23. slaveof 命令:修改复制功能

在 redis 运行时,可以使用 slaveof 命令动态修改复制功能的行为。我们利用 slaveof host port 命令来修改当前服务器,使其转变为指定服务器的从属服务器(slave server)。如果当前服务器是某个主服务器的从属服务器,则在执行 slaveof host port 命令后,会使当前服务器停止对旧主服务器的同步,并且将旧数据集丢弃,然后开始对新主服务器数据进行同步。

如果想在同步时不丢失数据集,则可以使用 slaveof no one 命令,该命令执行后不会丢弃同步数据集。当主服务器出现故障的时候,我们可以利用该命令将从属服务器用作新的主服务器,实现数据不丢失,不间断运行。

24. role 命令:查看主从服务器的角色

25. slowlog 命令:管理 redis 的慢日志

slow log(慢日志)是 redis 的日志系统,用于记录查询执行时间。查询执行时间指的是执行一个查询命令所耗费的时间,它不包括客户端响应、发送信息等 i/o 操作。slow log 保存在内存里面,读/写速度非常快。

26. shutdown 命令:关闭 redis 服务器或客户端

shutdown 命令具有多种作用,具体如下:

● 直接关闭 redis 服务器。a

● 关闭(停止)所有客户端。

● 在 aof 选项被打开的情况下,执行 shutdown 命令将会更新 aof 文件。

● 如果 redis 服务中至少存在一个保存点在等待,则在执行 shutdown 命令的同时将会执行 save 命令。

在持久化被打开的情况下,执行 shutdown 命令,它会保证服务器正常关闭,不会丢失任何数据。

shutdown save 命令会强制 redis 数据库执行保存命令,即使没有设置保存点,也会执行。

shutdown nosave 命令的作用与 shutdown save 命令的作用刚好相反,它会阻止 redis 数据库执行保存操作,即使设置了一个或多个保存点,也会阻止。