目录
Redis安全(创建用户)、数据备份与恢复、管道技术、分区
Redis安全(创建用户)、数据备份与恢复、管道技术、分区
Redis安全(创建用户)
可以通过redis的配置文件设置密码参数,这样客户端连接到redis服务就需要密码验证,这样可以让redis服务更安全。
通过命令查看是否设置了密码验证:
CONFIG GET requirepass
默认情况下requirepass参数是空的,这就意味着无需通过密码验证就可以连接到redis服务
设置密码
可以通过以下命令来修改该参数
CONFIG SET requirepass “admin”
设置密码为admin后,客户端连接redis服务就需要密码验证,否则无法执行命令
AUTH(解锁)
AUTH命令解锁,解锁之后才能使用其他Redis命令。
如果AUTH命令给定的密码password和配置文件中的密码相符的话,服务器会返回OK并开始接受命令输入。另一方面,假如密码不匹配的话,服务器将返回一个错误,并要求客户端需重新输入密码。因为Redis高性能的特点,在很短时间内尝试猜测非常多个密码是有可能的,因此请确保使用的密码足够复杂和足够长,以免遭受密码猜测攻击
# 设置密码
redis> CONFIG SET requirepass secret_password # 将密码设置为secret_password
OK
redis> QUIT # 退出连接,让新密码对客户端生效
redis 127.0.0.1:6379> redis
redis> PING # 未验证密码,操作被拒绝
(error) ERR operation not permitted
redis> AUTH wrong_password_testing # 尝试输入错误的密码
(error) ERR invalid password
redis> AUTH secret_password # 输入正确的密码
OK
redis> PING # 密码验证成功,可以正常操作命令了
PONG
数据备份与恢复
备份数据
(1)SAVE
用于创建当前数据库的备份
redis 127.0.0.1:6379> SAVE
OK
该命令将在redis安装目录中创建dump.rdb文件
(2)Bgsave
创建redis备份文件也可以使用命令BGSAVE,该命令在后台执行
恢复数据
如果需要恢复数据,只需将备份文件(dump.rdb)移动到redis安装目录并启动服务即可
获取redis目录可以使用CONFIG GET命令
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "E:\\Mysoftware\\Redis"
CONFIG GET dir:输出的redis安装目录为E:\Mysoftware\Redis
客户端连接数
Redis通过监听一个TCP端口或者Unix socket的方式来接收来自客户端的连接,当一个连接建立后,Redis 内部会进行以下一些操作:
(1)首先,客户端socket会被设置为非阻塞模式,因为Redis在网络事件处理上采用的是非阻塞多路复用模型
(2)然后为这个socket设置TCP_NODELAY属性,禁用Nagle算法
(3)然后创建一个可读的文件事件用于监听这个客户端socket的数据发送
最大连接数
在Redis 2.4中,最大连接数是被直接硬编码在代码里面;而在2.6版本后这个值变成可配置
maxclients的默认值是10000,也可以在redis.conf中对这个值进行修改
(1)得到最大连接数:CONFIG GET maxclients
(2)设置最大连接数:CONFIG SET maxclients
以下在服务启动时设置最大连接数为100:
redis-server --maxclients 100
客户端命令
S.N. | 命令 | 描述 |
---|---|---|
1 | CLIENT LIST | 返回连接到redis服务的客户端列表 |
2 | CLIENT SETNAME | 设置当前连接的名称 |
3 | CLIENT GETNAME | 获取通过CLIENT SETNAME命令设置的服务名称 |
4 | CLIENT PAUSE | 挂起客户端连接,指定挂起的时间以毫秒计 |
5 | CLIENT KILL | 关闭客户端连接 |
管道技术
Redis是一种基于客户端 <–> 服务端模型以及请求/响应协议的TCP服务
Redis管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应
通常情况下一个请求会遵循以下步骤
(1)客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应
(2)服务端处理命令,并将结果返回给客户端
分区
分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集
优势
(1)通过利用多台计算机内存的和值,允许构造更大的数据库
(2)通过多核和多台计算机,允许扩展计算能力;通过多台计算机和网络适配器,允许扩展网络带宽
不足
redis的一些特性在分区方面表现的不是很好
(1)涉及多个key的操作通常是不被支持的。举例来说,当两个set映射到不同的redis实例上时,就不能对这两个set执行交集操作
(2)涉及多个key的redis事务不能使用
(3)当使用分区时,数据处理较为复杂,比如需要处理多个rdb/aof文件,并且从多个实例和主机备份持久化文件
(4)增加或删除容量也比较复杂。redis集群大多数支持在运行时增加、删除节点的透明数据平衡的能力,但是类似于客户端分区、代理等其他系统则不支持这项特性。然而,一种叫做presharding的技术对此是有帮助的
分区类型
Redis有两种类型分区。假设有4个Redis实例R0、R1、R2、R3,和类似user:1,user:2这样的表示用户的多个key,对既定的key有多种不同方式来选择这个key存放在哪个实例中。也就是说,有不同的系统来映射某个key到某个Redis服务。
①范围分区
最简单的分区方式是按范围分区,就是映射一定范围的对象到特定的Redis实例。
比如,ID从0到10000的用户会保存到实例R0,ID从10001到 20000的用户会保存到R1,以此类推。
这种方式是可行的,并且在实际中使用,不足就是要有一个区间范围到实例的映射表。这个表要被管理,同时还需要各 种对象的映射表,通常对Redis来说并非是好的方法。
②哈希分区
另外一种分区方法是hash分区。这对任何key都适用,也无需是object_name:这种形式,像下面描述的一样简单:
(1)用一个hash函数将key转换为一个数字,比如使用crc32 hash函数。对key foobar执行crc32(foobar)会输出类似93024922的整数。
(2)对这个整数取模,将其转化为0-3之间的数字,就可以将这个整数映射到4个Redis实例中的一个了。93024922 % 4 = 2,就是说key foobar应该被存到R2实例中。
注意:取模操作是取除的余数,通常在多种编程语言中用%操作符实现