目标
redis管理
redis 数据备份与恢复
备份
- SAVE命令备份当前数据库
- 在 redis 安装目录中创建dump.rdb文件
- 也可以使用命令 BGSAVE,该命令在后台执行
redis 127.0.0.1:6379> SAVE
#redis 127.0.0.1:6379> BGSAVE
恢复
- 将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可
- redis 安装目录通过CONFIG命令获取
redis 127.0.0.1:6379> CONFIG GET dir
redis 安全
- 设置密码:redis 的配置文件
#为空表示无需密码验证
redis 127.0.0.1:6379> CONFIG get requirepass
#设置密码
redis 127.0.0.1:6379> CONFIG set requirepass "pwd"
redis 127.0.0.1:6379> CONFIG get requirepass
- 客户端密码验证
redis 127.0.0.1:6379> AUTH "pwd"
redis 性能测试
- 性能测试命令(非客户端命令):redis-benchmark
- Redis 性能测试是通过同时执行多个命令实现的
#redis性能测试
cd $HOME/redis-6.2.1/src
./redis-benchmark -n 10000 -q
#redis-benchmark -h 127.0.0.1 -p 6379 -t set,lpush -n 10000 -q
redis-benchmark可选参数
参数 | 参数说明 |
---|---|
-h | 指定服务器主机名,默认127.0.0.1 |
-p | 指定服务器端口,默认6379 |
-s | 指定服务器socket |
-c | 指定并发连接数,默认50 |
-n | 指定请求数,默认10000 |
-d | 以字节的形式指定 ET/GET值的数据大小,默认2 |
-k | 1=keep alive 0=reconnect,默认1 |
-r | SET/GET/INCR使用随机key,SADD 使用随机值 |
-P | 通过管道传输请求,默认1 |
-q | 强制退出redis,仅显示 query/sec 值(让结果只显示每秒执行的请求数) |
–csv | 以CSV格式输出 |
-l | 生成循环,永久执行测试 |
-t | 仅运行以逗号分隔的测试命令列表 |
-I | Idle模式。仅打开N个idle连接并等待 |
redis 客户端连接
- Redis 通过监听一个 TCP 端口或者 Unix socket 的方式来接收来自客户端的连接
- 一个连接建立后,Redis内部执行操作如下
- 首先,客户端 socket 会被设置为非阻塞模式,因为 Redis 在网络事件处理上采用的是非阻塞多路复用模型
- 然后为这个 socket 设置 TCP_NODELAY 属性,禁用 Nagle 算法
- 然后创建一个可读的文件事件用于监听这个客户端 socket 的数据发送
- 最大连接数:maxclients默认10000,也可在 redis.conf 中修改,或者服务启动时设置最大连接数
redis-server --maxclients 100000
redis 127.0.0.1:6379> config get maxclients
客户端常用命令
命令 | 命令说明 |
---|---|
CLIENT LIST | 返回连接到 redis 服务的客户端列表 |
CLIENT SETNAME | 设置当前连接的名称 |
CLIENT GETNAME | 获取通过 CLIENT SETNAME 命令设置的服务名称 |
CLIENT PAUSE | 挂起客户端连接,指定挂起的时间以毫秒计 |
CLIENT KILL | 关闭客户端连接 |
redis 管道
- Redis是一种C/S模型以及Req/Rsp协议的TCP服务
- 一个请求会遵循以下步骤:
- 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应
- 服务端处理命令,并将结果返回给客户端
- 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应
- 管道技术显著提高redis服务性能
#查看redis管道:这些命令一次性向redis服务提交,并最终一次性读取所有服务端响应
(echo -en "PING\r\n SET runoobkey redis\r\nGET runoobkey\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n"; sleep 10) | nc localhost 6379
redis 分区
特点
- 分区是分割数据到多个Redis实例的处理过程,每个实例只保存key的一个子集
- 利用多台计算机内存允许我们构造更大的数据库
- 通过多核和多台计算机扩展计算能力
- 通过多台计算机和网络适配器扩展网络带宽
劣势
- 分区涉及多个key的操作通常不被支持,如:两个set映射到不同的redis实例上时,那么不能对这两个set执行交集操作
- 分区涉及多个key的redis事务不能使用
- 分区时数据处理较为复杂,比如需要处理多个rdb/aof文件,且从多个实例和主机备份持久化文件
- 增加或删除容量也比较复杂,redis集群大多数支持在运行时增加、删除节点的透明数据平衡的能力
分区类型
eg:有4个Redis实例 R0,R1,R2,R3
- 范围分区
- 最简单的分区方式,即映射一定范围的对象到特定的Redis实例,如ID从0到10000的用户会保存到实例R0,ID从10001到 20000的用户会保存到R1等等;方式可行,实际可用,不足是要有一个区间范围到实例的映射表,这个表需要被管理,同时还需要各种对象的映射表;
- 哈希分区
- 对任何key都适用
- 需要用一个hash函数将key转换为一个数字,比如使用crc32 hash函数,获取一个整数,对这个整数取模转化为0-3之间的数字,将这个整数映射到4个Redis实例中的一个