标题:【Redis11】Redis基础:服务端操作

文章目录
    分类:存储运维 标签:Redis

    Redis基础学习:服务端操作

    上回我们已经学习过了客户端的一些操作命令,今天我们就来继续学习服务器端的一些操作命令。这些命令其实平常用得比较多的也就那么几个,通常就是看一看服务器的一些相关信息。


    好吧,那么我们就先从查看服务器信息开始。

    服务器信息

    这个命令应该不少人知道的,INFO 命令,查看当前服务器的各种状态信息。

    127.0.0.1:6379> info
    # Server
    redis_version:6.2.6
    redis_git_sha1:00000000
    redis_git_dirty:0
    redis_build_id:c6f3693d1aced7d9
    redis_mode:standalone
    ……………………
    ……………………
    ……………………
    
    127.0.0.1:6379> info cpu
    # CPU
    used_cpu_sys:14.436791
    used_cpu_user:11.242336
    used_cpu_sys_children:0.004246
    used_cpu_user_children:0.001057

    它的参数是一个选项,可以选择查看内存、CPU消耗等信息,包括 server、clients、memory、persistence、stats、replication、cpu、command stats、cluster、keyspace、all、default 这些信息,很明显,默认情况下就是使用的 all 这个参数啦。

    命令信息

    命令相关的信息我们可以通过 COMMAND 命令来进行查看,它返回的是当前版本下所有 Redis 命令的详细信息,这个命令也是有子命令的,如果不给子命令的话,就是返回全部的信息。

    127.0.0.1:6379> COMMAND HELP
     1) COMMAND <subcommand> [<arg> [value] [opt] ...]. Subcommands are:
     2) (no subcommand)
     3)     Return details about all Redis commands.
     4) COUNT
     5)     Return the total number of commands in this Redis server.
     6) GETKEYS <full-command>
     7)     Return the keys from a full Redis command.
     8) INFO [<command-name> ...]
     9)     Return details about multiple Redis commands.
    10) HELP
    11)     Prints this help.
    
    127.0.0.1:6379> COMMAND
    …………
    …………
    …………
    224) 1) "exec"
         2) (integer) 1
         3) 1) noscript
            2) loading
            3) stale
            4) skip_slowlog
         4) (integer) 0
         5) (integer) 0
         6) (integer) 0
         7) 1) @slow
            2) @transaction
            
    127.0.0.1:6379> COMMAND COUNT
    (integer) 224

    目前在我的这个版本的 Redis 上,一共有 224 条命令,子命令 COMMAND COUNT 返回全部的命令数量。当然,我们也可以单独查看某个或多个指定的命令,使用子命令 COMMAND INFO xxx xxx 。

    127.0.0.1:6379> COMMAND INFO set get
    1) 1) "set"
       2) (integer) -3
       3) 1) write
          2) denyoom
       4) (integer) 1
       5) (integer) 1
       6) (integer) 1
       7) 1) @write
          2) @string
          3) @slow
    2) 1) "get"
       2) (integer) 2
       3) 1) readonly
          2) fast
       4) (integer) 1
       5) (integer) 1
       6) (integer) 1
       7) 1) @read
          2) @string
          3) @fast

    返回的命令信息包含命令的名称、数据规范、一些标志,具体的内容大家可以查看官方文档。不过最后的一些命令标志其实我们直接看这些名称也能看明白,比如 @write 是命令会导致修改,@string 表明这是 string 类型的,@fast 就是以常量或者 log(N) 的方式运行,而 @slow 就表示它比较慢啦。


    另外,通过 COMMAND GETKEYS 命令我们还可以获得要执行的命令的参数 key ,就像下面这样。

    127.0.0.1:6379> command getkeys set a 111
    1) "a"
    127.0.0.1:6379> command getkeys mset a 111 b 222
    1) "a"
    2) "b"

    配置信息及设置

    这里的配置信息主要指的就是服务器的配置,或者说是我们在 redis.conf 中的那些配置以及一些运行时的配置,说白了,就像是 MySQL 中 show variables 或者 show status 。它也是一个复合命令,有一些子命令可以使用。

    127.0.0.1:6379> CONFIG HELP
     1) CONFIG <subcommand> [<arg> [value] [opt] ...]. Subcommands are:
     2) GET <pattern>
     3)     Return parameters matching the glob-like <pattern> and their values.
     4) SET <directive> <value>
     5)     Set the configuration <directive> to <value>.
     6) RESETSTAT
     7)     Reset statistics reported by the INFO command.
     8) REWRITE
     9)     Rewrite the configuration file.
    10) HELP
    11)     Prints this help.

    我们先来看一下查看和修改,查看相关的配置使用 CONFIG GET ,修改配置的话使用 CONFIG SET 。

    127.0.0.1:6379> CONFIG GET *max-*-entries*
    1) "hash-max-ziplist-entries"
    2) "512"
    3) "set-max-intset-entries"
    4) "512"
    5) "zset-max-ziplist-entries"
    6) "128"
    127.0.0.1:6379> CONFIG SET hash-max-ziplist-entries 500
    OK
    127.0.0.1:6379> CONFIG GET hash-max-ziplist-entries
    1) "hash-max-ziplist-entries"
    2) "500"

    要想查看所有信息怎么办呢?直接 CONFIG GET * 就好啦。


    CONFIG RESETSTAT 命令用于还原当前系统中的一些统计信息,也就是我们在 INFO STATS 里面看到的信息,不过不是全部啊,只是一部分,主要是下面这些:

    • Keyspace hits

    • Keyspace misses

    • Number of commands processed

    • Number of connections received

    • Number of expired keys

    • Number of rejected connections

    • Latest fork(2) time

    • The aof_delayed_fsync counter

    ➜  ~ redis-cli info | grep keyspace
    keyspace_hits:8
    keyspace_misses:1
    
    127.0.0.1:6379> CONFIG RESETSTAT
    OK
    
    ➜  ~ redis-cli info | grep keyspace
    keyspace_hits:0
    keyspace_misses:0

    另外还有一个 CONFIG REWRITE 命令,它会将我们当前运行时的配置信息写入到 redis.conf 文件中,比如我们前面修改了 hash-max-ziplist-entries 的内容,大家可以自己尝试用一下 CONFIG REWRITE 然后再去你的 redis.conf 文件中看看是不是被设置成了我们修改的值了哦。

    内存信息

    内存信息非常重要,对于我们的调优来说非常有用,毕竟 Redis 就是个内存数据库,所以主要的内存命令操作还是以查询、检查、诊断为主的。同样的,它也是一个包含子命令的复合命令。

    127.0.0.1:6379> MEMORY help
     1) MEMORY <subcommand> [<arg> [value] [opt] ...]. Subcommands are:
     2) DOCTOR
     3)     Return memory problems reports.
     4) MALLOC-STATS    Return internal statistics report from the memory allocator.
     5) PURGE
     6)     Attempt to purge dirty pages for reclamation by the allocator.
     7) STATS
     8)     Return information about the memory usage of the server.
     9) USAGE <key> [SAMPLES <count>]
    10)     Return memory in bytes used by <key> and its value. Nested values are
    11)     sampled up to <count> times (default: 5).
    12) HELP
    13)     Prints this help.

    其中 MEMORY DOCTOR 是可以为我们当前的服务器状态进行诊断的,不过我这里没什么数据,看不到什么内容。然后 MEMORY MALLOC-STATS 命令我这里也显示当前不支持。MEMORY STATS 就是一些内存参数的信息,MEMORY USAGE 则可以查看某个 key 的内存占用情况。

    127.0.0.1:6379> MEMORY DOCTOR
    Hi Sam, this instance is empty or is using very little memory, my issues detector can't be used in these conditions. Please, leave for your mission on Earth and fill it with some data. The new Sam and I will be back to our programming as soon as I finished rebooting.
    
    127.0.0.1:6379> MEMORY MALLOC-STATS
    Stats not supported for the current allocator
    
    127.0.0.1:6379> MEMORY STATS
     1) "peak.allocated"
     2) (integer) 1207040
     ……………………
     ……………………
     …………………… 
    50) "1.5472098588943481"
    51) "fragmentation.bytes"
    52) (integer) 602640
    
    127.0.0.1:6379> MEMORY USAGE a
    (integer) 56

    监控命令执行

    监控是监控个啥类?其实这个监控就是可以监控到所有客户端向服务端发送的命令信息。

    // 客户端1
    127.0.0.1:6379> MONITOR
    OK
    
    // 客户端2
    127.0.0.1:6379> set a 111
    OK
    127.0.0.1:6379> get a
    "111"
    
    // 客户端1
    1652940576.074378 [0 127.0.0.1:63123] "set" "a" "111"
    1652940577.783409 [0 127.0.0.1:63123] "get" "a"

    是不是有点意思?感觉隐私都没了呀!

    保存数据

    保存数据相关的操作其实意思是将数据保存到 rdb 文件中,也就是将数据刷到硬盘上。默认情况下这个操作是系统定时去完成的,当然我们也可以手动完成,使用的是 SAVE 和 BGSAVE 命令。

    ➜  redis ll
    total 8
    -rw-r--r--  1 zhangyue  admin   107B  5 19 15:04 dump.rdb
    
    127.0.0.1:6379> mset a 111 b 222 c 333
    OK
    127.0.0.1:6379> save
    OK
    
    ➜  redis ll
    total 8
    -rw-r--r--  1 zhangyue  admin   129B  5 19 15:09 dump.rdb
    
    127.0.0.1:6379> mset c a 111 b 222 c 333
    OK
    127.0.0.1:6379> save
    OK
    
    127.0.0.1:6379> mset d 444 e 555 f 666
    OK
    127.0.0.1:6379> bgsave
    Background saving started
    
    ➜  redis ll
    total 8
    -rw-r--r--  1 zhangyue  admin   141B  5 19 15:13 dump.rdb
    

    通过上面的命令,我们可以看到 rdb 文件明显的发生了变化。当然,大部分情况下其实我们是不需要手动去刷盘的,直接让系统默认处理就好了,因为多多少少只要有读写硬盘的操作,必然就会带来性能的下降,特别是 Redis 还是单线程的。和 keys * 一样,SAVE 命令在线上也是千万别乱用的,如果是一定要用的话,用 BGSAVE ,从名字也看出来了,它是后端再起线程去执行刷盘操作的,这也是 Redis 自动持久化存储的默认命令。


    后面在学习进阶部分持久化策略相关的内容时,我们还会详细地说这一块的内容。

    删除全部

    删除全部数据使用 FLASHALL 或者 FLASHDB 都可以,FLUSHALL 是删除全部 16 个库的内容,FLUSHDB 只删除当前操作的库。

    127.0.0.1:6379> FLUSHALL
    OK
    127.0.0.1:6379> keys *
    (empty array)

    其它

    剩下的一些命令其实就非常简单了,我们可以看到返回当前的系统时间,所有数据 key 的总数量,当前版本信息以及如何快速交换内部的库。

    时间

    关于获取当前 Redis 服务器的时间,TIME 直接返回当前服务器时间戳以及对应的毫秒时间戳。

    127.0.0.1:6379> TIME
    1) "1652940501"
    2) "874432"

    另外一个 LASTSAVE 也返回一个时间戳,但是它返回的是最近一次成功将数据保存在磁盘的时间。比如在使用 BGSAVE 命令时,可以通过每 N 秒发送一个 LASTSAVE 命令来查看 BGSAVE 命令执行的结果。

    127.0.0.1:6379> LASTSAVE
    (integer) 1652940571

    内容数量

    这个没啥多说的啦,就是所有 key 的数量。

    127.0.0.1:6379> keys *
    1) "c"
    2) "d"
    3) "a"
    4) "b"
    127.0.0.1:6379> DBSIZE
    (integer) 4

    查看版本

    其实我们可以直接通过 redis-cli 和 redis-server 加上 -v 参数来查看版本信息,redis-server 启动的时候也能看到。不过在客户端连接后,也可以通过 LOLWUT 来查看,并且这个命令在 Redis5 以上的版本,还会返回版本的一个图形,大家可以自己看一下哦。

    ➜  ~ redis-cli -v
    redis-cli 6.2.6
    ➜  ~ redis-server -v
    Redis server v=6.2.6 sha=00000000:0 malloc=libc bits=64 build=c6f3693d1aced7d9
    ➜  ~ redis-cli
    127.0.0.1:6379> LOLWUT
    ……………………
    ……………………
    Dedicated to the 8 bit game developers of past and present.
    Original 8 bit image from Plaguemon by hikikomori. Redis ver. 6.2.6

    交换库

    最后就是交换库,这是啥意思?其实就是我们可以快速把内部库进行交换。

    127.0.0.1:6379> SWAPDB 0 1
    OK
    127.0.0.1:6379> get a
    (nil)
    127.0.0.1:6379> SELECT 1
    OK
    127.0.0.1:6379[1]> get a
    "111"

    之前我们一直没有操作过 1 库,现在使用 SWAPDB 命令交换 0 和 1 库,结果之前在 0 库的数据就跑到了 1 库上了,是不是非常方便。

    总结

    服务端这些相关的命令中,最经常用的其实就是 INFO ,主要也是为了查看以及统计一些服务器信息,另外 DBSIZE 可能也会比较常用。其它的命令,说实话,我是没怎么用过,甚至没有学习之前都不知道还有这些命令。但现在我发现,CONFIG、MEMORY 以及 SAVE、BGSAVE 是可以在很多特殊的情况下帮助我们处理很多事情的。这就是学习的魅力呀,不知总会变知道,每天增加一点点小知识总有一天会迎来巨大的蜕变。

    视频链接

    微信文章地址:https://mp.weixin.qq.com/s/y947HicG25Qot-Q8UW1yKA

    B站视频地址:https://www.bilibili.com/video/BV1Em4y1q7XA

    微信视频地址:https://mp.weixin.qq.com/s/YNX7m-GejNPmsSWabBoD4w

    搜索
    关注