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