06Redis入门指南笔记(安全、通信协议、管理工具)
一:安全
1:可信的环境
Redis以简洁为美。在安全层面Redis也没有做太多的工作。Redis的安全设计是在“Redis运行在可信环境”这个前提下做出的。在生产环境运行时不能允许外界直接连接到 Redis 服务器上,而应该通过应用程序进行中转,运行在可信的环境中是保证Redis安全的最重要方法。
Redis的默认配置会接受来自任何地址发送来的请求,要更改这一设置,可以修改配置文件中的bind参数,如只允许若干IP连接Redis,可如下修改:
bind 192.168.1.100 10.0.0.1
bind 127.0.0.1
如果想更自由地设置访问规则需要通过防火墙来完成。
2:数据库密码
可以通过配置文件中的requirepass参数为Redis设置一个密码。例如:
requirepass TAFK(@~!ji^XALQ(sYh5xIwTn5D$s7JF
客户端每次连接到 Redis 时都需要发送密码,否则Redis 会拒绝执行客户端发来的命令。发送密码需要使用auth命令,例如:
not connected> ping
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth TAFK(@~!ji^XALQ(sYh5xIwTn5D$s7JF
OK
127.0.0.1:6379> ping
PONG
认证之后就可以执行任何命令了。由于Redis的性能极高,并且输入错误密码后Redis并不会进行主动延迟(考虑到Redis的单线程模型),所以攻击者可以通过穷举法破解Redis的密码,因此在设置时一定要选择复杂的密码。
3:命名命令
Redis 支持在配置文件中将命令重命名,比如将 flushall 命令重命名成一个比较复杂的名字,以保证只有自己的应用可以使用该命令。就像这样:
rename-command FLUSHALL oyfekmjvmwxq5a9c8usofuo369x0it2k
这种情况下,如果执行flushall命令,则会报错:
127.0.0.1:6379> flushall
(error) ERR unknown command 'flushall'
如果希望直接禁用某个命令,可以将命令重命名成空字符串:
rename-command FLUSHALL ””
注意,无论设置密码还是重命名命令,都需要保证配置文件的安全性,否则就没有任何意义了。
二:通信协议
Redis通信协议是Redis客户端与 Redis之间交流的语言,通信协议规定了命令和返回值的格式。了解Redis通信协议后不仅可以理解AOF文件的格式和主从复制时主数据库向从数据库发送的内容等,还可以开发自己的 Redis 客户端(不过由于几乎所有常用的语言都有相应的Redis客户端,需要使用通信协议直接和Redis打交道的机会不多)。
Redis支持两种通信协议,一种是二进制安全的统一请求协议(unified request protocol),另一种是比较直观的,便于在 telnet程序中输入的简单协议。这两种协议只是命令的格式有区别,命令返回值的格式是一样的。
1:简单协议
简单协议适合在telnet程序中和Redis 通信。简单协议的命令格式就是将命令和各个参数使用空格分隔开,如”exists foo”、”set foo bar”等。
由于 Redis 解析简单协议时只是简单地以空格分隔参数,所以无法输入二进制字符。比如:
root@localhost:~# telnet 127.0.0.1 6379
Trying 127.0.0.1...
Connected to 127.1.
Escape character is '^]'.
set foo bar
+OK
get foo
$3
bar
lpush plist 1 2 3
:3
lrange plist 0 -1
*3
$1
3
$1
2
$1
1
errcommand
-ERR unknown command 'errcommand'
在telnet程序中输入的5条命令恰好展示了Redis的5种返回值类型的格式,之前介绍过这5种返回值类型在redis-cli 中的展现形式,这些展现形式是经过redis-cli封装的,而上面的内容才是 Redis真正返回的格式:
a:错误回复,以”-“开头,在后面跟上错误信息,最后以”\r\n”结尾:
-ERR unknown command 'errcommand'
b:状态回复,以”+”开头,在后面跟上状态信息,最后以”\r\n”结尾:
+OK
c:整数回复,以”:”开头,在后面跟上数字,最后以”\r\n”结尾:
:3
d:字符串回复,以”$”开头,并在后面跟上字符串的长度和”\r\n”,接着是字符串的内容和”\r\n” :
$3
bar
如果返回值是空结果nil,则会返回 “$-1”以和空字符串相区别。
e:多行字符串回复,以”*”开头,后面跟上字符串回复的组数和”\r\n”,接着后面跟的就是字符串回复的具体内容了:
*3
$1
3
$1
2
$1
1
2:统一请求协议
统一请求协议,其命令格式和上面多行字符串回复的格式很类似,比如要发送命令”set foobar hello”时,只需要按照上面介绍的格式发送即可。例子如下:
root@localhost:~# telnet 127.0.0.1 6379
Trying 127.0.0.1...
Connected to 127.1.
Escape character is '^]'.
*3
$3
set
$6
foobar
$5
hello
+OK get foobar
$5
hello *2
$3
get
$6
foobar
$5
hello
发送命令时指定了后面字符串的长度,所以命令的每个参数都可以包含二进制的字符。统一请求协议的返回值格式和简单协议一样,这里不再赘述。
Redis的AOF文件和主从复制时主数据库向从数据库发送的内容都使用了统一请求协议。如果要开发一个和Redis直接通信的客户端,推荐使用此协议。如果只是想通过telnet向Redis服务器发送命令则使用简单协议就可以了。
三:管理工具
1:redis-cli
作为 Redis 自带的命令行客户端,可以从任何安装有Redis的服务器中找到它,所以对于管理Redis而言,redis-cli是最简单实用的工具。
redis-cli可以执行大部分的Redis命令,下面介绍几个管理Redis时非常有用的命令:
a:慢查询日志功能
当一条命令执行时间超过限制时,Redis会将该命令的执行时间等信息加入慢查询日志(slow log)以供开发者查看。关于慢查询的配置选项有:
slowlog-log-slower-than 10000
slowlog-max-len 128
“slowlog-log-slower-than”参数指明记录慢查询的时间设置,单位是微秒(1000000微秒相当于1秒),负数表明将禁用慢查询日志功能,0表明将记录每个命令。注意这里的时间仅指命令执行时间,不包括IO时间(比如与客户端通信的事件)。
慢查询日志存储在内存中,可以通过“slowlog-max-len”参数来限制记录的条数。超过时,新命令将替换最早的命令。
使用”slowlog get”命令可获得当前的慢查询日志,为了验证该命令,将配置文件的“slowlog-log-slower-than”置为0。然后执行命令”set foo bar”和”get foo”,如:
127.0.0.1:6379> slowlog get
1) 1) (integer) 2
2) (integer) 1449296176
3) (integer) 15
4) 1) "get"
2) "foo"
2) 1) (integer) 1
2) (integer) 1449296173
3) (integer) 14
4) 1) "set"
2) "foo"
3) "bar"
每条日志都由以下4个部分组成:
该日志唯一ID;
该命令执行的Unix时间;
该命令的耗时时间,单位是微秒;
命令及其参数
b:命令监控功能
Redis提供了monitor命令来监控 Redis执行的所有命令,redis-cli支持这个命令,如在终端A的redis-cli中执行“monitor”,这时 Redis 执行的任何命令都会在终端A的redis-cli 中打印出来,如打开终端B的 redis-cli,执行”SET foo bar”命令,此时终端A的redis-cli中会输出如下内容:
127.0.0.1:6379> monitor
OK
1449296535.901203 [0 127.0.0.1:55287] "set" "foo" "bar"
注意,monitor命令非常影响Redis的性能,一个客户端使用monitor命令会降低Redis将近一半的负载能力。所以 monitor命令只适合用来调试和纠错。
2:phpRedisAdmin
当Redis 中的键较多时,使用redis-cli管理数据并不是很方便,就如同管理 MySQL时有人喜欢使用phpMyAdmin一样,Redis同样有一个PHP开发的网页端管理工具phpRedisAdmin。
phpRedisAdmin支持以树形结构查看键列表,编辑键值,导入/导出数据库数据,查看数据库信息和查看键信息等功能。
3:Rdbtools
Rdbtools 是一个Redis 快照文件解析器。快照文件是二进制格式,不利于查看,可以使用Rdbtools来将其导出为JSON格式,分析 Redis 中每个键的占用空间情况等。Rdbtools 使用 Python 开发。
06Redis入门指南笔记(安全、通信协议、管理工具)的更多相关文章
- 07Redis入门指南笔记(主从复制、哨兵)
现实项目中通常需要若干台Redis服务器的支持: 结构上,单个 Redis 服务器会发生单点故障,而且一台服务器需要承受所有的请求负载.这就需要为数据生成多个副本并分配在不同的服务器上: 容量上,单个 ...
- Xen入门系列三【Xen 管理工具 xm】
xm命令是管理Xen的最基本的工具,可以通过xm --help 来获得帮助. 1. 列出所有正在运行的虚拟操作系统 # xm list PS[1]:可缩写为 xm li 2. 启动虚拟机 # 通过配置 ...
- 【笔记】cookies管理工具类
package com.ulearning.ulms.util; import java.io.UnsupportedEncodingException; import java.net.URLDec ...
- redis入门指南-第7章-管理
7.1 持久化 1.RDB方式 2.AOF方式 Redis 持久化: 提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF. RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(poi ...
- 03Redis入门指南笔记(事务、生存时间、排序、消息通知、管道)
一:事务 1:概述 Redis中的事务(transaction)是一组命令的集合.事务同命令一样都是Redis的最小执行单位,一个事务中的命令要么都执行,要么都不执行. 事务的原理是是先将属于一个事务 ...
- 08Redis入门指南笔记(集群)
即使使用哨兵,此时的 Redis 集群的每个数据库依然存有集群中的所有数据,从而导致集群的总数据存储量受限于所有节点中,内存最小的数据库节点,形成木桶效应. 对 Redis 进行水平扩容,在旧版Red ...
- 05Redis入门指南笔记(持久化)
Redis的强劲性能很大程度上是由于将所有数据都存储在了内存中,然而当Redis重启后,所有存储在内存中的数据就会丢失.在一些情况下,希望Redis能将数据从内存中以某种形式同步到硬盘中,使得重启后可 ...
- 02Redis入门指南笔记(基本数据类型)
一:热身 获得符合规则的健名列表:keys pattern pattern支持glob风格的通配符,具体规则如下表: Redis命令不区分大小写.keys命令需要遍历Redis中的所有健,当键的数量 ...
- 01Redis入门指南笔记(简介、安装、配置)
一:简介 Redis是一个开源的高性能key-value数据库.Redis是Remote DIctionary Server(远程字典服务器)的缩写,它以字典结构存储数据,并允许其他应用通过TCP协议 ...
随机推荐
- Delphi 设计模式:《HeadFirst设计模式》Delphi7代码---装饰模式之StarBuzzCoffee[转]
1 2{<HeadFirst设计模式>之装饰模式 } 3{ 本单元中的类为被装饰者 } 4{ 编译工具: Delphi7.0 } 5{ E-Ma ...
- div覆盖div DIV相互重叠如何解决
div覆盖div,出现div与div盒子之间产生重叠覆盖现象,而内容没有出现覆盖重叠现象原因与解决方法.DIVCSS5通过CSS图文案例介绍产生原因与解决方法.DIV与DIV覆盖原因与解决方法. 可能 ...
- Uva437 The Tower of Babylon
https://odzkskevi.qnssl.com/5e1fdf8cae5d11a8f572bae96d6095c0?v=1507521965 Perhaps you have heard of ...
- golang之Sprintf函数
- (转)Cookie存中文乱码的问题
有个奇怪的问题:登录页面中使用Cookie存值,Cookie中要存中文汉字.代码在本地调试,一切OK,汉字也能顺利存到Cookie和从Cookie中读出,但是放到服务器上不管用了,好好的汉字成了乱码, ...
- Mac下升级node到最新版本
建议先装n,再用n把node升级到最新稳定版: $ npm install -g n $ n stable
- Codeforces Round #304 (Div. 2) B. Soldier and Badges【思维/给你一个序列,每次操作你可以对一个元素加1,问最少经过多少次操作,才能使所有元素互不相同】
B. Soldier and Badges time limit per test 3 seconds memory limit per test 256 megabytes input standa ...
- 【《Objective-C基础教程 》笔记】(八)OC的基本事实和OC杂七杂八的疑问
一.疑问 1.成员变量.实例变量.局部变量的差别和联系,在訪问.继承上怎样表现. 2.属性@property 和 {变量列表} 是否同样.有什么不同. 3.类方法.类成员.类属性:实例方法.实例变量. ...
- Mac 电脑如何卸载 node
因为刚入手「 Mac 」很多淫技还不懂,在一次使用 npm install 的时候安装出错,提示为 npm 与 node 的版本有问题,所以就想着卸载重新装一个版本. 但是因为刚使用「 Mac 」所以 ...
- 【机器学习PAI实战】—— 玩转人工智能之你最喜欢哪个男生?
摘要: 分类问题是生活中最常遇到的问题之一.普通人在做出选择之前,可能会犹豫不决,但对机器而言,则是唯一必选的问题.我们可以通过算法生成模型去帮助我们快速的做出选择,而且保证误差最小.充足的样本,合适 ...