《Redis入门指南》阅读笔记

作者: JONE 分类: PHP/MySQL 发布时间: 2018-10-29 18:00

PDF文件下载链接: https://pan.baidu.com/s/1tlQFsa6G94yy_JVEbqlX4w   提取码: tzhn

p.18

Redis是一个字典结构的存储服务器,而实际上一个Redis实例提供了多个用来存储数据的字典,客户端可以指定存储在哪个字典中。这与我们熟知的在一个关系数据库实例中可以创建多个数据库类似,所以可以将其中每个字典都理解成一个独立的数据库。

每个数据库对外都是一个从 0 开始递增数字命名,Redis默认支持16个数据库,可以通过配置参数 detabases 来修改这一数字。客户端与Redis建立链接后会自动选择0号数据库,不过可以随时SELECT命令更换数据库,如选择1号数据库:

redis> SELECT  1
OK
redis [1]>  GET foo

p.26

Redis对于键的命名没有强制的要求,但比较好的实践是用 “对象类型:对象Id:对象属性” 来命名一个键,如使用键 user:1:friends 来存储ID为1的用户的好友列表。对于多个单词则推荐使用 “ . ” 分割。另外为了日后维护方便,键的命名一定要有意义,如 u:1:f  的可读性不如 user:1:friends 好(虽然采用较短的名称可以节省存储空间,但是由于键值的长度远远大于键名的长度,所以这部分节省大部分情况下不如可读性来得重要)。

p.33

散列类型适合存储对象:使用对象类别和ID构成键名,使用字段表示对象的属性,而字段值则存储属性值。(相当于将一个二维关系型数据表的每行进行一个键值对存储,而存储的文件类型为哈希类型)

P.48

一个集合类型的键可以存储至多 2³²-1=4294967295 个字符串。

p.68 事务

Redis中的事务时一组命令的集合。事务命令一样都是Redis的最小执行单位,一个事务中的命令要么都执行,要么多不执行。

p.79 排序

有序集合排序。集合类型提供了强大的集合操作命令,但是如果需要排序就要用到有序集合类型。有序集合常见的使用场景是大数据排序,如游戏的玩家排行榜,所以很少会需要获得键中的全部数据。

SORT 命令。SORT命令可以对列表类型,集合类型和有序集合类型键进行排序,并且可以完成与关系数据库中的链接查询类似的任务。

性能优化。SORT是Redis中最强大复杂的命令之一,如果使用不好很容易成为性能瓶颈。当需要排序的元素个较大时SORT命令的性能相对较低并且消耗较多的服务器性能。开发中使用SORT命令时需要注意以下几点:

  1. 尽可能减少待排序键中元素的数量
  2. 使用LIMIT参数只获取需要的数据
  3. 如果要排序的数据量较大,尽可能使用STORE参数将结果缓存。

p.86 任务队列

当页面需要进行如发送邮件/复杂数据运算等耗时较长的操作时会阻塞页面的渲染.为了避免用户等待太久,应该使用独立的线程来完成这类操作。不过一些编程语言或框架不易实现多线程,这是很容易想到通过其他进程来实现。设想有一个进程玩完成发邮件的功能,那么页面中只需要想办法通知这个进程向指定的地址发邮件就可以了。

通知的过程可以借助任务队列来实现。任务队列顾名思义,就是“传递任务的队列”。与任务队列进行交互的实体有两类,一类是生产者(producer),另一类是消费者(consumer)。生产者会将需要处理的任务放入到队列中,而消费者则不断的从任务中读入任务的信息并执行

对于发邮件这个操作来说页面程序就是生产者,而发邮件的进程就是消费者。当需要发送邮件时,页面程序会将收件地址、邮件主题和邮件正文组装成一个任务后存入任务队列中。同时发邮件的进程会不断检查任务队列,一旦有新的任务变回将其从队列中取出并执行。有次实现间的通信。

使用任务队列有如下好处。

1、松耦合

生产者和消费者无需指定彼此的实现细节,只需要约定好任务的描述格式。这使得生产者和消费者可以由不同的团队使用不同的编程语言编写。

2、易于扩展

消费者可以多个,而且可以分布在不同的服务器中,如图所示。借此可以轻易的降低单台服务器的负载。

p.87 使用Redis实现任务队列

说道队列就很容易想到Redis的列表类型,使用 LPUSH 和 RPOP 命令实现队列的概念。如果要实现任务队列,只需要让生产者将任务使用 LPUSH 命令加入到某个键中,另一边消费者不断的使用 RPOP 命令从改键中取出任务即可。

以上方法当任务队列中没有任务时消费者每秒都会调用一次 RPOP 命令查看是否有新任务。如果可以实现一旦有新任务加入队列就通知消费者就好了。其实借助 BRPOP 命令就可以实现这样的需求。

BRPOP 命令和 RPOP 命令相似,唯一区别就是当列表中没有元素时 BRPOP 命令会一直阻塞住连接,直到有新元素加入。

p.87 优先级队列

BRPOP 命令可以同时接收多个键,其完整的命令格式为 BLPOP key  [key …]  timeout,如 BLPOP  queue:1  0。意义是同时检测多个键,如果所有键都没有元素则阻塞,如果其中一个键有元素则会从改键中弹出元素。如果多个键都有元素则按照从左到右的顺序取第一个键中的元素。借此特性可以实现区分优先级的任务队列。我们分别使用 queue:confirmation.email 和 queue:notification.email 两个存储发送确认邮件和发送通知邮件两种任务。

p.90 “发布/订阅”模式

Redis还提供了一组命令可以让开发者实现 “发布/订阅” (publish/subscribe)模式。“发布/订阅” 同样可以实现进程间的消息传递,其原理是这样的:

“发布/订阅”模式中包含两种角色,分别是发布者和订阅者。订阅者可以订阅一个或若干个频道(channel),而发布者可以向指定的频道发送消息,所有订阅此频道的订阅者都会收到此消息。

发布者发布消息的命令是 PUBLISH,用法是 PUBLICH channel message ,如向channel1.1所以说 “hi” :

redis> PUBLISH   channel1.1   hi
(integer)  0

这样消息发出去了。PUBLISH 命令返回值表示接收这条消息的订阅者数量。因为没有客户端订阅channel1.1 ,所以返回0。发出去的消息不会被持久化,也就是说当有客户端订阅channel1.1后只能收到后续发布到该频道的消息,之前发送的就搜不到了。

订阅频道的命令是 SUBSCRIBE ,可以同时订阅多个频道,用法是 SUBSCRIBE  channel  [channel …] 。现在新开一个redis-cli 实例A,用它来订阅channel1.1:

redis A> SUBSCRIBE channel1.1
reading messages ... (press Ctrl-C  to quit)
1) "subscribe"
2) "channel1.1"
3) (integet) 1

执行 SUBSCRIBE 命令后客户端会进入订阅状态,处于此状态下客户端不能使用除 SUBSCRIBE、UNSUBSCRIBE、PSUBSCRIBE 和 PUNSUBSCRIBE 这4个属于“发布/订阅”模式的命令之外的命令,否则会报错。

进入订阅状态后客户端肯收到3种类型的回复。每种类型的回复都包含3个值,第一个值是消息类型,根据消息类型的不同,第二、三个值的含义也不同。消息类型可能的取值有以下3个。

  1.  subscribe。表示订阅成功的反馈信息。第二个值是订阅成功的频道名称,第三个值是当前客户端订阅的频道数量。
  2.  message。这个类型的回复是我们最关心的,它表示接收到的消息。第二个值表示产生消息的频道名称,第三个值是消息的内容。
  3.  unsubscribe。表示成功取消订阅某个频道。第二个值是对应的频道名称,第三个值是当前客户端订阅频道的数量,当此值为0时客户端会退出订阅状态,之后就可以执行其他非 “发布/订阅” 模式的命令了。

p.199 phpRedisAdmin

phpRedisAdmin 支持以树形结构查看键列表,编辑键值,导入/导出数据库数据,查看数据库信息和查看键信息等功能。

1、安装 phpRedisAdmin

安装 phpRedisAdmin 的方法如下:

git  clone  https://github.com/erikdubbelboer/phpRedisAdmin.git
cd  phpRedisAdmin

phpRedisAdmin 依赖的 Redis客户端 Predis,所以还需要执行下面两个命令下载 Predis:

git  submodule initgit  submodule  update

2、配置数据库连接

下载完 phpRedisAdmin 后需要配置 Redis 的链接信息.默认 phpRedisAdmin 会连接到127.0.0.1,端口号 6379,如果需要更改或者添加数据库信息可以编辑 include 文件夹中的 config.inc.php 文件。

3、使用 phpRedisAdmin

安装 php 和web服务器,并将 phpRedisAdmin 文件存放在网站目录中即可访问。

phpRedisAdmin自动将 Redis 的键以 “:” 分割并用树形结构显示出来。

4、性能

phpRedisAdmin 在获取键列表时使用的是 KEYS* 命令,然后对所有的键使用 TYPE 命令来获取其数据类型,所以当键非常多的时候性能并不高(对于一个有一百万个键的Redis数据库,在一台普通个人计算机上使用 KEYS * 命令大约会花费几十毫秒)。由于Redis 使用单线程处理命令,所以对生产环境下拥有大数据量的数据库来说不适宜使用 phpRedisAdmin 管理。

p.201 Rdbtools

Rdbtools 是一个 Redis 的快照文件解析器,它可以根据快照文件导出JSON数据文件/分析Redis中每个键占用空间情况等。Rdbtools是使用Python开发的,项目地址是 https://github.com/sripathikrishnan/redis-rdb-tools

1、安装 Rdbtools

使用如下命令安装:

git  clone  https://github.com/sripathikrishnan/redis-rdb-tools.git
cd  redis-rdb-tools
sudo python setup.py  install

2、生成快照文件

如果没有启用RBD持久化,可以使用 SAVE 命令手动是 Redis 生成快照文件.

3、将快照到处为JSON格式

快照文件是二进制格式,不利于查看,可以使用 Rdbtools 来将其倒出为JSON格式,命令如下:

rdb --command json  /path/to/dump.rdb > output_filename.json

其中 /path/to/dump.rdb 是快照文件的路径,outout_filename.json 为要倒出的文件的路径

4、生成空间使用情况报告

Rdbtools 能够将快照文件中记录的每个键的存储情况倒出为 CSV 文件,可以将CSV文件导入到Excel等数据分析工具中分析来了解Redis的使用情况。命令如下:

rdb -c memory  /path/to/dump.rdb > output_filename.csv

到处的CSV文件的字段及说明如下图

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注