Redis基礎學習:服務端操作
上回我們已經(jīng)學習過了客戶端的一些操作命令,今天我們就來繼續(xù)學習服務器端的一些操作命令。這些命令其實平常用得比較多的也就那么幾個,通常就是看一看服務器的一些相關信息。
好吧,那么我們就先從查看服務器信息開始。
服務器信息
這個命令應該不少人知道的,INFO 命令,查看當前服務器的各種狀態(tài)信息。
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
它的參數(shù)是一個選項,可以選擇查看內(nèi)存、CPU消耗等信息,包括 server、clients、memory、persistence、stats、replication、cpu、command stats、cluster、keyspace、all、default 這些信息,很明顯,默認情況下就是使用的 all 這個參數(shù)啦。
命令信息
命令相關的信息我們可以通過 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 返回全部的命令數(shù)量。當然,我們也可以單獨查看某個或多個指定的命令,使用子命令 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
返回的命令信息包含命令的名稱、數(shù)據(jù)規(guī)范、一些標志,具體的內(nèi)容大家可以查看官方文檔。不過最后的一些命令標志其實我們直接看這些名稱也能看明白,比如 @write 是命令會導致修改,@string 表明這是 string 類型的,@fast 就是以常量或者 log(N) 的方式運行,而 @slow 就表示它比較慢啦。
另外,通過 COMMAND GETKEYS 命令我們還可以獲得要執(zhí)行的命令的參數(shù) 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 命令用于還原當前系統(tǒng)中的一些統(tǒng)計信息,也就是我們在 INFO STATS 里面看到的信息,不過不是全部啊,只是一部分,主要是下面這些:
- Number of commands processed
- Number of connections received
- Number of rejected connections
- 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 的內(nèi)容,大家可以自己嘗試用一下 CONFIG REWRITE 然后再去你的 redis.conf 文件中看看是不是被設置成了我們修改的值了哦。
內(nèi)存信息
內(nèi)存信息非常重要,對于我們的調(diào)優(yōu)來說非常有用,畢竟 Redis 就是個內(nèi)存數(shù)據(jù)庫,所以主要的內(nèi)存命令操作還是以查詢、檢查、診斷為主的。同樣的,它也是一個包含子命令的復合命令。
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 是可以為我們當前的服務器狀態(tài)進行診斷的,不過我這里沒什么數(shù)據(jù),看不到什么內(nèi)容。然后 MEMORY MALLOC-STATS 命令我這里也顯示當前不支持。MEMORY STATS 就是一些內(nèi)存參數(shù)的信息,MEMORY USAGE 則可以查看某個 key 的內(nèi)存占用情況。
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
監(jiān)控命令執(zhí)行
監(jiān)控是監(jiān)控個啥類?其實這個監(jiān)控就是可以監(jiān)控到所有客戶端向服務端發(fā)送的命令信息。
// 客戶端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"
是不是有點意思?感覺隱私都沒了呀!
保存數(shù)據(jù)
保存數(shù)據(jù)相關的操作其實意思是將數(shù)據(jù)保存到 rdb 文件中,也就是將數(shù)據(jù)刷到硬盤上。默認情況下這個操作是系統(tǒng)定時去完成的,當然我們也可以手動完成,使用的是 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 文件明顯的發(fā)生了變化。當然,大部分情況下其實我們是不需要手動去刷盤的,直接讓系統(tǒng)默認處理就好了,因為多多少少只要有讀寫硬盤的操作,必然就會帶來性能的下降,特別是 Redis 還是單線程的。和 keys * 一樣,SAVE 命令在線上也是千萬別亂用的,如果是一定要用的話,用 BGSAVE ,從名字也看出來了,它是后端再起線程去執(zhí)行刷盤操作的,這也是 Redis 自動持久化存儲的默認命令。
后面在學習進階部分持久化策略相關的內(nèi)容時,我們還會詳細地說這一塊的內(nèi)容。
刪除全部
刪除全部數(shù)據(jù)使用 FLASHALL 或者 FLASHDB 都可以,F(xiàn)LUSHALL 是刪除全部 16 個庫的內(nèi)容,F(xiàn)LUSHDB 只刪除當前操作的庫。
127.0.0.1:6379> FLUSHALL
OK
127.0.0.1:6379> keys *
(empty array)
其它
剩下的一些命令其實就非常簡單了,我們可以看到返回當前的系統(tǒng)時間,所有數(shù)據(jù) key 的總數(shù)量,當前版本信息以及如何快速交換內(nèi)部的庫。
時間
關于獲取當前 Redis 服務器的時間,TIME 直接返回當前服務器時間戳以及對應的毫秒時間戳。
127.0.0.1:6379> TIME
1) "1652940501"
2) "874432"
另外一個 LASTSAVE 也返回一個時間戳,但是它返回的是最近一次成功將數(shù)據(jù)保存在磁盤的時間。比如在使用 BGSAVE 命令時,可以通過每 N 秒發(fā)送一個 LASTSAVE 命令來查看 BGSAVE 命令執(zhí)行的結(jié)果。
127.0.0.1:6379> LASTSAVE
(integer) 1652940571
內(nèi)容數(shù)量
這個沒啥多說的啦,就是所有 key 的數(shù)量。
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 參數(shù)來查看版本信息,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
交換庫
最后就是交換庫,這是啥意思?其實就是我們可以快速把內(nèi)部庫進行交換。
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 庫,現(xiàn)在使用 SWAPDB 命令交換 0 和 1 庫,結(jié)果之前在 0 庫的數(shù)據(jù)就跑到了 1 庫上了,是不是非常方便。
總結(jié)
服務端這些相關的命令中,最經(jīng)常用的其實就是 INFO ,主要也是為了查看以及統(tǒng)計一些服務器信息,另外 DBSIZE 可能也會比較常用。其它的命令,說實話,我是沒怎么用過,甚至沒有學習之前都不知道還有這些命令。但現(xiàn)在我發(fā)現(xiàn),CONFIG、MEMORY 以及 SAVE、BGSAVE 是可以在很多特殊的情況下幫助我們處理很多事情的。這就是學習的魅力呀,不知總會變知道,每天增加一點點小知識總有一天會迎來巨大的蛻變。