- 安装
- 开始使用
- 指令/键
- 数据类型
- 介绍
- redis.conf
- redis压力测试工具
- 主从
- sentinel(哨兵)
- 端口
- 是否后台启动
- pid文件路径
- 日志文件路径
- rdb数据备份的目录
- 定义Redis主的别名, IP, 端口,这里的2指的是需要至少2个Sentinel认为主Redis挂了才最终会采取下一步行为
- 如果mymaster 30秒内没有响应,则认为其主观失效
- 如果master重新选出来后,其它slave节点能同时并行从新master同步数据的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。
- 该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒
- 不允许使用SENTINEL SET设置notification-script和client-reconfig-script
- sentinel notification-script mymaster /var/redis/notify.sh
- 集群
author: UpDown published: True created: 2022年5月11日20点24分 tags: Done version: Outer
参考:
安装
apt安装
sudo apt install redis-server
- 安装完后检查 执行程序都在 usr/bin/下
sudo service redis-server start
启动sudo service redis-server stop
停止sudo service redis-server restart
重启ps aux|grep redis
查看进程 默认端口 6379/etc/redis/redis.conf
数据库的默认配置文件源码编译安装
下载地址 http://download.redis.io/releases/redis-5.0.7.tar.gz
- 下载获得 redis-5.0.7.tar.gz 后将它放到我们Linux的目录下 /opt
- /opt 目录下,解压命令 :
tar -zxvf redis-5.0.7.tar.gz
- 解压完成后出现文件夹:redis-5.0.7
- 进入目录:
cd redis-5.0.7
- 在 redis-5.0.7 目录下执行 make 命令
运行make命令时故意出现的错误解析:
1. 安装gcc (gcc是linux下的一个编译程序,是c程序的编译工具)
能上网: yum install gcc-c++
版本测试: gcc-v
2. 二次make
3. Jemalloc/jemalloc.h: 没有那个文件或目录
运行 make distclean 之后再make
4. Redis Test(可以不用执行)
- 如果make完成后继续执行 make install
- 查看默认安装目录:/usr/local/bin
- 拷贝配置文件(备用)
cd /usr/local/bin
ls -l
# 在redis的解压目录下备份redis.conf
mkdir myredis
cp redis.conf myredis # 拷一个备份,养成良好的习惯,我们就修改这个文件
# 修改配置保证可以后台应用
vim redis.conf
开始使用
启动redis服务
cd /usr/local/bin
redis-server /opt/redis-5.0.7/redis.conf
redis客户端连接
redis-cli -p 6379
ping
- pong
set k1 helloworld
-
退出连接(非关闭)
-
关闭连接
-
指令/键
select num
命令切换数据库
select 7
dbsize
keys *
exists key
move key db
flushdb
flushall
(nil)
expire key 秒钟
为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除
ttl key
type key
del key
append key "hello"
对不存在的key进行append,等同于set key "hello"
对已存在的字符串进行append,长度从5个字符增加到10个字符
strlen key
incr key
decr key
incrby key 10
decrby key 10
getrange key 0 -1
获取指定区间范围内的值,类似between…and的关系,从零到负一表示全部
数据类型
String
- String是redis最基本的类型
- 一个key对应一个value
- 一个redis中字符串value最多可以是512M
String类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象
set key value
设置键值setex key seconds value
设置键值及过期时间,以秒为单位setex aa 3 aa
设置键为aa值为aa过期时间为3秒的数据
mset key1 value1 key2 value2 ...
设置多个键值mset a1 python a2 java a3 c
设置键为’a1’值为’python’、键为’a2’值为’java’、键为’a3’值为’c’
append key value
追加值append 'a1' 'haha'
向键为a1中追加值’ haha’
get key
根据键获取值,如果不存在此键则返回nil-
Hash
Redis hash 是一个键值对集合。
- Redis hash 是一个String类型的field和value的映射表
hash特别适合用于存储对象。
hset key field value
hset user name itheima
设置键 user的属性name为itheima
hkeys key
获取指定键所有的属性hkeys u2
获取键u2的所有属性
hget u2 'name'
获取键u2属性’name’的值hmget key field1 field2 ...
获取多个属性的值hmget u2 name age
hvals key
获取key的所有属性的值hdel key field1 field2 ...
删除整个hash键及值,使⽤del命令,删除属性,属性对应的值会被⼀起删除列表的元素类型为string
- 按照插⼊顺序排序
- 可以添加一个元素到列表的头部(左边)或者尾部(右边)
它的底层实际是个链表 !
lpush key value1 value2...
在左侧插⼊数据lpush a1 a b c
从键为’a1’的列表左侧加⼊数据a 、 b 、c
rpush key value1 value2 ...
在右侧插⼊数据linsert key before或after 现有元素 新元素
在指定元素的前或后插⼊新元素linsert a1 before b 3
在键为’a1’的列表中元素’b’前加⼊’3’
lrange key start stop
- 返回列表⾥指定范围内的元素
- start、stop为元素的下标索引
- 索引从左侧开始,第⼀个元素为0
- 索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
lrange a1 0 -1
获取键为’a1’的列表所有元素
lset key index value
- 设定指定索引位置的元素值
- 索引从左侧开始,第⼀个元素为0
- 索引可以是负数,表示尾部开始计数,如-1表示最后⼀个元素
lset a 1 z
修改键为’a1’的列表中下标为1的元素值为’z’
lrem key count value
⽆序集合
- 元素为string类型
- 元素具有唯⼀性,不重复
说明:对于集合没有修改操作
sadd key member1 member2 ...
添加元素sadd a3 zhangsan sili wangwu
smembers key
返回所有的元素smembers a3
srem key
删除指定元素sorted set,有序集合
- 元素为string类型
- 元素具有唯⼀性,不重复
- 每个元素都会关联⼀个double类型的score,表示权重,通过权重将元素从⼩到⼤排序
说明:没有修改操作
zadd key score1 member1 score2 member2 ...
添加zadd a4 4 lisi 5 wangwu 6 zhaoliu 3 zhangsan
向键’a4’的集合中添加元素’lisi’、’wangwu’、’zhaoliu’、’zhangsan’,权重分别为4、5、6、3
zrange key start stop
返回指定范围内的元素- start、stop为元素的下标索引
- 索引从左侧开始,第⼀个元素为0
- 索引可以是负数,表示从尾部开始计数,如-1表示最后⼀个元素
zrangebyscore key min max
返回score值在min和max之间的成员zrangebyscore a4 5 6
获取键’a4’的集合中权限值在5和6之间的成员
zscore key member
返回成员member的score值zscore a4 zhangsan
获取键’a4’的集合中元素’zhangsan’的权重
zrem key member1 member2 ...
删除指定元素zrem a4 zhangsan
删除集合’a4’中元素’zhangsan’
zremrangebyscore key min max
删除权重在指定范围的元素zremrangebyscore a4 5 6
删除集合’a4’中权限在5、6之间的元素介绍
默认16个数据库,类似数组下标从零开始,初始默认使用零号库为什么redis是单线程
我们首先要明白,Redis很快!官方表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis 的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就 顺理成章地采用单线程的方案了!redis 核心就是 如果我的数据全都在内存里,我单线程的去操作 就是效率最高的,为什么呢,因为 多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切 换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。redis 用 单个CPU 绑定一块内存 的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处 理这个事。在内存的情况下,这个方案就是最佳方案。 因为一次CPU上下文的切换大概在 1500ns 左右。从内存中读取 1MB 的连续数据,耗时大约为 250us, 假设1MB的数据由多个线程读取了1000次,那么就有1000次时间上下文的切换,那么就有1500ns * 1000 = 1500us ,我单线程的读完1MB数据才250us ,你光时间上下文的切换就用了1500us了,我还不 算你每次读一点数据 的时间
redis.conf
daemonize
A、redis.conf配置文件中daemonize守护线程,默认是NO。
B、daemonize是用来指定redis是否要用守护线程的方式启动。
daemonize 设置yes或者no区别
- daemonize:yes
- redis采用的是单进程多线程的模式。当redis.conf中选项daemonize设置成yes时,代表开启 守护进程模式。在该模式下,redis会在后台运行,并将进程pid号写入至redis.conf选项 pidfile设置的文件中,此时redis将一直运行,除非手动kill该进程。
- daemonize:no
- 当daemonize选项设置成no时,当前界面将进入redis的命令行界面,exit强制退出或者关闭 连接工具(putty,xshell等)都会导致redis进程退出。
databases 16
redis压力测试工具
Redis-benchmark是官方自带的Redis性能测试工具,可以有效的测试Redis服务的性能。
用法详见:https://blog.updown.world/articles/kuang/37%E3%80%81Redis%E7%B2%BE%E8%AE%B2.pdf
主从
- ⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构
- master用来写数据,slave用来读数据,经统计:网站的读写比率是10:1
- 通过主从配置可以实现读写分离
master和slave都是一个redis实例(redis服务)
master配置
修改/etc/redis/redis.conf文件
sudo vi redis.conf
bind 192.168.26.128
重启redis服务
复制etc/redis/redis.conf文件
sudo cp redis.conf ./slave.conf
- 修改redis/slave.conf文件
sudo vi slave.conf
编辑内容
bind 192.168.26.128
slaveof 192.168.26.128 6379
port 6378
-
查看主从关系
redis-cli -h 192.168.26.128 info Replication
数据操作
在master和slave分别执⾏info命令,查看输出信息 进入主客户端
redis-cli -h 192.168.26.128 -p 6379
- 进入从的客户端
redis-cli -h 192.168.26.128 -p 6378
- 在master上写数据
set aa aa
-
sentinel(哨兵)
介绍
Redis Sentinel是Redis高可用的实现方案。Sentinel是一个管理多个Redis实例的工具,它可以实现对Redis的监控、通知、自动故障转移
功能
Sentinel的主要功能包括主节点存活检测、主从运行情况检测、自动故障转移(failover)、主从切换。Redis的Sentinel最小配置是一主一从。 Redis的Sentinel系统可以用来管理多个Redis服务器,该系统可以执行以下四个任务:
- 监控Sentinel会不断的检查主服务器和从服务器是否正常运行。
- 通知当被监控的某个Redis服务器出现问题,Sentinel通过API脚本向管理员或者其他的应用程序发送通知。
- 自动故障转移当主节点不能正常工作时,Sentinel会开始一次自动的故障转移操作,它会将与失效主节点是主从关系的其中一个从节点升级为新的主节点, 并且将其他的从节点指向新的主节点。
- 配置提供者在Redis Sentinel模式下,客户端应用在初始化时连接的是Sentinel节点集合,从中获取主节点的信息。
- Sentinel负责监控集群中的所有主、从Redis
- 当发现主故障时,Sentinel会在所有的从中选一个成为新的主,并且会把其余的从变为新主的从。
- 那台有问题的旧主也会变为新主的从,也就是说当旧的主即使恢复时,并不会恢复原来的主身份,而是作为新主的一个从。
在Redis高可用架构中,Sentinel往往不是只有一个,而是有3个或者以上。目的是为了让其更加可靠
主客观失效
主观失效SDOWN(subjectively down),直接翻译的为”主观”失效,即当前sentinel实例认为某个redis服务为”不可用”状态.
- 客观失效ODOWN(objectively down),直接翻译为”客观”失效,即多个sentinel实例都认为master处于”SDOWN”状态,那么此时master将处于ODOWN,ODOWN可以简单理解为master已经被集群确定为”不可用”,将会开启failover
配置
架构
master 127.0.0.1:7000 主
slave01 127.0.0.1:7001 从
slave02 127.0.0.1:7002 从
master 127.0.0.1:27000 sentinel01
slave01 127.0.0.1:27001 sentinel02
slave02 127.0.0.1:27002 sentinel03
sentinel配置
```端口
port 27000
是否后台启动
daemonize yes
pid文件路径
pidfile /var/run/redis-sentinel.pid
日志文件路径
logfile “/var/log/redis/sentinel.log”
rdb数据备份的目录
dir /var/lib/redis
定义Redis主的别名, IP, 端口,这里的2指的是需要至少2个Sentinel认为主Redis挂了才最终会采取下一步行为
sentinel monitor mymaster 127.0.0.1 7000 2
如果mymaster 30秒内没有响应,则认为其主观失效
sentinel down-after-milliseconds mymaster 30000
如果master重新选出来后,其它slave节点能同时并行从新master同步数据的台数有多少个,显然该值越大,所有slave节点完成同步切换的整体速度越快,但如果此时正好有人在访问这些slave,可能造成读取失败,影响面会更广。最保守的设置为1,同一时间,只能有一台干这件事,这样其它slave还能继续服务,但是所有slave全部完成缓存更新同步的进程将变慢。
sentinel parallel-syncs mymaster 1
该参数指定一个时间段,在该时间段内没有实现故障转移成功,则会再一次发起故障转移的操作,单位毫秒
sentinel failover-timeout mymaster 180000
不允许使用SENTINEL SET设置notification-script和client-reconfig-script
sentinel deny-scripts-reconfig yes
<a name="pCh2r"></a>
##### 脚本配置
- notification-script和client-reconfig-script 的配置含义如下:
sentinel notification-script
通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,一个是事件的类型,一个是事件的描述。如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。
配置示例:
sentinel notification-script mymaster /var/redis/notify.sh
sentinel client-reconfig-script
当一个master由于failover而发生改变时,这个脚本将会被调用,通知相关的客户端关于master地址已经发生改变的信息。以下参数将会在调用脚本时传给脚本:
目前总是“failover”, 是“leader”或者“observer”中的一个。 参数 from-ip, from-port, to-ip, to-port是用来和旧的master和新的master(即旧的slave)通信的。这个脚本应该是通用的,能被多次调用,不是针对性的。
配置示例: sentinel client-reconfig-script mymaster /var/redis/reconfig.sh
<a name="Jn1Og"></a>
#### 启动Sentinel
启动的顺序:主Redis --> 从Redis --> Sentinel1/2/3<br />启动后去查看下sentinel的配置文件,里面有自动写入的主从信息
<a name="Y43wV"></a>
#### 连接哨兵 查看信息
redis-ci -p 27000 sentinel master mymaster # 查看被监控的mymaster的主节点信息 sentinel slaves mymaster # 查看被监控的mymaster的从节点信息 sentinel sentinels mymaster # 查看被监控的mymaster的其他sentinel信息 ```
测试
- 查看进程,杀死主节点
- 过几十秒 连接其它的redis,通过info replication查看状态信息
集群
参考:
- redis集群搭建 http://www.cnblogs.com/wuxl360/p/5920330.html
- [Python]搭建redis集群 http://blog.5ibc.net/p/51020.html
详情:https://blog.updown.world/articles/python/pythonbook9/redis/da-jian-ji-qun.html