写在前面
学习《redis入门指南》笔记,结合实践,只记录重要,明确,属于新知的相关内容。
安全
1、可以使用bind参数绑定一个地址,使redis只接受这个地址的连接。
2、使用requirepass参数,设置一个redis密码,使得每次客户端连接时都要发送密码,当执行复制时,如果主库设置了密码,需要在从库的配置文件通过masterauth参数设置主库的密码。
3、对命令重命名,只需要在配置文件中配置参数rename-command,格式为:
1 rename-command 原命令名称 新命令名称
若要禁用某个命令,可以重命名成空字符串 “” 。
通信协议
4、redis支持两种协议,一种是比较直观的在telnet中输入的简单协议,另一种是二进制安全的统一请求协议,这两种协议只是命令的格式有区别,命令返回值的格式是一样的。
5、简单协议适合在telnet中与redis通信,格式只是简单的将命令和各个参数以空格分开。
6、返回值格式有5种:
a、错误回复
以 - 开头,加错误信息,以 \r\n 结尾
-ERR unknown command 'haha'\r\n
b、状态回复
加状态信息,以\r\n结尾
+OK\r\n
c、整数回复
以+开头,加数字,以\r\n结尾
+3\r\n
d、字符串回复
以$开头,加字符串长度并以\r\n分隔,加字符串内容,以\r\n结尾
$3\r\nPONG\r\n
如果返回值为nil,则以$-1和空字符串区别
e、多行字符串回复
以*开头,加字符串组数并以\r\n分隔,加字符串回复的具体内容
*3\r\n$1\r\n3\r\n$1\r\n2\r\n$3\r\n1\r\n
7、统一请求协议的格式和多行字符串回复的格式类似,如:
SET foo bar
*3\r\n$3\r\nSET\r\n$3\r\nfoo\r\n1\r\n$3\r\nbar\r\n
管理工具
8、使用redis-cli查看耗时日志
SLOWLOG GET
通过配置文件参数slow-log-slower-than设置耗时命令的限制,单位为微秒,设置为负数则代表关闭慢日志;slow-max-len限制记录条数,耗时命令日志记录在内存中。每条耗时命令日志包含4个组成部分:日志唯一id、执行的UNIX时间、执行耗时(微秒)、命令及其参数。
9、命令监控MONTITOR,执行这个命令后,redis会将所有执行的命令都会在redis-cli打印出来,这个命令会降低一半的负载能力,仅用于调试。(Instagram团队使用python开发的基于monitor命令的工具redis-faina,可以分析出最常用的命令,访问最频繁的键等信息)
10、工具Rdbtools是一个redis的快照文件解析器,可以将快照数据导出JSON数据文件,分析redis种每个键的占用情况。也可以将每个键的存储情况导出CSV文件便于分析。示例如下:
1 rdb --command json /path/redisdump.rdb > rdboutput.json 2 rdb -c memory /path/redisdump.rdb > rdboutput.cvs
redis命令属性
11、REDIS_CMD_WRITE
表示会修改数据库数据,只读从库不可执行这类命令,另外lua脚本中在执行了拥有REDIS_CMD_RANDOM属性的命令后,不可执行拥有此属性的命令。
12、REDIS_CMD_DENYOOM
表示可能增加redis占用的存储空间,拥有此属性的命令必然拥REDIS_CMD_WRITE属性,反之不然。当占用空间达到配置文件maxmemory参数指定的值且根据maxmemory-policy参数无法释放空间时,会拒绝执行此类命令。
13、REDIS_CMD_NOSCRIPT
拥有此属性的命令无法在脚本中执行
14、REDIS_CMD_RANDOM
脚本中在执行了拥有此属性的命令后,不可执行拥有REDIS_CMD_WRITE属性的命令。
15、REDIS_CMD_SORT_FOR_SCRIPT
拥有此属性的命令会产生随机结果,在脚本中使用时,redis会对结果进行排序。
16、REDIS_CMD_LOADING
redis在启动时(将数据从硬盘载入到内存)只会执行拥有此属性的命令。