1. 強大的排序
Redis 的 SORT 命令可以對列表(List)、集合(Set)和有序集合(Sorted Set)的元素值進行排序(快排算法)。
-
對列表(List)鍵進行排序:
127.0.0.1:6379> lpush numbers 3 4 1 5 2
(integer) 5
# 按插入順序返回列表元素
127.0.0.1:6379> lrange numbers 0 -1
1) "2"
2) "5"
3) "1"
4) "4"
5) "3"
127.0.0.1:6379> sort numbers [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]
# 默認(rèn)是按數(shù)值類型的正排序輸出
127.0.0.1:6379> sort numbers
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
# 還可以倒序進行輸出
127.0.0.1:6379> sort numbers desc
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
-
使用 ALPHA 選項對包含字符串值的集合鍵(Set)進行排序:
127.0.0.1:6379> sadd characters b d a e c
(integer) 5
# 集合元素的返回是無序的
127.0.0.1:6379> smembers characters
1) "e"
2) "a"
3) "d"
4) "b"
5) "c"
127.0.0.1:6379> sort characters [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [ASC|DESC] [ALPHA] [STORE destination]
# 有序輸出集合中的元素
127.0.0.1:6379> sort characters alpha
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> sort characters desc alpha
1) "e"
2) "d"
3) "c"
4) "b"
5) "a"
-
添加權(quán)重 weight 并以外部 key 進行排序,以有序集合(Sorted Set)鍵為例:
127.0.0.1:6379> zadd friends 8 Jared 7 Nancy 9 Lucy
(integer) 3
# 按元素的分值正序輸出
127.0.0.1:6379> zrange friends 0 -1 withscores
1) "Nancy"
2) "7"
3) "Jared"
4) "8"
5) "Lucy"
6) "9"
# 添加外部 key 以作為權(quán)重
127.0.0.1:6379> mset Jared_weight 3 Nancy_weight 2 Lucy_weight 1
OK
# 以 上述 key 為權(quán)重,對有序集合(Sorted Set)元素進行排序
127.0.0.1:6379> sort friends by *_weight
1) "Lucy"
2) "Nancy"
3) "Jared"
# 添加外部 key 用于獲取
127.0.0.1:6379> mset Jared-age 20 Nancy-age 19 Lucy-age 18
OK
# 追加 GET 命令獲取外部匹配 Key 的元素值
127.0.0.1:6379> sort friends by *_weight get *-age
1) "18"
2) "19"
3) "20"
# 可多次使用 GET 命令
127.0.0.1:6379> sort friends by *_weight get *-age get *_weight
1) "18"
2) "1"
3) "19"
4) "2"
5) "20"
6) "3"
# 還可以通過使用特殊 # 模式獲取 GET 元素本身
127.0.0.1:6379> sort friends by *_weight get *-age get *_weight get #
1) "18"
2) "1"
3) "Lucy"
4) "19"
5) "2"
6) "Nancy"
7) "20"
8) "3"
9) "Jared"
-
實現(xiàn)分頁排序功能:
分頁排序功能通過 LIMIT 修飾符限制:此修飾符帶有 offset 參數(shù),指定要跳過的元素數(shù)量;還帶有 count 參數(shù),指定了從 offset 開始要返回的元素數(shù)量:
127.0.0.1:6379> sort numbers
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> sort numbers limit 2 2
1) "3"
2) "4"
127.0.0.1:6379> sort numbers limit 2 2 desc
1) "3"
2) "2"
-
保存排序操作的結(jié)果
默認(rèn)的,SORT 命令將返回排序后的元素給客戶端。而 STORE 選項,可以將結(jié)果存儲于到列表中,以代替返回到客戶端。
127.0.0.1:6379> sort friends by *_weight store myfriends
(integer) 3
127.0.0.1:6379> debug object myfriends
Value at:0x7fa02a5121e0 refcount:1 encoding:quicklist serializedlength:33 lru:9111483 lru_seconds_idle:138 ql_nodes:1 ql_avg_node:3.00 ql_ziplist_max:-2 ql_compressed:0 ql_uncompressed_size:31
127.0.0.1:6379> lrange myfriends 0 -1
1) "Lucy"
2) "Nancy"
3) "Jared"
2. 關(guān)鍵的慢日志
開啟 Redis 的慢查詢?nèi)罩居涗浌δ?,可以幫助開發(fā)者更好的監(jiān)視和優(yōu)化查詢功能,這主要與兩個配置選項有關(guān):
slowlog-log-slower-than 選項:指定執(zhí)行時間超過多少微秒(1秒 = 1 000 000微秒)的命令將記錄在日志上,默認(rèn)是 10000微秒 = 0.01秒
slowlog-max-len 選項:指定最多保留多少條慢查詢?nèi)罩荆ㄏ冗M先出),默認(rèn)是 128
下面,我們通過 CONFIG SET 命令來更改上述兩個選項的配置(也可以在redis.conf中更改),來看看慢查詢?nèi)罩竟δ艿膽?yīng)用:
127.0.0.1:6379> config set slowlog-log-slower-than 0
OK
127.0.0.1:6379> config set slowlog-max-len 5
OK
# 新增幾條數(shù)據(jù)用于測試
127.0.0.1:6379> set test01 01
OK
127.0.0.1:6379> set test02 02
OK
127.0.0.1:6379> set test03 03
OK
127.0.0.1:6379> set test04 04
OK
127.0.0.1:6379> set test05 05
OK
127.0.0.1:6379> set test06 06
OK
# slowlog get 查看慢日志記錄
127.0.0.1:6379> slowlog get 3
1) 1) (integer) 182 # 標(biāo)志Id
2) (integer) 1552617567 # 時間戳
3) (integer) 2 # 執(zhí)行時長,單位:微秒
4) 1) "SET" # 執(zhí)行命令
2) "test01"
3) "01"
2) 1) (integer) 181
2) (integer) 1552617566
3) (integer) 2
4) 1) "SET"
2) "test02"
3) "02"
3) 1) (integer) 180
2) (integer) 1552617565
3) (integer) 1
4) 1) "SET"
2) "test03"
3) "03"
# slowlog len 查看慢日志記錄條數(shù)
127.0.0.1:6379> slowlog len
(integer) 5
# slowlog reset 清空慢日志記錄
127.0.0.1:6379> slowlog reset
OK
127.0.0.1:6379> slowlog get
(empty list or set)
3. 數(shù)據(jù)備份恢復(fù)
Redis 實現(xiàn)持久化有兩種方式:
-
RDB (redis data base):默認(rèn)開啟,對數(shù)據(jù)執(zhí)行周期性的持久化,可以手動執(zhí)行(
SAVE和BGSAVE),RDB 文件dump.rdb是個經(jīng)過壓縮的二進制文件,在服務(wù)啟動時自動載入 (如果未開啟 AOF)-
save,阻塞進程,直到 RDB 文件創(chuàng)建完畢 -
bgsave,派生出子進程來負(fù)責(zé)創(chuàng)建 RDB 文件,lastsave可以檢查該操作結(jié)果
-
-
AOF (append only file):以每條寫入命令作為日志(可讀),以 append-only 模式寫進日志文件中,在 redis 重啟的時候,可以通過回放 AOF 日志中的寫入指令來重構(gòu)整個數(shù)據(jù)集
-
bgrewriteaof,手動觸發(fā)異步執(zhí)行 AOF 文件的重寫操作,用于優(yōu)化壓縮體積
-
擴展:Redis 的持久化有哪幾種方式?不同的持久化機制都有什么優(yōu)缺點?持久化機制具體底層是如何實現(xiàn)的?
來看看如何遠(yuǎn)程備份 rdb 文件:
# 遠(yuǎn)程服務(wù)器會執(zhí)行bgsave操作,然后將 rdb 文件傳輸?shù)疆?dāng)前客戶端
$ redis-cli -host 192.168.x.x -port 6379 -a password --rdb ./dump.rdb.bak
SYNC sent to master, writing 1995841 bytes to './dump.rdb.bak'
Transfer finished with success.
如果需要恢復(fù)數(shù)據(jù),只需將相應(yīng)的備份文件移動到 redis 安裝目錄,然后重啟服務(wù)即可。獲取 redis 目錄可以使用 CONFIG 命令:
127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/local/etc/redis"
4. 壓力性能測試
Redis 壓力性能測試通過同時執(zhí)行多個命令實現(xiàn):redis-benchmark [option] [option value]
redis-benchmark 部分可選參數(shù)如下所示,更多使用 redis-benchmark --help 查看:
| 選項 | 描述 | 默認(rèn)值 |
|---|---|---|
| -h | 指定服務(wù)器主機名 | 127.0.0.1 |
| -p | 指定服務(wù)器端口 | 6379 |
| -c | 指定并發(fā)連接數(shù) | 50 |
| -n | 指定請求數(shù) | 10000 |
| -l | 循環(huán)執(zhí)行測試 | |
| -q | 執(zhí)行完一遍測試后退出 |
5. 命令行小工具
- 實時查看當(dāng)前 Redis 服務(wù)接收及處理的命令請求:
MONITOR
- 實時監(jiān)控服務(wù)器的狀態(tài):
redis-cli --stat
- 查看連接的客戶端情況:
info client
127.0.0.1:6379> info clients
# Clients
connected_clients:23
client_longest_output_list:0
client_biggest_input_buf:0
blocked_clients:0
- 查看具體的客戶端連接信息:
client list
- 掃描大 KEY:
redis-cli --bigkeys -i 0.1
- 查看執(zhí)行命令統(tǒng)計的快照:
info commandstats
輸出包含命令執(zhí)行了多少次,執(zhí)行所耗費的毫秒數(shù)(含總時間及平均時間),重置統(tǒng)計結(jié)果使用 CONFIG RESETSTAT
文章已授權(quán)轉(zhuǎn)載,原文鏈接:那些容易被遺忘的 Redis 功能