那些容易被遗忘的 Redis 功能

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]

# 默认是按数值类型的正排序输出
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"
  • 添加权重 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 以作为权重
127.0.0.1:6379> mset Jared_weight 3 Nancy_weight 2 Lucy_weight 1
OK

# 以 上述 key 为权重,对有序集合(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"
  • 实现分页排序功能:

分页排序功能通过 LIMIT 修饰符限制:此修饰符带有 offset 参数,指定要跳过的元素数量;还带有 count 参数,指定了从 offset 开始要返回的元素数量

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"
  • 保存排序操作的结果

默认的,SORT 命令将返回排序后的元素给客户端。而 STORE 选项,可以将结果存储于到列表中,以代替返回到客户端。

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. 关键的慢日志

开启 Redis 的慢查询日志记录功能,可以帮助开发者更好的监视和优化查询功能,这主要与两个配置选项有关:

  • slowlog-log-slower-than 选项:指定执行时间超过多少微秒(1秒 = 1 000 000微秒)的命令将记录在日志上,默认是 10000微秒 = 0.01秒

  • slowlog-max-len 选项:指定最多保留多少条慢查询日志(先进先出),默认是 128

下面,我们通过 CONFIG SET 命令来更改上述两个选项的配置(也可以在redis.conf中更改),来看看慢查询日志功能的应用:

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

# 新增几条数据用于测试
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    # 标志Id
    2) (integer) 1552617567    # 时间戳
    3) (integer) 2    # 执行时长,单位:微秒
    4) 1) "SET"    # 执行命令
        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 查看慢日志记录条数
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. 数据备份恢复

Redis 实现持久化有两种方式:

  • RDB (redis data base):默认开启,对数据执行周期性的持久化,可以手动执行(SAVEBGSAVE),RDB 文件 dump.rdb 是个经过压缩的二进制文件,在服务启动时自动载入 (如果未开启 AOF)

    • save,阻塞进程,直到 RDB 文件创建完毕
    • bgsave,派生出子进程来负责创建 RDB 文件,lastsave可以检查该操作结果
  • AOF (append only file):以每条写入命令作为日志(可读),以 append-only 模式写进日志文件中,在 redis 重启的时候,可以通过回放 AOF 日志中的写入指令来重构整个数据集

    • bgrewriteaof,手动触发异步执行 AOF 文件的重写操作,用于优化压缩体积

扩展:Redis 的持久化有哪几种方式?不同的持久化机制都有什么优缺点?持久化机制具体底层是如何实现的?

来看看如何远程备份 rdb 文件:

# 远程服务器会执行bgsave操作,然后将 rdb 文件传输到当前客户端
$ 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.

如果需要恢复数据,只需将相应的备份文件移动到 redis 安装目录,然后重启服务即可。获取 redis 目录可以使用 CONFIG 命令:

127.0.0.1:6379> config get dir
1) "dir"
2) "/usr/local/etc/redis"

4. 压力性能测试

Redis 压力性能测试通过同时执行多个命令实现:redis-benchmark [option] [option value]

redis-benchmark 部分可选参数如下所示,更多使用 redis-benchmark --help 查看:

选项 描述 默认值
-h 指定服务器主机名 127.0.0.1
-p 指定服务器端口 6379
-c 指定并发连接数 50
-n 指定请求数 10000
-l 循环执行测试
-q 执行完一遍测试后退出

5. 命令行小工具

  • 实时查看当前 Redis 服务接收及处理的命令请求:MONITOR
  • 实时监控服务器的状态: 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
  • 查看执行命令统计的快照:info commandstats

输出包含命令执行了多少次,执行所耗费的毫秒数(含总时间及平均时间),重置统计结果使用 CONFIG RESETSTAT

文章已授权转载,原文链接:那些容易被遗忘的 Redis 功能

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 196,200评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,526评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,321评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,601评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,446评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,345评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,753评论 3 387
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,405评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,712评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,743评论 2 314
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,529评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,369评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,770评论 3 300
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,026评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,301评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,732评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,927评论 2 336

推荐阅读更多精彩内容

  • 1. 强大的排序 Redis 的 SORT 命令可以对列表(List)、集合(Set)和有序集合(Sorted S...
    happyJared阅读 816评论 0 46
  • 一、Redis高可用概述 在介绍Redis高可用之前,先说明一下在Redis的语境中高可用的含义。 我们知道,在w...
    空语阅读 1,591评论 0 2
  • 企业级redis集群架构的特点 海量数据 高并发 高可用 要达到高可用,持久化是不可减少的,持久化主要是做灾难恢复...
    lucode阅读 2,191评论 0 7
  • 一、Redis持久化概述 持久化的功能:Redis是内存数据库,数据都是存储在内存中,为了避免进程退出导致数据的永...
    心似南风阅读 909评论 0 1
  • 夜越深 色月静 呼吸明晰针落清 心声近 嘀嗒稳 窸窸窣窣呢哝滚 桔花淡 来香浓 昙花一现似浅缘 听夜哭 ...
    覃不可_静阅读 141评论 0 4