Redis补充学习与主从复制和集群配置以及哨兵模式入门学习

news/2025/5/31 23:49:23

Redis补充学习与主从复制和集群配置以及哨兵模式入门学习

  • 一、redis那些数据结构
    • 1、SortedSet数据类型
    • 2、存储SortedSet常用命令
    • 3、HyperLogLog学习
  • 二、Redis学习Pub/Sub
  • 三、redisTemplate、jedis、lettuce、redission的对比
  • 四、Redis哨兵模式
    • 1、介绍
    • 2、Redis配置哨兵模式
    • 3、Redis配置
    • 4、哨兵配置
    • 5、测试
    • 六、遇到的坑
  • 五、总结


一、redis那些数据结构

字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。五种基本数据类型

1、SortedSet数据类型

它里面的元素是唯一的
Sorted Set里面的元素都带有一个浮点值,叫做分数(score),每个元素都映射到了一个分数。
Sorted Set是有序的,规则如下:
如果A.score > B.score,那么A > B。
如果A.score == B.score,那么A和B的大小就通过比较字符串来决定了,而A和B的字符串是不会相等的,因为Sorted Set里面的值都是唯一的。

2、存储SortedSet常用命令

zadd 添加元素 里面包括分数和值
127.0.0.1:6379> zadd sort1 5 a 4 b 6 c
(integer) 3
我们添加集合sort1 元素是a,b,c 评分分别是5,4,6
集合里的排序是根据评分从小到大排序的;

zrange是查找元素 -1代表是最后一个
127.0.0.1:6379> zrange sort1 0 -1

  1. “b”
  2. “a”
  3. “c”

假如我们继续添加元素
这里分两种情况
假如次元素集合里面已经有了,则覆盖
我们继续添加b 此时评分改成7
127.0.0.1:6379> zadd sort1 7 b
(integer) 0
通过zscore 获取b的评分
127.0.0.1:6379> zscore sort1 b
“7”
发现已经修改了;
127.0.0.1:6379> zrange sort1 0 -1

  1. “a”
  2. “c”
  3. “b”

假如添加的元素不在集合里,则添加进去
127.0.0.1:6379> zadd sort1 9 d
(integer) 1
127.0.0.1:6379> zrange sort1 0 -1

  1. “a”
  2. “c”
  3. “b”
  4. “d”

删除元素zrem
127.0.0.1:6379> zrem sort1 b
(integer) 1
127.0.0.1:6379> zrange sort1 0 -1

  1. “a”
  2. “c”
  3. “d”

zcard 查看集合里的元素个数
127.0.0.1:6379> zcard sort1
(integer) 3

withscores 把评分也显示出来
127.0.0.1:6379> zrange sort1 0 -1 withscores

  1. “a”
  2. “5”
  3. “c”
  4. “6”
  5. “d”
  6. “9”

zrevrange 降序排列
127.0.0.1:6379> zrevrange sort1 0 -1 withscores

  1. “d”
  2. “9”
  3. “c”
  4. “6”
  5. “a”
  6. “5”

我们再加两个元素
127.0.0.1:6379> zadd sort1 10 e 5 f
(integer) 2
zremrangebyrank 根据排名来删除元素 删除3个
127.0.0.1:6379> zremrangebyrank sort1 0 2
(integer) 3
127.0.0.1:6379> zrange sort1 0 -1 withscores

  1. “d”
  2. “9”
  3. “e”
  4. “10”

再添加元素
127.0.0.1:6379> zadd sort1 11 f 16 g 18 h
(integer) 3
127.0.0.1:6379> zrange sort1 0 -1 withscores

  1. “d”
  2. “9”
  3. “e”
  4. “10”
  5. “f”
  6. “11”
  7. “g”
  8. “16”
  9. “h”
  10. “18”

zremrangebyscore 根据具体评分范围来删除元素
127.0.0.1:6379> zremrangebyscore sort1 10 16
(integer) 3
127.0.0.1:6379> zrange sort1 0 -1 withscores

  1. “d”
  2. “9”
  3. “h”
  4. “18”

再添加元素
127.0.0.1:6379> zadd sort1 20 i 23 j 30 k
(integer) 3
127.0.0.1:6379> zrange sort1 0 -1 withscores

  1. “d”
  2. “9”
  3. “h”
  4. “18”
  5. “i”
  6. “20”
  7. “j”
  8. “23”
  9. “k”
  10. “30”

zrangebyscore 根据评分范围来查找元素
127.0.0.1:6379> zrangebyscore sort1 18 23 withscores

  1. “h”
  2. “18”
  3. “i”
  4. “20”
  5. “j”
  6. “23”

limit 限定查找起始 类似分页
127.0.0.1:6379> zrangebyscore sort1 18 23 withscores limit 0 2

  1. “h”
  2. “18”
  3. “i”
  4. “20”

zincrby 给指定元素加分
127.0.0.1:6379> zincrby sort1 5 h
“23”
127.0.0.1:6379> zrange sort1 0 -1 withscores

  1. “d”
  2. “9”
  3. “i”
  4. “20”
  5. “h”
  6. “23”
  7. “j”
  8. “23”
  9. “k”
  10. “30”

zcount 查找指定评分范围的元素个数
127.0.0.1:6379> zcount sort1 20 23
(integer) 3

Sorted-Set使用场景
大型在线游戏积分排行榜
构建索引数据

3、HyperLogLog学习

HyperLogLog是Redis的高级数据结构,是统计基数的利器。前文我们已经介绍过HyperLogLog的基本用法,如果只求会用,只需要掌握HyperLogLog的三个命令即可。


二、Redis学习Pub/Sub

在我们实例中我们创建了订阅频道名为 demo1

redis 127.0.0.1:6379> SUBSCRIBE demo1

则会显示
在这里插入图片描述
打开第二个客户端订阅并发布消息

redis 127.0.0.1:6379> PUBLISH runoobChat "sb"

在这里插入图片描述
而被订阅的则会显示
在这里插入图片描述

三、redisTemplate、jedis、lettuce、redission的对比

  1. redisTemplate是基于某个具体实现的再封装,比如说springBoot1.x时,具体实现是jedis;而到了springBoot2.x时,具体实现变成了lettuce。封装的好处就是隐藏了具体的实现,使调用更简单,但是有人测试过jedis效率要10-30倍的高于redisTemplate的执行效率,所以单从执行效率上来讲,jedis完爆redisTemplate。redisTemplate的好处就是基于springBoot自动装配的原理,使得整合redis时比较简单。

  2. jedis作为老牌的redis客户端,采用同步阻塞式IO,采用线程池时是线程安全的。优点是简单、灵活、api全面,缺点是某些redis高级功能需要自己封装。

  3. lettuce作为新式的redis客户端,基于netty采用异步非阻塞式IO,是线程安全的,优点是提供了很多redis高级功能,例如集群、哨兵、管道等,缺点是api抽象,学习成本高。lettuce好是好,但是jedis比他生得早。

  4. redission作为redis的分布式客户端,同样基于netty采用异步非阻塞式IO,是线程安全的,优点是提供了很多redis的分布式操作和高级功能,缺点是api抽象,学习成本高。

综上所述:单机并发量低时优先选择jedis,分布式高并发时优先选择redission。

四、Redis哨兵模式

1、介绍

主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。

然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。

故障切换(failover)的过程。假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。

2、Redis配置哨兵模式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、Redis配置

用于测试

服务类型是否是主服务器IP地址端口
Redis192.168.2.1336379
Redis192.168.2.1336380
Redis192.168.2.1336381
Sentinel-192.168.2.13326379
Sentinel-192.168.2.13326380
Sentinel-192.168.2.13326381

下述内容主要是配置Redis服务器,从服务器比主服务器多一个slaveof的配置和密码。

# 使得Redis服务器可以跨网络访问
bind 0.0.0.0
# 设置密码
requirepass "123456"
# 指定主服务器,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
slaveof 192.168.2.133 6379
# 主服务器密码,注意:有关slaveof的配置只是配置从服务器,主服务器不需要配置
masterauth 123456#启动端口
port:6379
# 其他、指定端口运行(程序在src目录下)
./redis-cli -p 6380
./redis-cli -p 6381

4、哨兵配置

配置3个哨兵,每个哨兵的配置都是一样的。在Redis安装目录下有一个sentinel.conf文件,copy一份进行修改,另外两个端口不同而已

# 启动端口
port 26379# 禁止保护模式
protected-mode no# 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,192.168.2.133代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
sentinel monitor mymaster 192.168.2.133 6379 2# sentinel author-pass定义服务的密码,mymaster是服务名称,123456是Redis服务器密码
# sentinel auth-pass <master-name> <password>
sentinel auth-pass mymaster 123456#设置后台启动
daemonize yes#每个Sentinel节点都要定期PING命令来判断Redis数据节点和其余Sentinel节点是否可达,如果超过30000毫秒30s且没有回复,则判定不可达 
sentinel down-after-milliseconds mymaster 30000#当Sentinel节点集合对主节点故障判定达成一致时,Sentinel领导者节点会做故障转移操作,选出新的主节点, 
#原来的从节点会向新的主节点发起复制操作,限制每次向新的主节点发起复制操作的从节点个数为1
sentinel parallel-syncs mymaster 1#故障转移超时时间为180000毫秒 
sentinel failover-timeout mymaster 180000

上述关闭了保护模式,便于测试。

有了上述的修改,我们可以进入Redis的安装目录的src目录,通过下面的命令启动服务器和哨兵

# 启动Redis服务器进程
./redis-server ../redis.conf
# 启动哨兵进程
./redis-sentinel ../sentinel.conf

在这里插入图片描述
在这里插入图片描述

注意启动的顺序。首先是主机(192.168.2.133)的Redis服务进程,然后启动从机的服务进程,最后启动3个哨兵的服务进程。
在这里插入图片描述

在这里插入图片描述

5、测试

查看主从

info replication

主:
在这里插入图片描述

从:
在这里插入图片描述
查看哨兵是否成功通信 :

redis-cli -p 26379  info sentinel

在这里插入图片描述
测试当主宕机之后,哨兵进行三十秒测试后无果选举

#关闭命令
shutdown

在这里插入图片描述
在这里插入图片描述

当从机尝试修改信息时,会告知没权限:
在这里插入图片描述

六、遇到的坑

当我们学习是在同机测试时查看sentinel myid是否一样,如有一样则哨兵之间会冲突不能相互通信
查看下各个哨兵的配置文件中的sentinel myid xxxx是不是一样的,如果是一样的就把所有配置文件中这行删除,然后重启,会自动生成唯一的。

五、总结

  1. 问redis为什么快,一定是要有对比,比如和hbase比那就是纯内存操作,和memcached比就是单线程和多路复用,那你要讨论底层数据结构,那就是另外一个话题了,而且redis底层数据结构的设计更多侧重的不是快,而是节省内存,比如hash结构用字典肯定是最快的,但是为什么优先使用压缩列表,就是因为节省内存。
文章来源:https://blog.csdn.net/weixin_46146718/article/details/119149404
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:https://dhexx.cn/news/show-18389.html

相关文章

java 获取当前系统环境中的各种参数 System.getProperty()

java.version Java 运行时环境版本 java.vendor Java 运行时环境供应商 java.vendor.url Java 供应商的 URL java.vm.specification.version Java 虚拟机规范版本 java.vm.specification.vendor Java 虚拟机规范供应商 java.vm.…

jquery uploadify插件多文件上传

1、jquery uploadify 下载&#xff1a;http://www.uploadify.com/ 2、安装&#xff1a;解压后拷贝的工程目录下面&#xff0c;如&#xff1a;WebRoot/uploaddify 3、配置项说明&#xff1a; uploader&#xff1a; uploadify.swf 文件的相对路径&#xff0c;该swf文件是一个带有…

git上传时自动触发Jenkins项目构建实战

git上传时自动触发Jenkins项目构建实战一、安装Jenkins1、安装步骤2、启动jenkins报错3、卸载二、核心步骤1、全局工具配置2、插件配置快速仓库3、安装gitee和Maven Integration插件与全局凭证4、系统配置5、新增任务6、Gitee的webHooks配置7、配置maven命令8、编写shell命令三…

MVC后台实现关闭当前页面,跳转到父页面。

return Content("<script>parent.window.close();parent.location.href parent.location.href;</script>");转载于:https://www.cnblogs.com/jinaczg/p/3819693.html

SPARK-SQL 基础应用入门1-sparkSession,Dataset

先准备好测试数据和相关的pojo类Person.java pojo文件 public class Person implements Serializable {private String name;private long age; } person.json文件内容 {"name":"Michael", "age":29} {"name":"Andy", &q…

委托

一、什么是委托 委托是什么&#xff0c;从生活中以及它的字面意思上理解&#xff0c;委托就是找人办事。比如说当前你有一个快递到了&#xff0c;但是呢你人不在&#xff0c;这时怎么办&#xff1f;就可以找一个你的朋友去帮你签收这个快递&#xff0c;当然你要打电话或者发短信…

HDU1527威佐夫博弈

/*(威佐夫博弈)&#xff08;http://baike.baidu.com/view/1952620.htm&#xff09; 这不是我写的啊&#xff01;1、在一堆石子中取走任意多颗&#xff1b;2、在两堆石子中取走相同多的任意颗&#xff1b;约定取走最后一颗石子的人为赢家&#xff0c;求必胜策略。两堆石头地位是…

Docker 自定义镜像

之前博客写过在 Linux 上面部署前后端分离项目&#xff0c;服务器环境配置比较繁琐 使用 docker 构建镜像文件 来部署 springboot 项目&#xff0c;可以大大减少配置过程中的出错概率 基于基础镜像构建镜像文件 命令作用例子FROM指定基础镜像&#xff0c;基于基础base镜像构…

聚合工程服务创建以及调用

聚合工程服务创建以及调用一、Maven聚合工程创建以及准备工作1、pom依赖2、添加子项目以及依赖3、添加配置application.yml4、启动类5、Controller类二、服务调用1、RPC介绍2、使用springboot自带的方法restTemplate远程调用及结果一、Maven聚合工程创建以及准备工作 1、pom依…

SPARK-SQL 基础应用入门1-sparkSession,Dataset,DataFrame,select,groupBy等

相关的测试数据和pojo类&#xff0c;查看博文https://blog.csdn.net/qq_41712271/article/details/107812188 //导入相关的包 import static org.apache.spark.sql.functions.col;public static void main(String[] args) {//0: spark sql程序入口SparkSession spark Spark…