Redis知识点整理

Redis

什么是Redis?

Redis(Remote Dictionary Server ),即远程字典服务

是一个开源的使用ANSI C语言编写、支持网络、基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

是当下最热门的NoSQL数据库之一, 数据结构服务器!

官方记录: Redis 一秒可以写8万,读11万次。

官网地址:https://redis.io/

中文网地址:https://www.redis.net.cn/

Redis对比其他Key-Value缓存产品的特点:

  • 支持数据持久化机制,重启数据不容易丢失
  • 支持的数据类型很多:有string、list、set、hash、zset、geo、gitmap…
  • 支持备份,并且对分布式集群有很好的支持:主从复制、哨兵

Redis可以做什么?

  • 内存存储和持久化
  • 多种数据类型满足基本上所有常见的结构数据的存储需求
  • 发布、订阅模型
  • 地图分析(坐标缓存、距离计算)
  • 定时器 Timer
  • 统计打卡
  • Hyperloglogs、gitmap

安装启动

安装

从官网上下载redis或者下载docker image运行

下载并解压redis,进redis目录,将Redis二进制文件安装至 usr/local/bin 中,执行命令:

make install

成功安装

启动

在此说明:redis配置文件大部分都是注释,在命令行中没有高亮显示,所以为了显示清晰,用vscode查看

redis是C/S架构,先要启动server,可以指定某个配置文件启动,配置文件默认端口6379

port

redis-server [redis.conf]

启动成功

修改redis.conf,设置守护进程的启动方式:

配置守护进程

重启,成功以守护进程的方式启动

连接

  • -h 主机地址默认127.0.0.1
  • -p 端口默认6379
  • –raw 可解决中文乱码问题
redis-cli [-h 127.0.0.1][-p 6379]

连接后可使用ping命令检测是否登录成功!因为我们未设置密码,返回PONG代表已经登录

ping

如果ping提示未授权,用auth命令进行登录

auth [密码]

基础操作命令

Redis 的键

  • Redis中所有数据值都有一个唯一的键,用于索引某个值
# 设置键k1为v1
set k1 v1
# 查看k1的值
get k1
# 删除一个key,删除多个用空格隔开
del k1
# 查看所有的key,数据非常多的时候非常消耗cpu资源,生产环境谨慎执行
keys *
# 检查key是否存在
EXISTS k1
# 设置k1的过期时间为5秒
expire k1 5
# 查看k1离过期剩余的秒
ttl k1
# 查看值类型,这里返回string
type k1
# 随机获取一个key
randomKey

配置

  • 连接上Redis后可以查看和修改当前运行的配置
# 查看所有配置属性,这些配置在redis.conf中都可以提前配置
config get *
# 设置密码为123456
config set requirepass "123456"
# 登录
auth 123456

多数据库概念

  • Redis默认开启了16个数据库,数据库之间互相隔离

    设置数据库个数

  • 登录后默认切换为0号数据库

# 切换到数据库2
select 2
# 移动键k1到数据1中
move k1 1

其它基础操作命令

# 清空当前数据库
# [async] 异步清空
flushdb
# 清空所有数据库
# [async] 异步清空
flushall
# 关闭redis服务
# [noSave|save] 是否保存
shutdown

五大数据类型

string 字符串

这是Redis中最基本的类型,一个key 对应一个 value,而且这个 value 是String 类型。Redis 字符串value 最大不要超过 512M。

# 设置一个string
set k1 v1
# 给string后面追加内容,如果没有这个key则设置这个值,返回追加后的string长度
append k1 v
# 返回string的长度
strlen k1
# 给一个key自增,毎执行一次自增1,返回自增后的结果
incr i
# 设置步长的自增,负数为自减
incrby i 2
# 自减,毎执行一次自减1
decr i
# 设置步长的自减,负数为自增
decrby i 2
# 获取字符串范围,start:开始下标,end:结束下标(-1为最后一个字符下标,-2为倒数第二)
getRange k1 0 -1
# 替换范围,offset:开始替换的下标,value:这个值的长度有多少替换从偏移量开始多少位,以下k1:v1vv,替换后:v**v
setRange k1 1 **
# 设置k2的值为exipre,60秒后过期,以下几个命令效果一样
setex k2 60 exipre
set k2 exipre EX 60 #EX 秒
set k2 exipre PX 60000 #PX 毫秒
# 带信号量的set,已存在key则设置失败返回0,不存在与set等价返回1
setnx k1 v1
# 批量设置
mset k1 v1 k2 v2 k3 v3
# 批量获取value
mget k1 k2 k3
# 批量setnx,原子操作,要么全部成功要么全部失败
msetnx k10 v10 k11 v11
# 先获取原来的值,再设置新的值(没有旧值返回nil)
getSet k1 vv

总结

  • key如果存在setnx会有成果或失败的信号,而set则是覆盖
  • 自增、自减如果key不存在则创建一个从0开始的值进行下一步操作

list 列表

Redis的列表是一个双向链表,left、right都可以插入元素

# 向列表头部插入一个或者多个值
lpush list v1
# 向列表尾部插入一个或者多个值
rpush list v2 v3
# 查看列表区间的值(-1为最后一个与getRange同理)
lRange list 0 -1
# 弹出列表头部的值L(左),返回弹出的值
lpop list
# 弹出列表尾部的值R(右),返回弹出的值
rpop list
# 通过下标获取元素
lindex list -1
# 获取列表长度
lLen list
# 删除3个值为v1的元素,返回删除的个数
lRem list 3 v1
# 修剪成指定下标范围(下标2到最后一个)
lTrim list 2 -1
# 弹出列表最后一个元素插入到另一个列表的头部
rpoplpush list list2
# 替换列表某个下标的值(注意:key不存在或者下标越界分别报错:ERR no such key、ERR index out of range)
lSet list 0 v0
# 在某个位置进行插入,首先要找到这个元素(找到的是从头到尾第一个匹配的元素),before在元素前面插入,after在元素后面插入,返回插入后列表的长度,如果返回-1则表示插入失败
lInsert list before v3 v2
lInsert list after v3 v4

总结

  • 列表只要元素个数为0,则key也同时消失
  • 如果key不存在,push也会同时创建key
  • 链表的操作无论是头部还是尾部效率都非常高,如果操作中间的元素就会相对低很多
  • 由于Redis双向链表的特性,可以玩成 (先进后出),也可以玩成 队列 (先进先出)

set 集合

set集合是一个元素不能重复的集合

# 向集合最后添加一个或多个元素,返回本次插入成功的个数
sAdd set-key v1 v2
# 查看set的所有元素
sMembers set-key
# 查看集合中是否有某个元素,返回0|1
sIsMember set-key v0
# 查看集合元素个数
sCard set-key
# 删除集合中一个或多个元素,返回删除的个数
sRem set-key v0 v1 v8
# 随机抽取集合中任意个数的元素,数量大于集合数量则返回集合所有元素
sRandMember set-key 3
# 移动一个元素到另一个集合中
sMove set-key set-key1 v2
# 差集,返回第一个集合中任意元素对于后面一个或多个集合中都不存在的元素
sDiff set-key set-key1
# 交集,返回第一个集合中任意元素对于后面一个或多个集合中存在的元素
sInter set-key set-key1
# 并集,返回所有指定集合中所有元素去重后的结果
sUnion set-key set-key1

总结

  • set集合最关键的机制就是元素不能重复,可以思考出很多应用场景
  • 随机抽取命令可以用来做抽奖
  • 差集可用来做可能认识的人,交集可用来做共同关注的好友,并集可以用来合并多个集合

hash 哈希

K-V,V又是一组组键值对类似于:K : {k0 : v0 , k1 : v1 },相当于一个对象(K)中有多个字段(k)存储了对应的值(v)

# 设置一个hash的一个或多个字段的值,hSet、hMset功能一致都可以批量设置
hSet hash-key id 1 name HTH age 18
hMset hash-key height 180 body_weight 100
# 获取一个hash的字段值
hGet hash-key id
# 批量获取hash的字段值
hMget hash-key id name age height body_weight
# 获取hash所有的字段-值,返回成对的字段与值 如下图所示
hGetAll hash-key
# 删除hash的一个字段
hDel hash-key body_weight
# 获取hash字段(也可以理解为值)的数量
hLen hash-key
# 获取某个hash所有的字段
hKeys hash-key
# 获取某个hash所有的值
hVals hash-key
# 给hash某个字段自增指定值,负数为自减,返回修改后的值
hIncrBy hash-key age 1
# 给hash不存在的字段赋值,如果已存在则失败,返回0|1
hSetnx hash-key power 10

hGetAll hash-key

总结

  • Redis Hash 本质其实就是将多个string类型向上封装了一层成为了filed和value的映射表
  • 非常适合存储一个对象

zset 有序集合

set 集合为基础,增加了一个score值与每个元素绑定在一起

# 添加一个或多个带分数的元素,返回本次新增的个数(不是新增的为已存在的,但是分数会覆盖)
zAdd zset-key 10 hth 5 zhangsan
# 查看有序集合下标范围的元素(默认不带分数,后面跟上参数 withScores 会带上分数一起返回),递增排序
zRange zset-key 0 -1 withScores
# 从后往前查看,递减排序 [withScores]
zRevRange zset-key 0 -1
# 查看分数区间内的元素
# 第一个数:最小值(-inf表示无穷小)、第二个数:最大值(+inf表示无穷大)
# [withScores]
# [limit offset count] (offset:偏移下标 count:查询条数)
zRangeByScore zset-key 9 10
# 删除一个或多个元素
zRem zset-key lisi hth
# 计算元素的数量
zCard zset-key
# 统计分数区间的数量(下面表示为分数小于10的)
zCount zset-key -inf 10

总结

  • zset根据分数来递增排序,分数变化了,排序也会随之变化
  • 天然的分数排序,可以用来存储各种排行榜
  • 分数区间的查找、统计,最高分、最低分等查询非常灵活且方便

三个特殊类型

GeoSpatial 地理位置

用于存储地理坐标、提供各种地域距离相关的计算,可以使用 百度坐标拾取系统 来测试Geo

# 存储一个或多个坐标元素到一个china-city中
geoAdd china-city 116.404269 39.912721 北京 114.065127 22.547388 深圳
# 查看下标范围的元素 [withScores 返回带上分数值],返回结果中文乱码可使用redis-cli --raw连接以解决
zRange china-city 0 -1
# 查看一个或多个元素的经纬度,不存在返回nil
geoPos china-city 深圳 北京
# 计算两个元素的距离,可跟上单位计算 [m:米、km:千米、ft:英尺、mi:英里] (默认单位m)
geoDist china-city 深圳 北京 km
# 查看某个坐标指定半径范围内所有元素
# [withDist] 返回带上间隔距离,单位与设置的单位一致
# [withCoord] 返回带上经纬度
# [WithHash] 返回带上分数值
# [count n] 限定返回的元素数量
# [asc|desc] 按间隔距离正序或倒序
geoRadius china-city 114.021433 22.544718 100 km
geoRadius china-city 114.021433 22.544718 100 km withCoord withDist WithHash count 1
# 查看某个元素指定半径范围内所有元素,可选项与geoDist基本类似
geoRadiusByMember china-city 深圳 10000 km
geoRadiusByMember china-city 深圳 10000 km withCoord withDist WithHash count 1
# 删除一个或多个元素
zRem china-city 深圳

geoPos china-city 深圳 北京geoDist china-city 深圳 北京 kmgeoRadius china-city 114.021433 22.544718 100 km withCoord withDist WithHash count 1geoRadiusByMember china-city 深圳 10000 km withCoord withDist WithHash count 1

总结

  • Redis Geo 本质上就是一个有序集合,经纬度的hash值为分数值
  • 可以通用zSet的某些命令操作Geo
  • 可以方便的做地图范围搜索、地理距离、附近的人等功能

BitMaps 位图

适合存储只有两个状态(0|1)的数据,以计算机最小单位:位(bit)的方式存储,在大数据的场景下占用空间的也是极小的!

# 存储在0下标位置的值为1(true)
setBit bit-key 0 1
# 查看某一个下标位置的值
getBit bit-key 0
# 统计某个位图key下值=1的数量
# [start end] 指定下标范围统计
bitCount bit-key

总结

  • 未设置的下标getBit拿到的也是0
  • 可以将某个人的打卡记录这种类似场景存储在位图中,打卡了标记为1即可,查询某一天是否打卡或者统计一个时间段内打卡次数都是极其的方便
  • 最重要的特性是bit存储,一个人365天的打卡记录也仅仅占用45 byte!

HyperLogLogs 基数统计

什么是基数?

基数就是不重复的元素,比如下面两个数据集,原数据集通过 去重 就成为了基数集

  • 原数据集: [ 1,3,5,7,5,7,8 ]
  • 基数集 :[ 1,3,5,7,8 ]
# 添加一个或多个元素,返回结果1:有任意一个元素是基数,0:此次添加没有基数元素
pfAdd pf-key a b c d c
# 统计一个或多个基数集的基数个数,可以发现我们添加了5个元素,统计的数量为4,这就是去重的结果
pfCount pf-key
# 合并一个或多个基数集
pfMerge pf-key pf-key2

pfAdd pf-key a b c d c、pfCount pf-key

总结

  • 用于统计不重复的数据或者出现多次只算一次的数据比较适合
  • 基数元素可以存储任何内容,中文、标点符号、特殊符号甚至表情符号都可以作为基数去重处理
  • 基数统计最大的优点是最大可以存储2^64 个不同元素的基数,却只占12kb 的空间!
  • 精确的统计就不要用了,因为 HyperLogLogs 存在大约1%的错误率
  • 用于统计网站的UV使用 HyperLogLogs 非常契合

Redis.conf

Redis所有的配置都在 redis.conf 配置文件中,连接到redis中可以使用以下命令查看/修改当前运行的配置

# 查看某个或所有的配置
config get *
# 修改某个配置,使用命令设置的配置只在当前启动的进程有效或者无法设置,重启又会加载redis.conf的配置,所以一般直接改redis.conf即可
config set requirepass "123456"
# 查看一个或多个类型的配置(这个类型参考redis.conf中的注释分类)
info NETWORK
  • NETWORK

    # 绑定指定一个或者多个网卡ip地址,只有配置的ip地址的网卡才能访问到redis(0.0.0.0表示所有主机)
    bind 127.0.0.1
    # 保护机制开启,只要1、protected-mode yes(处于开启)2、没有bind指令 3、没有设置密码 就会开启【只有本机才能访问】😅
    protected-mode yes
    # 端口配置
    port 6379
  • GENERAL

    # 是否使用守护进程启动,默认是no 
    daemonize yes
    # 是否可以通过systemd来管理redis的守护进程
    supervised no
    # 以后台方式运行redis,就需要指定pid文件
    pidfile /var/run/redis_6379.pid
    # 日志级别
    # debug (a lot of information, useful for development/testing)
    # verbose (many rarely useful info, but not a mess like the debug level)
    # notice (moderately verbose, what you want in production probably)
    # warning (only very important / critical messages are logged)
    loglevel notice
    # 日志文件的位置,如果为空,则标准输出!
    logfile "redis.log"
    # 数据库的数量
    databases 16
    # 是否显示logo 😅
    always-show-logo yes
  • SNAPSHOTTING (RDB)

    # rdb 持久化配置
    save 900 1 #900秒内发生1次变化触发一次rdb更新
    save 300 10 #300秒内发生10次变化触发一次rdb更新
    save 60 10000 #60秒内发生10000次变化触发一次rdb更新
    # 持久化出现错误之后,是够继续进行。
    stop-writes-on-bgsave-error yes
    # 是否压缩rdb文件,需要消耗cpu功能,no:不压缩,需要更多的磁盘空间
    rdbcompression yes
    # 是否检查rdb文件,利于文件的容错性,大概会有10%内存性能损耗
    rdbchecksum yes
    # 指定持久化文件
    dbfilename dump.rdb
    # 同步副本持久化文件!
    rdb-del-sync-files no
    # 数据目录
    dir ./
  • REPLICATION

    # 主节点host port
    replicaof <masterip> <masterport>
    # 主节点密码
    masterauth <master-password>
  • SECURITY

    # 密码配置
    requirepass foobared
  • CLIENTS

    # 最大连接数
    maxclients 10000
  • MEMORY MANAGEMENT

    # 最大内存使用限制
    maxmemory <bytes>
    # 内存满了的可选规则(参考下图),默认noeviction
    # LRU算法,least Recently Used 最近最少使用的几个key随机删除
    maxmemory-policy noeviction
    # 设置参与随机的key的个数
    maxmemory-samples 5

    内存快满了的可选规则

  • APPEND ONLY MODE (AOF)

    # 是否开启持久化追加模式
    appendonly no
    # 追加模式持久化文件
    appendfilename "appendonly.aof"
    # 持久化策略
    # always 每次写入都执行同步,效率相对较低 优点:最安全
    # everysec 每秒都执行同步,缺点:down掉最后一秒数据可能丢失
    # no 不执行同步,仅在系统需要的时候持久化到磁盘,优点:最快,缺点:最不安全
    appendfsync everysec

持久化

Redis是一个内存数据库,断电即失,所以持久化是一个非常重要的需求!

RDB (Redis DataBase)

什么是RDB?持久化原理是什么?

  • Rdb是指Redis在指定间隔将内存中的数据压缩成快照(Snapshotting)写入磁盘中的.rdb文件。
  • 持久化的过程:1、Redis会fork一个子进程 2、子进程写入临时文件 3、持久化完毕后再替换上次持久化好的文件。
  • 优点:
    1. I/O操作全部交给了子进程来处理,主进程性能基本不受影响
    2. 适合大规模的数据恢复,比如在主机A的数据想恢复到主机B,只要将A的dump.rdb文件复制到B,即可快速恢复
  • 缺点:
    1. fork后内存数据被克隆了一份,内存大约会膨胀到2倍
    2. 当内存数据比较大的时候,经常进行fork是非常耗时的,会稍微影响客户端毫秒级的响应
    3. 持久化是根据配置触发条件或者命令进行持久化,如果在触发持久化之前进程被down掉的话,则会丢失最后一次快照之后变更的数据,完整性和一致性一般

触发规则

  • 被动触发规则在上面 SNAPSHOTTING 的配置中!

  • 主动触发规则:

    # 只管保存,会阻塞当前操作!
    save
    # 在后台异步进行持久化操作
    bgSave
    # 查看最后一次持久化的时间戳
    lastSave
  • shutdown退出的时候与flushAll清空的时候也会触发持久化

恢复规则

  • 启动的时候会自动加载redis主目录下的dump.rdb文件,config get dir命令可以查看此目录~

AOF (Append Only File)

什么是AOF?

  • 将我们执行的每一个非查询的步骤都记录下来,不断地在.aof文件最后进行追加内容!
  • 恢复的时候按照这个文件的命令一个个读取
  • 默认是不不开启的,可以在上面 APPEND ONLY MODE 配置中开启

aof文件异常

如果.aof文件出现异常,会导致redis无法启动,可以使用 redis-check-aof 命令来进行修复aof文件,这个命令会将错误行之后的所有命令删除

redis-check-aof --fix appendonly.aof

总结

  • 同样的数据.aof文件是远远大于.rdb的
  • AOF恢复的效率是不如RDB的,但是AOF同步机制会比rdb更加安全

事务

Redis中事务的概念

  • 本质是将多个命令组成命令的集合,按顺序串行执行!
  • 单条命令是原子性的,但事务不会保证原子性,即任意一个命令错误,其它命令同样会执行并且不会回滚
  • 多个命令在开启事务后都会放在队列里,在提交事务前都不会真正执行,所以没有隔离级别的概念!

事务操作

Redis的事务操作流程为:开启一个事务、命令入队、执行或放弃事务:

# 开启事务
multi
# 执行事务
exec
# 放弃事务
disCard

全部成功的事务

全部成功的事务

全部未执行的事务

因为命令错误导致的异常,相当于编译出错,此时需要重新开启事务、重新命令入队

全部未执行的事务

部分成功的事务

因为执行过程中出现的错误,相当于运行异常,因为只存在单条命令的原子性,所以只有运行错误的命令失败

部分成功的事务

乐观锁

乐观锁概念:非常地乐观,认为每次获取数据都不会有变化,因此不用上锁。但是在更新的时候会更新一个版本号,如果下一次有人来改的时候请带上这个版本号,如果带上的这个版本号与这个值当前版本号不一致,那么就认为这个值被别人改过了!

Redis中的乐观锁操作:

# 监控一个或多个key(相当于监控版本号)
watch
# 取消一个或多个key的监控
unWatch

使用 watch 与事务的结合可实现乐观锁,决定事务是否被执行(如下图)

watch的使用

总结

  • 一旦执行exec,无论事务是否执行成功都将取消监视
  • 一般此用法可以写在一个循环中,直到事务被执行成功为止~

发布、订阅

  • 发布、订阅模型就类似于微信公众号。公众号是发布者、公众是订阅者,一对多的关系

  • Redis 中的发布订阅使用以下命令即可实现

    # 订阅一个或多个通道
    subscribe hth
    # 向指定通道里推送一个消息
    publish hth hello
  • 示例:

    发布、订阅

总结

  • 可用于实时消息聊天、群聊、消息队列等场景
  • 相对于专业的消息队列中间件来说,功能比较局限

集群

主从复制

概念

  • 主Redis服务称为(Master、leader),从Redis服务称为(Slave、follower)
  • 只能从主节点复制数据到从节点。
  • 数据冗余 主从复制是除了持久化的另一种数据备份、冗余方式
  • 故障恢复 主节点如果挂了,从节点可以替代主节点工作
  • 负载均衡 Master:主要用来写,Slave主要用来读。降低了服务器的压力
  • 高可用 集群是高可用的基础

搭建集群

搭建一个一主两从的集群,首先可以先复制两个单独的配置文件,并分别修改其端口、持久化配置等再启动

Slave 配置

连接redis,使用 info replication 查看集群相关的信息,发现目前每个节点都是master

info replication

  • 使用 slaveOf 分别将6381、6382节点设置为Slave,下面是 slaveOf 的用法

    # 设置主节点地址、端口,本节点作为其Slave
    slaveOf 127.0.0.1 6380
    # 将从节点恢复为主节点
    slaveOf NO ONE
  • 再使用 info replication 分别查看主从节点

    • Master
    • Slave
  • 此时所有Slave都是不可写状态

    不可写状态

  • 并且从master的写会同步到所有Slave!

    主从复制

总结

  • 一般实战不会使用 SlaveOf 来修改master的信息,因为重启之后又会读取redis.conf,所以一般修改每个节点的REPLICATION配置
  • 多节点配置非常麻烦,可使用docker简化集群的搭建
  • 全量复制:slave第一次连接master,会将master所有内容同步一遍
  • 增量复制:slave如果挂了,重启之后连上master,会将所有命令同步增加
  • 如果master挂了,slave将等待master,此时集群将不可写,master恢复后即可正常工作!为了解决master掉线导致的不可用,需要 哨兵 来处理故障恢复(选举新master)

哨兵模式

配置、启动哨兵

  • 哨兵的所有配置都在 sentinel.conf 文件中,修改关键的配置

    # 设置哨兵监控的master节点地址
    sentinel monitor mymaster 127.0.0.1 6380 1
  • 启动一个哨兵

    # 指定配置文件启动
    redis-sentinel sentinel.conf

    成功监控6380,并且发现了6380的两个slave

  • 测试 shutdown 主节点,等待30秒左右

    测试shutdown主节点

哨兵全部配置

转载自 https://blog.csdn.net/u012441222/article/details/80751390

# 告诉sentinel去监听地址为ip:port的一个master,这里的master-name可以自定义,quorum是一个 数字,指明当有多少个sentinel认为一个master失效时,master才算真正失效
sentinel monitor <master-name> <ip> <redis-port> <quorum>
# 设置连接master和slave时的密码,注意的是sentinel不能分别为master和slave设置不同的密码,因 此master和slave的密码应该设置相同。
sentinel auth-pass <master-name> <password>
# 这个配置项指定了需要多少失效时间,一个master才会被这个sentinel主观地认为是不可用的。 单位是 毫秒,默认为30秒
sentinel down-after-milliseconds <master-name> <milliseconds>
# 这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,这 个数字越小,完成failover所需的时间就越长,但是如果这个数字越大,就意味着越 多的slave因为 replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
sentinel parallel-syncs <master-name> <numslaves>
# failover-timeout 可以用在以下这些方面:
# 1. 同一个sentinel对同一个master两次failover之间的间隔时间。
# 2. 当一个slave从一个错误的master那里同步数据开始计算时间。直到slave被纠正为向正确的master那 里同步数据时。
# 3.当想要取消一个正在进行的failover所需要的时间。
# 4.当进行failover时,配置所有slaves指向新的master所需的最大时间。不过,即使过了这个超时, slaves依然会被正确配置为指向master,但是就不按parallel-syncs所配置的规则来了。
# 默认三分钟
sentinel failover-timeout <master-name> <milliseconds>
#通知型脚本:当sentinel有任何警告级别的事件发生时(比如说redis实例的主观失效和客观失效等等),将会去调用这个脚本,这时这个脚本应该通过邮件,SMS等方式去通知系统管理员关于系统不正常运行的信息。调用该脚本时,将传给脚本两个参数,一个是事件的类型,一个是事件的描述。如果sentinel.conf配置文件中配置了这个脚本路径,那么必须保证这个脚本存在于这个路径,并且是可执行的,否则sentinel无法正常启动成功。
# sentinel notification-script mymaster /var/redis/notify.sh
sentinel notification-script <master-name> <script-path>

性能压测工具

redis-benchmark 是redis自带的性能压力测试工具!

可以模拟高并发的情况来测试 redis 性能。

序号 选项 描述 默认值
1 -h 指定服务器主机名 127.0.0.1
2 -p 指定服务器端口 6379
3 -s 指定服务器 socket
4 -c 指定并发连接数 50
5 -n 指定请求数 10000
6 -d 以字节的形式指定 SET/GET 值的数据大小 2
7 -k 1=keep alive 0=reconnect 1
8 -r SET/GET/INCR 使用随机 key, SADD 使用随机值
9 -P 通过管道传输 请求 1
10 -q 强制退出 redis。仅显示 query/sec 值
11 –csv 以 CSV 格式输出
12 -l 生成循环,永久执行测试
13 -t 仅运行以逗号分隔的测试命令列表。
14 -I Idle 模式。仅打开 N 个 idle 连接并等待
# 测试:-c 100个连接 -n 十万个请求
redis-benchmark -h localhost -p 6380 -c 100 -n 100000
# 测试结果(Set、Get部分):
====== SET ======
100000 requests completed in 0.74 seconds # 100000次写入完毕,0.74秒
100 parallel clients # 100个并发客户端同时写入
3 bytes payload # 每次写入3个字节的数据
keep alive: 1 # 一台服务器来处理这些请求
host configuration "save": 900 1 300 10 60 10000
host configuration "appendonly": no
multi-thread: no

99.85% <= 1 milliseconds
99.90% <= 2 milliseconds
99.94% <= 3 milliseconds
100.00% <= 4 milliseconds
100.00% <= 4 milliseconds
135501.36 requests per second # 每秒处理的请求135501.36次!
====== GET ======
100000 requests completed in 0.79 seconds
100 parallel clients
3 bytes payload
keep alive: 1
host configuration "save": 900 1 300 10 60 10000
host configuration "appendonly": no
multi-thread: no

98.01% <= 1 milliseconds
100.00% <= 1 milliseconds
125944.58 requests per second # 每秒处理的请求125944.58次!

只显示指定结果的query/sec值:

redis-benchmark -h localhost -p 6380 -c 100 -n 100000 -t set,get,incr -q

query/sec

文章作者: 何同昊
文章链接: http://hetonghao.cn/2020/05/Redis/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 何同昊 Blog
支付宝超级火箭🚀
微信超级火箭🚀