Redis 简介
设置 key value 数据
命令: set key value
示例: set name zhangsan
数据查询
命令: get key
示例: get name
若对应的数据不存在,返回空( nil )
清屏
命令: clear
帮助命令
命令: help 指令
示例: help set
退出命令
exit
quit
添加/修改数据
命令: set key value
示例: set name zhangsan //添加数据
set name lisi //对同一个 key 再次赋值,就为修改数据
获取数据
命令: get key
示例: get name
删除数据
命令: del key
示例: del name
补充
添加修改多个数据(多个数据中原始存在的的则会覆盖)
命令: mset key1 value1 key2 value2 ...
示例: mset name zhangsan age 18 ...
获取多个数据(不存在的数据会给出 nil 值)
命令: mget key1 key2 ...
示例: mget name age ...
追加信息到原始信息后部(若原始信息存在则追加,否则新建数据)
命令: append key value
示例: append age +
例如:原先 age 的数据为 18,append 后为: 18+
返回值为追加后,字符串的长度
获取字符串长度
命令: strlen key
示例: strlen name
单数据操作
多数据操作
如何选择
业务场景
解决方案
具体操作
设置数值数据增加指定范围的值
命令: incr key // 对字符串数值形式的数据进行 + 1 的操作
示例: incr num // num 对应的 value 值 + 1
命令: incrby key 增加值 // 对字符串数值形式的数据进行加上指定数值的操作
示例: incrby num 10 // num 对应的 value 值 + 10
命令: incrbyfloat key 增加值 // 对字符串数值新式的数据进行加上指定浮点数的操作
示例: incrbyfloat num 1.5 // num 对应的 value 值 + 1.5
设置数值数据减少指定范围的值
命令: decr key // 对字符串数值形式的数据进行 - 1 的操作
命令: decrby key 减少值 // 对字符串数值形式的数据进行减去指定数值的操作
补充
业务场景
解决方案
具体操作
命令: setex key 秒数 value // 设置 key 对应的 value 数据生命周期为多少秒
示例: setex num 5 value // 设置 num 对应的 value 数据生命周期为 5 秒
命令: psetex key 毫秒数 value // 设置 key 对应的 value 数据生命周期为多少毫秒
示例: psetex num 5 value // 设置 num 对应的 value 数据生命周期为 5 毫秒
补充
业务场景
解决方案
数据库中热点数据 key 的命名规范
表名 主键名 主键值 字段名
user : id : 1001 : name表名 主键名 主键值 字段名
order : id : 1143 : order_name
hash 存储结构优化
添加/修改数据
命令: hset key field value
示例: hset user name zhangsan
获取数据
命令: hget key field
示例: hget user name
命令: hgetall key // 获取 key 对应的所有 field 数据
示例: hgetall user
删除数据(也删除多个 field 的数据)
命令: hdel key field1 [field2]
示例: hdel user name age
添加/修改多个数据
命令: hmset key field1 value1 field2 value2 ...
获取多个数据
命令: hmget key field1 field2 ...
获取 hash 表中 key 对应字段( field )的数量
命令: hlen key
获取 hash 表中是否存在指定字段
命令: hexists key field
获取 hash 表中 key 对应的所有字段名或字段值
命令: hkeys key // 获取指定 key 对应的所有 field 的值
命令: hvals key // 获取指定 key 对应的所有 filed 的 value 值
设置指定字段的数值数据增加指定范围的值
命令: hincrby key field 增加值 // 执行指定 key 的数值类型的 field 属性加上指定值的操作
命令: hincrbyfloat key field 增加值 // 执行指定 key 的数值类型的 field 属性加上指定浮点值的操作
补充
业务场景
数据模型
业务分析
缺点
解决方案
每条购物车中的商品记录保存两条 field
优化
此时,保存的商品信息,对于同一个商品,实际上是一样的,差距只是在于购买的商品数量不同,因此,可以将商品信息抽取出来,将商品的 id 作为 field,商品信息的 json 字符串作为 value,成为一个键值对,也就是一个商品 hash,这样,就可以将多个不同的商品 hash 独立出来,作为一个公共的 hsah 区域(也可以根据商品种类,分为多个公共 hash 区域),每个用户的购物车中,保存的就只是商品购买数量,至于商品的信息,全部都去公共的商品 hash 中通过商品 id 进行查询
不可能一开始就将所有的商品全部加入到商品公共 hash 中去,因为每时每刻都可能会出现新的商品上架,可以采取用户购买了一种商品,就将该商品加入到商品公共 hash 中去,同时为了避免重复的商品信息,使用
命令: hsetnx key field value // 判断当前 key 对应的 field 是否有值,若有,则不进行添加操作
来添加商品信息,该命令会先判断当前 key 对应的 field 是否有值,若有,则不进行添加操作,若该商品的信息发生变化,则依然通过 hset 来修改其信息
添加/修改数据
命令: lpush key value1 [value2] ... // 从左边开始添加多个数据到 list 中
命令: rpush key value1 [value2] ... // 从右边开始添加多个数据到 list 中
获取数据(获取数据统一从左边进行获取)
// 获取列表中指定索引范围的数据(索引从 0 开始,若添加数据时,使用的是 lpush 则查出的数据顺序与添加时的顺 序相反,反之亦然(类似于 Stack 结构);倒数第一个索引为 -1,可以直接通过 lrange 0 -1 查询出所有数据)
命令: lrange key start stop
// 获取列表中指定所有的数据(索引从 0 开始)
命令: lindex key index
// 获取指定列表的长度
命令: llen key
获取并移除数据(可以从右边也可以从左边获取)
// 从左边出元素
命令: lpop key
// 从右边出元素
命令: rpop key
补充
规定时间内,从多个 list 中获取并移除数据
命令: blpop key1 [key2] ... timeout // 从左边开始移除
命令: brpop key1 [key2] ... timeout // 从右边开始移除
解析
业务场景
解决方案
补充
添加数据
命令: sadd key value1 value2
获取全部数据
命令: smembers key
删除数据
命令: srem key value1 value2
获取集合数据总量
命令: scard key
判断集合中是否包含指定的数据
sismember key value
业务场景
业务分析
解决方案
随机获取集合中指定数量的数据
命令: srandmember key [count]
随机获取集合中的某个数据并将数据移出集合
命令: spop key
补充
业务场景
解决方案
求两个集合的交,并,差集
命令: sinter key1 [key2] // 交集
命令: sunion key1 [key2] // 并集
// 差集(redis 中的差集是有方向性的,以在左边的 key 对应的集合为准,以右边的集合比较,相当于从左边的集合中元素去除与右边相比较,相同的元素,剩下的就叫差集)
命令: sdiff key1 [key2]
将两个集合的交,并,差集存储到指定集合中
命令: sinterstore 指定集合 key1 [key2]
命令: sunionstore 指定集合 key1 [key2]
命令: sdiffstore 指定集合 key1 [key2]
将指定数据从原始数据移动到指定目标集合中
命令: smove source 指定集合 指定元素
补充
添加数据
命令: zadd key score1 member1 [score2 member2]
获取全部数据
// 升序获取 start 到 stop 索引之间的值(闭区间),加上 WITHSCORES 参数后,会显示 score 字段
命令: zrange key start stop [WITHSCORES]
// 降序获取 start 到 stop 索引之间的值,加上 WITHSCORES 参数后,会显示 score 字段
命令: zrevrange key start stop [WITHSCORES]
删除数据
命令: zrem key member [member ...]
按条件获取数据
// 查询指定范围 min ~ max 内的数据(闭区间),升序,limit 限定查询结果,用法与 MySQL 相同
命令: zrangebyscore key min max [WITHSCORES] [LIMIT]
// 查询指定范围 min ~ max 内的数据(闭区间),降序,limit
命令: zrevrangebyscore key max min [WITHSCORES]
按条件删除数据
// 删除 start 到 stop 索引之间的值(闭区间)
命令: zremrangebyrank key start stop
命令: zremrangebyscore key min max
注意
获取集合数据总量
// 获取数据总数
命令: zcard key
// 获取指定范围 min ~ max(闭区间) 的数据总数
命令: zcount key min max
集合交并操作
// 多个集合的 交 操作,执行 交 操作时,还会对集合中的 score 进行求和操作(还有其他操作,如最大值等)
命令: zinterstore 保存结果的集合 参与操作的集合个数 key1 key2 ...
// 多个集合的 并 操作,执行 并 操作时,还会对集合中的 score 进行求和操作(还有其他操作,如最大值等)
命令: zunionstore 保存结果的集合 参与操作的集合个数 key1 key2 ...
业务场景
解决方案
// 获取数据对应的索引,升序
命令: zrank key member
// 获取数对应的索引,降序
命令: zrevrank key member
// 获取 score 值,升序
命令: zscore key member
// score 值增加指定数值
命令: zincrby key increment member
使用 zrank 或 zrevrank 获取排名数
使用 zscore 获取排名依据的值
使用 zincrby 修改排名依据,改动排名
业务场景
解决方案
对于基于时间线限定的任务处理,将处理时间记录为score值,利用排序功能区分处理的先后顺序
记录下一个要处理的时间,当到期后处理对应任务,移除redis中的记录,并记录下一个要处理的时间
当新任务加入时,判定并更新当前下一个要处理的任务时间
为提升sorted_set的性能,通常将任务根据特征存储成若干个sorted_set。例如1小时内,1天内,周内, 月内,季内,年度等,操作时逐级提升,将即将操作的若干个任务纳入到1小时内处理的队列中
// 获取当前系统时间
// "1410856598" 秒(UNIX 时间戳)
// "928370" 微秒(当前这一秒已经过去的微妙数,一微秒等于百万分之一秒)
命令: time
补充
业务场景
解决方案
解决方案改良
删除指定 key
命令: del key
获取 key 是否存在
命令: exists key
获取 key 的类型
命令: type key
为 key 设置有效期
命令: expire key seconds // 设置秒单位的有效期
命令: pexpire key milliseconds // 设置毫秒单位的有效期
命令: expireat key timestamp // 设置有效期为时间戳
命令: pexpireat key milliseconds-timestamp // 设置有效期为毫秒时间戳
获取 key 的有效时间
命令: ttl key // 返回指定 key 剩余的有效期,若 key 不存在返回值为 -2,若 key 存在且失效,返回值为 -1
命令: pttl key // 返回的时间以毫秒为单位
切换 key 时效为永久
命令: persist key
为 key 改名
命令: rename key newkey // 若修改的 key 名称已经存在,会覆盖已经存在的 key
命令: renamenx key newkey // 如果修改的 key 名称不存在,则改名
对所有 key 排序
命令: sort [desc]// 对 list ,set,sorted-set 等集合类型排序(升序),通过 desc 控制排序规则
其他 key 通用操作
命令: help @generic
切换数据库
命令: select index
其他操作
命令: quit // 退出
命令: ping // 测试服务器是否联通,返回 PONG 代表服务器通,也可以通过参数自定义返回信息
命令: echo message // 控制台输出
数据移动
命令: move key db // 将指定 key 的数据移动到指定索引位置的数据库,原数据库的数据将被删除,移动到的数据库中,也不能存在相同的 key
数据清除
命令: dbsize // 查看数据库中有多少个 key
命令: flushdb // 刷新当前数据库的数据
命令: flushall // 刷新所有数据
package com.dhj;
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class JedisTest {
@Test
public void testJedis() {
/**
* 1.连接 redis,
* 参数1: 需要连接 redis 服务的 ip
* 参数2: 需要连接 redis 服务的 端口号
*/
Jedis jedis = new Jedis("127.0.0.1", 6379);
/**
* 2.操作 redis
* jedis 中对 redis 的操作,与在 redis 中完全相同
*/
jedis.set("key1", "value1");
System.out.println(jedis.get("key1"));
// 3.关闭连接
jedis.close();
}
}
package com.dhj;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.util.ResourceBundle;
public class RedisUtil {
static JedisPool jedisPool;
static String host;
static int port;
static int maxTotal;
static int maxIdle;
// 静态代码块初始化 JedisPool
static {
// 加载配置文件,使用 ResourceBundle 时,无需写上文件格式后缀
ResourceBundle rb = ResourceBundle.getBundle("redis");
host = rb.getString("redis.host");
port = Integer.parseInt(rb.getString("redis.port"));
maxTotal = Integer.parseInt(rb.getString("redis.maxTotal"));
maxIdle = Integer.parseInt(rb.getString("redis.maxIdle"));
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
// 最大连接数
jedisPoolConfig.setMaxTotal(maxTotal);
// 活动连接数
jedisPoolConfig.setMaxIdle(maxIdle);
jedisPool = new JedisPool(jedisPoolConfig, host, port);
}
// 返回 Jedsi 对象
public static Jedis getJedis() {
return jedisPool.getResource();
}
// 关闭 Jedis 资源
public static void closeJedis(Jedis jedis) {
jedis.close();
}
// 测试一下
public static void main(String[] args) {
Jedis jedis = getJedis();
jedis.set("key2", "zhangsan");
System.out.println(jedis.get("key2"));
}
}
安装 redis
wget http://download.redis.io/releases/redis-?.?.?.tar.gz
安装 gcc
yum install gcc-c++
若出现 ‘jemalloc/jemalloc.h:没有那个文件或目录’ 等字样,执行如下命令
make distcleanmake distclean
否则直接执行
make
出现如下字样 ‘Hint: It’s a good idea to run ‘make test’ ;’ 代表编译成功
再次执行
make install
进入 redis 安装目录下的 src 目录
执行
测试一下
redis-server --port 端口号
客户端连接指定 redis 端口
redis-cli -p 端口号
在 redis 目录下查看 redis 配置文件并写入自定义的配置文件
cat redis.conf | grep -v '#' | grep -v '^$' > redis-6379.conf
修改配置文件
port 6379 // 指定启动的端口号
daemonize yes // 是否以守护进程的方式启动,关闭后,会在控制台输出启动信息,开启则以后台方式启动
logfile "6379.log" // 日志文件名
dir /opt/module/redis-4.0.0/data // 日志文件的存放路径
以配置文件的方式启动
redis-server 配置文件路径
统一管理配置文件
多个配置文件启动 redis 服务
指令
save
作用
配置解析
配置修改
由于 redis 是单线程的,save 指令的执行会阻塞当前 redis 服务器,知道当前 RDB 过程完成为止,可能造成长时间阻塞,线上环境不建议使用
save 指令后台执行
bgsave // 手动启用后台保存操作,但是不立即执行
save second changes
作用
参数
配置
在 conf 文件中进行配置
示例
save 900 1
save 300 10
save 60 10000
关闭服务器时保存数据
shutdown save
服务器运行过程中重启
debug reload
配置 (在 conf 目录下修改配置文件)
appendonly yes|no // 开启 AOF,默认为不开启
appendfsync always|everysec|no // 配置 AOF 写数据的策略
AOF 相关配置
appendfilename filename // 修改 AOF 持久化文件的文件名
dir // 修改持久化文件的保存路径
手动重写( 后台运行 )
bgrewriteaof
自动重写
auto-aof-rewrite-min-size size
auto-aof-rewrite-percentage percentage
自动重写触发条件设置
auto-aof-rewrite-min-size size // 自动 AOF 重写的最小尺寸,达到该值时,则自动重写
auto-aof-rewrite-percentage percent // 自动 AOF 重写的百分比,达到该百分比时,自动重写,该比值为当前的尺寸减去配置的尺寸比上配置尺寸,若最终结果 >= auto-aof-rewrite-percentage percent,则自动重写
上述信息以及其他运行信息,可以通过运行如下指令获得
info Persistence
开启事务
multi // 设定事务的开始位置,此指令执行后,后续的所有指令都将加入到事务中且不会立即执行
执行事务
exec // 设定事务结束的位置,同时执行事务,与 mulit 成对出现且成对使用
取消事务
discard // 终止当前事务,发生在 mulit 之后,exec 之前
业务场景
业务分析
解决方案
对 key 添加监视锁,在执行 exec 前如果 key 发生了变化,终止事务执行
watch key1 [key2 ……]
取消对所有 key 的监视
unwatch
注意
业务场景
业务分析
解决方案
设置一个公共锁
命令: setnx lock-key value
示例: setnx lock-name "zhangsan"
利用 setnx 命令的返回值特征,有值则返回设置失败,无值则返回设置成功
补充
/*
将 key 设置值为 value,如果 key 不存在,这种情况下等同 SET 命令。 当 key 存在时,什么也不做。
返回值
1: 如果 key 被设置了
0: 如果 key 没有被设置
*/
setnx key value
上述解决方案是一种设计上的概念,不是 redis 自带的机制,因此,需要保证执行相关操作时,具有一定的规范,例如约定好使用同一个公共锁,否则,该操作就具有风险性
业务场景
业务分析
解决方案
使用 expire 为锁 key 添加时间限定,到时不释放,放弃锁
expire lock-key second // 设置锁的生命周期时间为秒级
pexpire lock-key milliseconds // 设置锁的生命周期时间为毫秒级
由于操作通常都是微秒或毫秒级,因此该锁定时间不宜设置过大。具体时间需要业务测试后确认。
例如:持有锁的操作最长执行时间127ms,最短执行时间7ms。
测试百万次最长执行时间对应命令的最大耗时,测试百万次网络延迟平均耗时
锁时间设定推荐:最大耗时120%+平均网络延迟110%
如果业务最大耗时<<网络平均延迟,通常为2个数量级,取其中单个耗时较长即可
数据删除策略的目标
问题
新数据进入检测
redis 使用内存存储数据,在执行每一个命令前,会调用 freeMemoryIfNeeded() 检测内存是否充足。如果内存不满足新加入数据的最低存储要求,redis 要临时删除一些数据为当前指令清理存储空间。清理数据的策略称为逐出算法
注意: 逐出数据的过程不是 100% 能够清理出足够的可使用的内存空间,如果不成功则反复执行。当对所有数据尝试完毕后,如果不能达到内存清理的要求,将出现错误信息。
(error) OOM command not allowed when used memory >'maxmemory'
影响数据逐出的相关配置
最大可用内存
maxmemory // 占用物理内存的比例,默认值为0,表示不限制。生产环境中根据需求设定,通常设置在50%以上。
每次选取待删除数据的个数
maxmemory-samples // 选取数据时并不会全库扫描,导致严重的性能消耗,降低读写性能。因此采用随机获取数据的方式作为待检测删除数据
删除策略
maxmemory-policy // 达到最大内存后的,对被挑选出来的数据进行删除的策略
检测易失数据(可能会过期的数据集server.db[i].expires)
volatile-lru // 挑选最近最少使用的数据淘汰
volatile-lfu // 挑选最近使用次数最少的数据淘汰
volatile-ttl // 挑选将要过期的数据淘汰
volatile-random // 任意选择数据淘汰
检测全库数据 ( 所有数据集 server.db[i].dict )
allkeys-lru // 挑选最近最少使用的数据淘汰
allkeys-lfu // 挑选最近使用次数最少的数据淘汰
allkeys-random // 任意选择数据淘汰
放弃数据驱逐
no-enviction (驱逐):禁止驱逐数据 (redis4.0中默认策略),会引发错误 OOM(Out Of Memory)
使用 info 命令输出监控信息,查询缓存 hit (命中) 和 miss (丢失) 的次数,根据业务需求调优Redis配置
在 redis 配置文件中,配置逐出策略
maxmemory-policy volatile-lru
设置服务器以守护进程的方式运行
daemonize yes|no
绑定服务器(只能通过该 ip 地址访问)
bind 127.0.0.1
设置服务器端口号
port 6379
设置数据库数量
databases 16
设置服务器以指定日志记录级别
loglevel debug|verbose|notice|warning
日志记录文件名
logfile 端口号.log
设置同一时间最大客户连接数,默认无限制,当达到最大连接后,会关闭新连接
maxclients 0
客户端闲置等待最大时长,达到最大之后关闭连接,如需关闭该功能,设置为 0,单位: 秒
timeout 300
多服务器快捷配置,导入并加载指定配置文件信息,用于快速创建 redis 公共配置较多的 redis 实例配置文件,便于维护
include /path/server-端口号.conf
获取指定 key 对应的偏移量上的 bit 值
getbit key offset
设置指定 key 对应偏移量上的 bit 值,value 只能是 1 或 0
setbit key offset value
对指定 key 按位进行交、并、非、异或操作,并将结果保存到 destKey 中
bitop op destKey key1 [key2...]
统计指定 key 中 1 的数量
bitcount key [start end]
基数
loglog算法
添加数据
pfadd key element [element ...]
统计数据
pfcount key [key ...]
合并数据
pfmerge destkey sourcekey [sourcekey...]
相关说明
简介
基本操作
添加坐标点
// 将坐标添加到指定的 key 中,给出坐标的横坐标 longitude 纵坐标 latitude 以及坐标的名称 member
geoadd key longitude latitude member [longitude latitude member ...]
获取坐标点
geopos key member [member ...]
计算坐标点距离( 水平位置的距离,默认单位为 m ,通过 unit 来定义单位,例如 km )
geodist key member1 member2 [unit]
根据坐标,求范围内的数据
georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
根据点求范围内的数据
// 求出指定 key 中,指定点 member 指定范围 redius 单位为 m|km 内的点
georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [count count]
获取指定点对应的坐标 hash 值
geohash key member [member ...
提供数据方
数据提供方
图示
需要解决的问题
核心工作
主从复制工作流程
总述
图示
编辑配置 .conf 文件
// 主节点
bind 192.168.175.132 // 绑定本机 ip 地址
appedonly no // 关闭 aof 持久化
pidfile /var/run/redis_6379.pid // pid 文件
dbfilename dump-6379.rdb // rdb 备份文件名
port 6379 // 启动端口号
// 从节点 1
bind 192.168.175.133 // 绑定本机 ip 地址
appedonly no // 关闭 aof 持久化
pidfile /var/run/redis_6380.pid // pid 文件
dbfilename dump-6380.rdb // rdb 备份文件名
port 6380 // 启动端口号
// 从节点 2
bind 192.168.175.134 // 绑定本机 ip 地址
appedonly no // 关闭 aof 持久化
pidfile /var/run/redis_6381.pid // pid 文件
dbfilename dump-6381.rdb // rdb 备份文件名
port 6381 // 启动端口号
... 若为多台主从结构,以此类推
通过配置文件,启动三台 redis 服务器
redis-server ./myconf/myredis.conf // 通过指定配置文件的路径启动 redis-server
redis-cli -h 192.168.175.132 -p 6379 // 通过指定的 ip 和端口连接 redis 服务
连接 redis 服务器客户端,通过 info replication 查看主从复制的相关信息
#Replication
role:master // 当前服务器的角色,为 master
connected_slaves:0 // 从机的连接数
master_failover_state:no-failover
master_replid:6e48debd07a2655e5e4478ba7c5930cf1f02c531
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
配置主从1(一主多仆)
// 这里以 6379 为主机,6380 和 6381 作为从机
SLAVEOF 192.168.175..132 6379 // 配置 ip 为 192.168.175.132 端口号 6379 作为当前 redis 服务器的主机,可配置多台
// 也可以通过配置文件来永久配置从机(通过命令配置的从机,在重启后会失效)
slaveof <master ip> <master port>
配置完成,到 master 查看
#Replication
role:master // 当前机器为 master 机,任何没有从关系的机器都为 master 机,以此类推,树形结构
connected_slaves:2 // 有两台从机
slave0:ip=192.168.175.133,port=6380,state=online,offset=84,lag=0
slave1:ip=192.168.175.134,port=6381,state=online,offset=84,lag=1
master_failover_state:no-failover
master_replid:72d1dd670d53ffd686e0ded5aecddabe21423dc5
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:84
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:84
测试
1. 使用 ping 命令测试,返沪结果 pong
2. master 机保存数据,其余 slave 机查看是否有数据,有,则主从同步关联成功
注意
主从复制原理
配置主从2(薪火相传)
配置主从3(反客为主)
什么是哨兵模式
搭建哨兵模式
自定义创建 sentinel.conf 文件
配置哨兵,填写如下内容
// sentinel monitor 监控 mymaster 主机,主机 ip 为 127.0.0.1 端口为 6379 至少有 1 个哨兵同意 master 迁移
sentinel monitor mymaster 192.168.175.132 6379 1
// 若为了方便查看日志,也可以设置为前台启动
daemonize no
将配置文件分发到需要充当哨兵的节点处,master 节点也可以作为哨兵
先启动主机进程,然后启动从机的进程(为了方便,在配置文件中直接配置为从机启动),最后通过如下命令依次启动哨兵进程
redis-sentinel ../sentinel.conf
杀掉 master 节点的进程,在 redis-cli 中使用如下命令,查看剩余的 slave 节点中是否有变为 master 的节点,若有,则哨兵配置成功
info replication
补充
展现用户权限列表
acl list
查看可以添加权限的指令类别
acl cat
加参数类型名可以查看类别下的具体指令
acl cat string
查看当前用户
acl whoami
创建新用户默认权限
acl setuser 用户名
/* 在上面的示例中,我根本没有指定任何规则。
如果用户不存在,这将使用 just created 的默
认属性来创建用户。如果用户已经存在,则
上面的命令将不执行任何操作*/
设置有用户名、密码、ACL 权限、并启用的用户
/*该用户名为 user2 , on 代表启用状态,> 后面跟用户的密码,~cached: 代表用户只能操作以 cached:* 开头的 key ,+get 代表只能对其进行 get 操作*/
acl setuser user2 on >password ~cached:* +get
切换用户
auth 用户名 密码
io-threads-do-reads yes // 启用 IO 多线程
io-threads 4 // 设置线程数量