目录
第一章:配置
一、常用命令
二、配置步骤
三、连接后的操作
第二章:数据类型
一、十大数据类型
二、常用命令
三、String类型
1、set key value 选项
2、get
3、value加减(需要是数字类型)
4、获取当前value长度与往后加入数据
5、分布式锁
6、getset修改 (先get再set)
7、应用场景
四、List类型
1、插入
2、弹出
3、根据索引获得元素
4、获取列表长度
5、根据数据值删除元素
6、裁剪数据
7、弹出加入
8、根据索引修改元素值
9、根据元素值插入元素
10、应用场景
五、Hash哈希数据(相当于 Map> ),map
1、添加数据
2、获得数据
3、添加多个数值对
4、获取多个数据
5、获取全部数据
6、根据key1删除数据
7、获取当前key下的键值对数量
8、判断当前key是否存在字段
9、获取当前key下的全部keyN
10、获取当前key下的全部valueN
11、对数据进行加操作 (减操作可以通过加复数实现)
12、当前key不存在字段key1-value1才添加
13、应用场景
六、Set无序集合类型(相当于HashSet)
1、添加元素
2、遍历数据
3、判断key1中是否存在value1
4、删除一个value
5、获取元素个数
6、随机展示几个数据
7、随机弹出几个数据
8、把key1的一个数据给key2
9、集合运算
10、应用场景
七、Zset有序集合(sortedset)
1、添加元素
2、遍历数据
3、获取元素的权重
4、获取元素的个数
5、删除元素
6、元素权重的加法
7、根据权重筛选数据
8、根据权重范围统计数目
9、弹出对应权重的值
10、获得下标索引
11、应用场景
八、位图
1、通过索引添加或者修改元素状态
2、通过索引获取元素
3、获得组数
4、统计一的数目
5、集合运算
6、应用场景
九、基数统计(HyperLogLog)
1、添加
2、统计的个数
3、合并
4、应用场景
十、GEO地理空间
1,添加
2、遍历添加的地名
3、根据地名返回经纬度
4、返回坐标的geohash哈希表示
5、返回两地的距离
6、查找范围的数据
7、应用场景
十一、Stream 流
1、添加消息队列到末尾
2、显示消息队列中的数据内容
3、反序输出
4、根据消息id删除消息
5、消息队列的长度
6、截取消息
7、获取消息
8、创建消费组
9、创建消费者读取消息
10、查看消费组已经读取但未确认的消息
11、签收消息
十三、位领(bitfield)
第三章:持久化
一、RDB(Redis DateBase)
1、自动触发
2、手动触发
3、优缺点
4、触发RDB快照的情况
5、禁用快照
二、AOF持久化
1、三种写回策略
2、开启aof
3 、结构
4、异常aof文件修复命令
5、优缺点
6、aof的重写机制
7、aof总结
三、混合持久化
四、redis事务
1、开启执行事务
2、放弃事务
3、全体连坐
4、冤头债主
5、watch监控
五、redis管道
六、发布订阅
第四章:团队协作
一、redis复制(sentinel)
1、操作
2、配置步骤
3、操作权限说明
4、薪火相传
5、从属断开当前主机连接
6、总结
二、redis哨兵
1、/opt目录里的redis-7.0.11中,把sentinel.conf拷贝到/myredis
2、参数配置
3、启动哨兵
4、原理
5、总结
三、集群
1,在/myredis目录创建./cluster (mkdir ./cluster)
2, 在/cluster 下(vim ./redisCluster6381.conf)
3、启动redis主机
4、构建主从(自动分配主从)
5、连接主机
6、数据限制
7、主从容错切换
8、新增主机
9、集群缩容
10、分组存入数据
11、总结
第五章:springboot整合Redis
redis-benchmark:性能测试工具,服务启动后运行该命令,看看自己本子性能如何
redis-check-aof:修复有问题的AOF文件,rdb和aof后面讲
redis-check-dump:修复有问题的dump.rdb 文件
redis-cli :客户端,操作入口
redis-sentinel:redis 集群使用
redis-server: redis服务器启动命令
quit 退出客户端连接
1、打开Xftp7 把文件 发送到 /opt目录下( redis-7.0.11.tar.gz文件)
2、服务器安装c++环境 (yum -y install gcc-c++)
3、打开到/opt目录下 解压文件 ( tar -zxvf redis-7.0.11.tar.gz)
4、进入解压好的文件redis-7.0.11 执行安装命令(make && make install)
5、在当前目录下创建文件夹来备份配置文件( mkdir /myredis)
6、把配置文件拷贝进/myredis (cp redis.conf /myredis/myredis7.conf)
7、在/myredis 目录下配置myredis7.conf (vim myredis7.conf)
修改配置文件:
修改 /myredis目录下的redis.conf 配置文件做初始化设置(配置后需要重启)
daemonize no 改为 yes (作为服务器后端启动)
protect-mode yes 改为 no (保护模式)
bind 127.x.x 改为 注释 (ip限制)
添加redis 密码 requirepass 密码 (密码)
8、启动服务: redis-server ./myreis7.conf
9、连接redis: redis-cli -a 111111 -p 6379
测试连接ping
防止中文乱码
redis-cli -a 111111 --raw
获取redis的信息
连接后的支持命令
config get requirepass (获取redis数据库密码)
config get port (获取redis端口号)
config get dir (获取RDB保存路径)
查看身份:info replication
字符串(String)
最大 512M
列表 (List)
双向链表
最大40亿个元素
哈希表(Hash)
集合(Set)
无序,无重复
有序集合(ZSet)
地理空间(GEO)
经纬度
基数统计(HyperLogLog)
统计
位图(bitmap)
01确认
位域(bitfield)
流(Stream)
keys* (看当前库所有的key)
exists key (判断某个key是否存在)
type key (查看key是什么类型)
del key (删除指定的key数据)
unlink key (非阻塞删除,仅仅将keys从keyspce元素数据中删除,真正的删除会在后续异步中操作)
ttl key (查看还有多少秒过期)
expire key 秒钟 (为key设置过期时间)
move key 2 (将当前数据的key移动到给定的数据库2)
select 2 (切换数据库3,[0-15],,默认为0)
dbsize (查看当前数据库key的数量)
flushdb (清空当前库)
flushall (通杀全部库)
命令不区分大小写 ,但key是区分大小写
操作:
设置数据,设置多个数据,设置不存在的数据,设置存在的数据
获取数据,获取多个数据,先获取再设置数据,获取指定长度的数据
获取数据长度,
向当前数据后加入数据
数据加法操作,数据减法操作
选项 {
ex 2 (以秒为单位设置过期时间)
px 2 (以毫秒为单位设置时间)
exat 2 (设置以秒为单位的unix时间戳所对应的时间为过期时间)
pxax milliseconds-timestamp (设置以毫秒为单位的unix时间戳所对应为过期时间)
nx (键不存在的时候设置键值)
xx ( 键存在的时候设置键值)
keepttl (修改时候,生存时间续借原来的)
get (反回指定键原本的值,若键不存在时返回nil,先get再set,等于getset)
}
衍生set
setex、psetex、setnx
设置当前key对应的指定value的索引数据的值
setrange key1 0 x (把当前值的第一位改为x)
设置多个key
mset key1 value1 key2 value2
msetnx key1 value1 key2 value2 (要么一起成功,要么一起失败)
获取一个
get key
获取指定长度
getrange key1 0 3 (获取value的0~3 字符)
获取多个value
mget key1 key2
value++ (数据是数字类型才能加)
incr key (value++)
incrby key 8 (value+=8)
value--
decr key (value--)
decrby key 8(value-=8)
获取当前value长度
strlen key (获取当前value长度)
向value后加入数据
append key xxx (向value后面加入xxx)
setnx key value
setex(set with expire)键秒值/setnx(set if not exist)
getset key value (结果返回原来的旧值,先get再set)
点赞等累加
双端链表结构
操作:左插入,右插入,遍历, 左弹出,右弹出,
根据索引获取数据,根据索引修改数据
根据元素值插入元素,根据元素值删除数据
获得列表长度,,裁剪数据
弹出插入
从左边插入 (最新的在最左(前)边)
lpush key value1 value2 value3
从右边查插入 (最新的在右(后)边)
rpush key value1 value2 value3
遍历(从左往右)
lrange key 0 -1 (遍历全部)
lrange key 0 4 (遍历0~4)
从左边弹出
lpop key (从左边弹出一个数据)
从右边弹出
rpop key (从右边弹出一个数据)
lindex key 2 (获得索引为2的元素)
llen key (获取当前链表长度)
lrem key 3 22 (删除3个值等于22的元素)
ltrim key 3 6 (裁剪数据,只要索引3~6的数据)
rpoplpush key1 key2 (从key1右边弹出一个数据,插入到key2的左边)
lset key 1 22 (把key列表中索引是1 的元素值修改成22)
linsert key before 11 00 (在key列表中找到第一个值为11的元素,在它前面插入00)
linsert key after 11 00 (在key列表中找到第一个值为11的元素,在它后面插入00)
订阅的文章,分页内容
操作:添加数据,获取数据,获取全部数据,获取keys,获取values,
数据加法操作,
添加一个不存在的key1-value1
hset key key1 value1 key2 value2 (设置一对值,和hmsety一样)
hget key key1 (获得key1的值)
hmset key key1 value1 key2 value2
hmget key key1 key2 (获取key中 获取key1 和key2的值)
hgetall key (获取key中的全部数据)
hdel key key1 (删除 key中的 key1-value1)
hlen key (获取key下的键值对数量)
hexists key key1 (判断key下是否存在key1)
hkeys key (获取key下的全部keyN)
hvals key (获取key下的全部valueN)
hincrby key key1 10 (对key下的value1 加10,整数添加)
hincrbyfloat key key1 0.5 (对key下的value1 加0.5,可以进行小数添加)
hsetnx key key1 3 (当前key不存在key1-value1 才添加字段)
购物车
无序无重复列表
特点:单值多value,且,无序无重复
操作:添加元素、遍历数据、删除数据
随机展示数据、数据弹出数据
把A的一个数据给B
集合运算
判断数据中是否存在数据value
sadd key value1 value2 value3 (添加数据,且自动去重)
smembers key (遍历key 中的全部数据)
sismember key value2 (判断当前key中是否存在value2)
srem key value3 (删除key中的value3数据,成功输出1)
scard key (获取当前key的元素个数)
srandmember key 3 (随机展示3 个数据,不变更原始数据)
spop key 3 (随机弹出3个数据,会变更原始数据)
smove key1 key2 4 (把key1中的4 给key2)
减法
sdiff key1 key2 (结果为去除key1中key2拥有的元素,key1和key2的元素内容都不会被改变)
A-B :结果为去除A中B拥有的元素
并集
sunion key1 key2 (结果为key1和key2的并集,key1和key2都没有被改变)
交集
sinter key1 key2 (结果为key1和key2的交集,key1和key2都没有被改变)
sintercard 2 key1 key2 (返回交集集合的数据个数)
共同好友,抽奖,点赞中查看共同好友
不重复,有序
zadd key 1 value1 2 value2 3 value3 (添加数据,前面需要标明数据的权重用于排序)
从小到大
zrange key 0 -1 (遍历全部数据)
zrange key 0 -1 withscores (带上权重遍历数据)
从大到小
zrevrange key 0 -1 (遍历全部数据)
zrevrange key 0 -1 withscores (带上权重遍历数据)
zscore key value1 (获取value1的权重)
zcard key (获取当前key中value的个数)
zrem key value1 (删除value1元素)
zincrby key 4 value1 (对value1的权重 加4)
zrangebyscore key 60 90 (获得权重在[60,90]之间的数据)
zrangebyscore key (60 90 (获得权重在(60,90]之间的数据)
zrangebyscore key 60 (90 (获得权重在[60,90)之间的数据)
zrangebyscore key 60 90 withscores(获得权重在[60,90]之间的数据,带上权重)
zcount key 60 90 (统计权重 [60,90]之间的数目)
zmpop 1 key min count 1 (从这1 个key中找到权重最小的那1个value,对原来数据会改变)
zrank key value1 (获得key中value的下标索引,从左往右数)
zrevrank key value1 (获得key中value的下标索引,从右往左数)
热销的商品,对商品的销售进行排序
由0和1状态表现的二进制位的bit数组,本质还是string类型,
使用512M内存可以存储42.9亿的字节数据,
按8位扩容
setbit key 2 1 (把key索引为2的修改为1)
getbit key 2 (查看索引为2的状态)
0~7为一组 即8天为一组
setrlen key (查看组数)
bitcount key (统计key中1的数目)
bitop and key key1 key2 (对key1和key2取交集, 赋值给key,操作成功返回1)
bitop or key key1 key2 (对key1和key2取并集, 赋值给key,操作成功返回1)
应用场景 :(用于状态统计)用户是否登录过YN,
每日签到送奖励,电影、广告是否被点击过,打卡
本质是string类型
统计某个网站的UV、统计某个文章的UV
去重复统计功能的基数(基数是去重复后的真实个数)
pfadd key 1 2 3 4 1 (去重复添加)
pfcount key (统计key中的数量)
pfmerge key key1 key2 (合并key1 key2 给key (会自动去重))
统计某个网站的UV、统计某个文章的UV
什么是UV:Unique Visitor ,独立访客,一般理解为客户端ip
本质是zset
对地理位置进行处理(经纬度)
116.434164,39.909843
geoadd key 经度1 纬度1 地名1 经度2 纬度2 地名2 (添加数据,返回值添加成功个数,不重复)
zrange key 0 -1 (遍历添加的地名)
geopos key 地名1 地名2 (返回地名的经纬度)
geohash key 地名1 地名2 (返回地名的geohash表示)
geodist key 地点1 地点2 km (返回两地的距离,以km为单位)
georadius key 经度 维度 10 km withdist withcoord count 10 (以坐标为原点,返回当前附近 10km内的10条数据地点名字)
georadiusbymember key 经度 维度 10 km withdist withcoord count 10 (按地点为中心返回周 围数据)
选项{withdist:同时返回与当前位置的距离、withcoord:同时将目标位置的经纬度也返回
withhash :同时返回geohash编码的形式
count:限定返回数据的条数
}
附近服务
redis版本的MQ消息中间件+阻塞队列
xadd key * key1 value1 key2 value2 (添加key-value到消息队列中,*表示自动生成队列id,返回消息id)
(消息id必须要比上一个id大,默认用星号表示自动生成规矩,用* 用于XADD命令中,让系统自动生成id)
xrange key - + (显示全部消息数据)
xrange key - + count 2(显示2条消息数据)
选项{start:表示开始值-表示最小值,end表示结束值+表示最大,count表示限定条数}
和xrange相反
xrevrange key + - (反序输出消息数据)
xdel key 1684053013977-0 (根据消息的id删除消息)
xlen key (查看消息队列的长度)
xtrim key maxlen 2 (只要后面的两条消息,返回被抛弃的数目)
xtrim key minlen 2 (只要前面的两条消息,返回被抛弃的数目)
非阻塞
xread count 2 streams key 0-0 (返回前面两条消息)
阻塞
xread count 1 block 0 streams key $ (阻塞当前,获得最新的消息)
选项{count最多读取多少条消息,block 是否已阻塞的方式读取消息,默认不阻塞
如果milliseconds设置为0表示永远阻塞
}
阻塞
分配消息数据{key里面的消息不会被改变}
xgroup create key A & (创建消费组A,读取最新的)
xgroup create key B 0 (创建消费组B,从头开始读)
xreadgroup group groupB B streams key > (消费者B读取全部组里面的消息)
xreadgroup group groupB B coun 2 streams key > (消费者B读取两条消息)
(组的数据读取后就会去除该数据)
xpending key B (查看组B已经读取但未确认)
xack key B 消息id (根据id签收组B中已经读取的消息 )
(key消息会被改变)
了解:i
把某一时刻的数据和状态以文件的形式写到磁盘上,
rdb文件:dump.rdb
操作步骤
更改配置文件
加入dir /myredis/dumpfiles (文件保存位置,不一定修改)
更改 dbfilename dump6379.rdb (文件保存的名字)
更改自动保存 save 5 2 (表示5秒内修改2 次就做持久化处理)
连接后的支持命令
config get requirepass (获取redis数据库密码)
config get port (获取redis端口号)
config get dir (获取RDB保存路径)
数据恢复
执行flushall/flushdb命令也会产生dump.rdb文件,无意义
启动redis服务时候自动加载dump.rdb文件
手动生成rdb文件
save (会阻塞当前redis服务器,直到持久化完成)
bgsave (默认) (在子进程中执行持久化操作,不会阻塞redis服务器)
lastsave 获取命令最后一次成功执行持久化的时间挫(自动保存也算)(date -d @时间戳)
优点:适合大规模的数据恢复、按照业务定时备份、对数据完整性和一致性要求不高
RDB文件在内存中的加载速度要比AOF快得多
缺点:如果意外down掉,恢复数据无法获得最新数据、I/O严重影响服务器性能
配置文件中的默认快照
手动save/bgsave
执行flushall/flushdb命令也会产生dump.rdb文件,但里面是空白
执行shutdown且没有设置开启AOF持久化
主复制时候主节点触发
命令 redis-cli config set save ""
修改配置conf:添加 save ""
以日志(历史操作记录,只记录写入操作)的形式来记录每个写操作
保存的是appendonly.aof文件
Always (同步写回,每个命令执行完立刻同步将日志写回磁盘)
everysec (每秒写回(默认),每个命令执行完后先把日志写到缓冲区,每隔1秒把缓冲区内容写入磁盘)
no (操作系统控制的写回,每个命令执行完,只是先把日志写到aof文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘)
配置文件conf中修改
appendonly yes
修改保存路径
加入 dir /myredis (rdb也会保存在这,aof保存在+appendonlydir目录)
修改保存的名称
使用默认
bafe 表示基础aof
incr 表示增量aof
history 表示历史aof
redis-aof --fix appendonly.aof.1.incr.aof (修复文件 appendonly.aof.1.incr.aof)
优点:更好的保护数据、即使flushall了也能通过日志删除flushall操作来找回数据
缺点:相同数据集的数据而言aof文件远大于rdb文件,速度慢于rdb
当aof的文件的大小超过所设定的峰值时,redis就会自动启动aof文件的内容压缩,
只保留可以恢复数据的最小指令集
手动使用命令 bgrewriteaof来重写
自动触发:
默认:
auto-aof-rewrite-percentage 100 (相比上次重写后aof的大小,判断当前aof是不是增长了一倍,百分比)
auto-aof-rewriter-min-size 64mb (重写时满足的文件大小)
同时满足才会触发
手动触发
命令:
bgrewriteaof
原理:
redis会创建重写子进程
对多条操作同一key的命令进行整理用一条记录去代表多条记录,生成新的aof文件去代替旧的来 达到瘦身
配置 命令
appendonly (是否开启aof) appendonly yes
appendfilename (文件名称使用默认)
appendfsyns (同步方式,使用默认) always/everysec/no
on-appendfsync-on-rewrite (aof重写期间是否同步) on-appendfsync-on-rewrite no
auto-aof-rewrite-percentage (触发重写机制的条件,使用默认)
auto-aof-rewriter-min-size (触发重写机制的条件,使用默认)
开启混合模式
aof-use-rdb-preamble yes
aof开启后 优先aof
禁用redis持久化(纯缓存模式)
save ""( 禁用rdb)
appendonly no (禁用aof)
Mysql事务: sql要么同时成功,要么一起失败,
redis事务:可以一次执行多个命令,本质是一组命令的集合,按顺序地串行化执行而不会被其他命令插入,
不保证原子性,不保证所有指令同时成功或者失败,且没有执行到一半进行回滚的能力
命令
multi (开启事务)
XX
XX
exec (结束事务)
discard (取消事务)
exec (执行所有事务块的指令)
multi (标记一个事务块的开始)
unwatch (取消watch命令对所有key的监视)
watch (监视一个或者多个key)
multi (开启事务)
set k7 v6
set k8 v8
exec (结束事务,执行事务内命令)
multi (开启事务)
set k4 v4
discard (放弃事务,不会执行事务内命令)
(编译时候,指令语法等)
multi (开启事务)
set k3 v3
set k1 (错误语句)
exec (结束事务,事务中有错误指令,事务中所有指令都不会被执行)
(逻辑错误,运行异常)
错误指令不会被执行,其他正确的会被执行
mutli (开始事务)
set k1 v1 (正确指令)
incr k1 (指令正确,但逻辑错误,数值类型才能自增)
exec (事务中正确的会被执行,逻辑错误不会被执行)
redis使用watch来提供乐观锁定,类似cas
监控一个数据,在开启事务对该数据已经进行了操作但还未提交数据 ,该数据被其他外部操作修改,那么事务失败(事务内指令都不会被执行,全体连坐)
执行了exec 之前加的监控都会自动被取消,连接丢失也会被取消
放弃监控
unwatch
当接收的指令过多时候,管道可以一次性处理这些请求,把结构一次性全部返回,避免了重复IO
类似批处理命令(mget,mset)
总结:支持批量执行不同命令,需要服务端和客户端共同完成,不会阻塞其他命令的执行
执行指令有异常依旧会执行下部分执行
(MQ,kafka,RabbitMQ)
pub,sub (Redis Stream 为第二代) 了解
就是主从复制master以写为主,Slave以读为主
当master数据发生变换的时候,自动将新的数据异步同步到其他slave数据库
配从库不配主库
三变网络相互ping 通且注意防火墙配置
三大命令
主从复制
replicaof 主库ip 主库端口
配从不配主
改换门庭
自立为王
开启daemonize yes (后台运行)
注释掉bind 172.0.0.1 (绑定ip)
protected-mode no (保护模式)
port 6379 (端口地址)
dir /myredis (指定工作目录)
pid 文件的名字,pidfile (进程id,使用默认)
log文件名字 logefile (日志名字)
requirepass (设置密码)
dbfilename (rdb文件名字)
aof (设置aof)
replicaof 主机ip 主机的redis的端口 (从机里改变端口port,replicaof配置主机ip)
masterauth "111111"(从机里配置 访问主机的redis密码 ,必须)
启动
先启动主,再启动从
(注意事项,先ping看通不通)
查看防火墙状态:
systemctl status firewalld
关闭防火墙:
systemctl stop firewalld.service
(防火墙状态down掉)
(重启一定一定要shutdown掉redris)
master主 (可读可写)
slave 从 (只能读)
查看身份:info replication
主机master如果shutdown掉 从机不动,数据可以正常使用
从机如果shutdown掉,重启依旧能跟上
临时改变从属
从机中: slaveof 192.168.XX 6379 (临时改变从属,但需要配置masterauth密码一致)
(重启后就会失效)
从机1下面还有从机2 (但是从机1依旧不能有set操作)
使用slaveof 该变从属
slaveof no one
slave启动成功连接到master 后发送一个sync命令
slave首次连接master,一次完成同步,slave自身数据会被master数据覆盖
缺点:
复制延时,信号衰减
每次都需要人工
主从监控 :监控主从redfis库运行是否正常
消息通知:哨兵可以将故障转移的结果发送给客户端
故障转移:如果master异常,则会进行主从切换,将其中一个slave作为新master
配置中心:客户端通过连接哨兵来获得当前redis服务的节点地址
步骤:
cp sentinel.conf /myredis
bind
daemonize
protected-mode
port
logfile
pidfile
dir
sentinel monitor (主机名字 ip 端口 票数) (设置要监控的master 服务器)
sentinel auth-pass (主机名字,密码) (master设置了密码,连接master服务器的密码)
sentinel down-after-milliseconds (主机名字,毫秒数)(指定多少毫秒后,
主机没有应答哨兵,此时哨兵主观认为主机下线)
其他配置:(使用默认)
sentinel parallel-synce (主机名字 数目)
(表示允许并行的slave数)
sentinel fallover-timeout (名字 毫秒数)
(故障转移的超时时间)
sentinel notification-script (名字 脚本)
(配置当某一事件发送时候所需要执行的脚本)
sentinel cllent-reconfig-script (名字 脚本)
(客户端重写配置主节点参数脚本)
bind 0.0.0.0
daemonize yes
protected-mode no
port 26381
logfile "/myredis/sentine126381.log"
pidfile /var/run/redis-sentinel26381.pid
dir /myredis
sentinel monitor mymaster 192.168.1.4 6379 2 (所有哨兵都是监视同一个主机)
sentinel auth-pass mymaster 111111
主机配置(redis.conf)
masterauth 111 (应为主机可能会挂,需要做好变为从机的准备)
所有哨兵都是监视同一个主机
(启动了主从后,启动哨兵)
redis-sentinel /sentinel.conf
或者
redis-server /sentinel.conf --sentinel
查看进程中是否哨兵启动
ps -ef|grep redis
如果出现问题可以从 .log日志查看或者sentinel.conf排除问题
主机dwon掉后(三台哨兵投票选举新的主机)(如果主机再次连回来则会变成从机)
主观下线:单个哨兵主观判断主机下线(30s未响应)
客观下线:哨兵投票判断主机是否下线了
选出兵王:Raft算法选出领导哨兵
指定新主机:领导哨兵根据复制量(数据量)、偏移量的最大节点指定某个从机为新的主机
群臣俯首旧主拜服:其他从机成为新主机的从机,如果旧主机重连也会变成从机
哨兵最好为奇数
哨兵集群+主从复制 并不能保证数据零丢失
介绍
redis集群是一个提供在多个redis节点间共享数据的程序集
redis集群可以支持多个master,每个master又可以挂载多个slave,
Cluster自带Sentine的故障转移机制,内置了高可用的支持,无需再去使用哨兵功能
槽位
通过hash_slot算法得出数据写入对应槽位的集群master
集群最大槽数16384
分片
槽位中分片,每个master主机
优势:方便扩容和缩容
槽位映射:
哈希取余分区:不利于扩容和减容
一致性哈希算法:容易照成数据数据倾斜
哈希槽分区
为什么集群最大槽数是16384个
如果槽位为65536,发送心跳信息的消息达8k,发送的心跳包过于庞大
redis的集群主节点数量基本不可能超过1000个
槽位越小,节点少的情况下,压缩比率高,容易传输
集群的搭建
bind 0.0.0.0
daemonize yes
protected-mode no
port 6381
logfile "/myredis/cluster/cluster6381.log"
pidfile /myredis/cluster6381.pid
dir /myredis/cluster
dbfilename dump6381.rdb
appendonly yes
appendfilename "appendonly6381.aof"
requirepass 111111
masterauth 111111
cluster-enabled yes
cluster-config-file nodes-6381.conf
cluster-node-timeout 5000
其他linux机器也是这样
redis ./redisCluster6381.conf
查看是否启动
ps -ef|grep redis
redis-cli -a 111111 --cluster create --cluster-replicas 1 192.168.1.4:6381 192.168.1.4:6382 192.168.1.6:6383 ip:端口
把所有集群redis构建主从 (yes)
集群构建完成/cluster会产生nodes-xxx文件
redis-cli -a 111111 -p 6731
...
连接后查看节点关系
cluster nodes
连接后查看自身状态
info replication
cluster info
因为槽位的限制主机不能随心所欲的写入数据,
所以在连接时候进行路由连接(加上 -c)
redis-cli -a 111111 -p 6381 -c
(主机set添加数据可以跳转路由,keys *依旧是本机数据)
(从机get获得数据可以跳转路由,keys *依旧是本机数据)
主机set或get不再当前插槽范围的元素会进行跳转到其他主机
从机set或get不再当前插槽范围的元素也会进行跳转到其他主机
集群全部可以看成是一个大的单机redis
当前主机down了,它对应的从机会上位
如果旧主机重连,那么它会变成从机
主从切换
从机执行cluster failover (切换成主机)
新建服务器文件conf +启动
启动后是独立的master
加入集群
需要领路人
redis-cli -a 111111 --cluster add-node ip:端口 领路人ip:领路人端口 (加入master)
分配槽号
查看槽位(主机ip端口随意)
redis-cli -a 111111 --cluster check 192.168.1.4:6381
重新分配((进入操作可以随意主机),id选择时候给新加入的接收,求16384平均)
redis-cli -a 111111 --cluster reshard 192.168.1.4:6381
4096(16384求平均)
需要分配槽位的新主机id
all 一步
添加从机
redis-cli -a 密码 --cluster add-node ip:从机端口 ip:主机端口 --cluster-slave-master-id 主机节点id
查看状态(进入操作可以随意主机)
redis-cli -a 111111 --cluster check 192.168.1.7:6388
先下线从机
redis-cli -a 密码 --cluster del-node ip:从机端口 从机id
清空主机槽位(进入操作可以随意主机)
redis-cli -a 111111 --cluster reshard 192.168.1.4:6381
4096
哪个id来接收
需要清空槽位的主机id 一步
done 二步
删除变成从机的旧主机
redis-cli -a 密码 --cluster del-node ip:从机端口 从机id
不再一个槽位的命令无法使用mset或mget等多键操作命令
需要分组进行存放
mset k1{z} v1 k2{z} v2 k3{z} v3 (z代表组,可以任意,这组数据都会存入同一槽位)
mget k1{z} k2{z} k3{z}
集群不保证数据一致性100%ok,一定会有数据丢失情况
jedis-lettuce-RedisTemplate