Redis专题(持续更新)

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
简介: 本文主要介绍了Redis高可用架构中的哨兵架构,包括哨兵的搭建步骤、元数据信息的维护和节点变动时的处理。同时,还详细介绍了Spring Boot中使用StringRedisTemplate和RedisTemplate对Redis进行操作的方法列表,以及Redis客户端命令对应的RedisTemplate中的方法列表。明天的文章将会讲述Redis高可用集群之水平扩展。

02-VIP-Redis持久化、主从与哨兵架构详解


文章目录


正文

Redis哨兵高可用架构

sentinel哨兵是特殊的redis服务,不提供读写服务,主要用来监控redis实例节点。

哨兵架构下client端第一次从哨兵找出redis的主节点,后续就直接访问redis的主节点,不会每次都通过

sentinel代理访问redis的主节点,当redis的主节点发生变化,哨兵会第一时间感知到,并且将新的redis

主节点通知给client端(这里面redis的client端一般都实现了订阅功能,订阅sentinel发布的节点变动消息)

redis哨兵架构搭建步骤:

1 1、复制一份sentinel.conf文件
2 cp sentinel.conf sentinel‐26379.conf
3
4 2、将相关配置修改为如下值:
5 port 26379
6 daemonize yes
7 pidfile "/var/run/redis‐sentinel‐26379.pid"
8 logfile "26379.log"
9 dir "/usr/local/redis‐5.0.3/data"
10 # sentinel monitor <master‐redis‐name> <master‐redis‐ip> <master‐redis‐port> <quorum>
11 # quorum是一个数字,指明当有多少个sentinel认为一个master失效时(值一般为:sentinel总数/2 +
1),master才算真正失效
12 sentinel monitor mymaster 192.168.0.60 6379 2 # mymaster这个名字随便取,客户端访问时会用
13
14 3、启动sentinel哨兵实例
15 src/redis‐sentinel sentinel‐26379.conf
16
17 4、查看sentinel的info信息
18 src/redis‐cli ‐p 26379
19 127.0.0.1:26379>info
20 可以看到Sentinel的info里已经识别出了redis的主从
21
22 5、可以自己再配置两个sentinel,端口26380和26381,注意上述配置文件里的对应数字都要修改
23

sentinel集群都启动完毕后,会将哨兵集群的元数据信息写入所有sentinel的配置文件里去(追加在文件的最下面),我们查看下如下配置文件sentinel-26379.conf,如下所示:

1 sentinel known‐replica mymaster 192.168.0.60 6380 #代表redis主节点的从节点信息
2 sentinel known‐replica mymaster 192.168.0.60 6381 #代表redis主节点的从节点信息
3 sentinel known‐sentinel mymaster 192.168.0.60 26380 52d0a5d70c1f90475b4fc03b6ce7c3c569
35760f #代表感知到的其它哨兵节点
4 sentinel known‐sentinel mymaster 192.168.0.60 26381 e9f530d3882f8043f76ebb8e1686438ba8
bd5ca6 #代表感知到的其它哨兵节点

当redis主节点如果挂了,哨兵集群会重新选举出新的redis主节点,同时会修改所有sentinel节点配置文件

的集群元数据信息,比如6379的redis如果挂了,假设选举出的新主节点是6380,则sentinel文件里的集

群元数据信息会变成如下所示:

1 sentinel known‐replica mymaster 192.168.0.60 6379 #代表主节点的从节点信息
2 sentinel known‐replica mymaster 192.168.0.60 6381 #代表主节点的从节点信息
3 sentinel known‐sentinel mymaster 192.168.0.60 26380 52d0a5d70c1f90475b4fc03b6ce7c3c569
35760f #代表感知到的其它哨兵节点
4 sentinel known‐sentinel mymaster 192.168.0.60 26381 e9f530d3882f8043f76ebb8e1686438ba8
bd5ca6 #代表感知到的其它哨兵节点

同时还会修改sentinel文件里之前配置的mymaster对应的6379端口,改为6380

1 sentinel monitor mymaster 192.168.0.60 6380 2

当6379的redis实例再次启动时,哨兵集群根据集群元数据信息就可以将6379端口的redis节点作为从节点加入集群

哨兵的Jedis连接代码:

1 public class JedisSentinelTest {
2 public static void main(String[] args) throws IOException {
3
4 JedisPoolConfig config = new JedisPoolConfig();
5 config.setMaxTotal(20);
6 config.setMaxIdle(10);
7 config.setMinIdle(5);
8
9 String masterName = "mymaster";
10 Set<String> sentinels = new HashSet<String>();
11 sentinels.add(new HostAndPort("192.168.0.60",26379).toString());
12 sentinels.add(new HostAndPort("192.168.0.60",26380).toString());
13 sentinels.add(new HostAndPort("192.168.0.60",26381).toString());
14 //JedisSentinelPool其实本质跟JedisPool类似,都是与redis主节点建立的连接池
15 //JedisSentinelPool并不是说与sentinel建立的连接池,而是通过sentinel发现redis主节点并与其
建立连接
16 JedisSentinelPool jedisSentinelPool = new JedisSentinelPool(masterName, sentinels, co
nfig, 3000, null);
17 Jedis jedis = null;
18 try {
19 jedis = jedisSentinelPool.getResource();
20 System.out.println(jedis.set("sentinel", "zhuge"));
21 System.out.println(jedis.get("sentinel"));
22 } catch (Exception e) {
23 e.printStackTrace();
24 } finally {
25 //注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。
26 if (jedis != null)
27 jedis.close();
28 }
29 }
30 }

哨兵的Spring Boot整合Redis连接代码见示例项目:redis-sentinel-cluster

1、引入相关依赖:

1 <dependency>
2 <groupId>org.springframework.boot</groupId>
3 <artifactId>spring‐boot‐starter‐data‐redis</artifactId>
4 </dependency>
5
6 <dependency>
7 <groupId>org.apache.commons</groupId>
8 <artifactId>commons‐pool2</artifactId>
9 </dependency>

springboot项目核心配置:

1 server:
2 port: 8080
3
4 spring:
5 redis:
6 database: 0
7 timeout: 3000
8 sentinel: #哨兵模式
9 master: mymaster #主服务器所在集群名称
10 nodes: 192.168.0.60:26379,192.168.0.60:26380,192.168.0.60:26381
11 lettuce:
12 pool:
13 max‐idle: 50
14 min‐idle: 10
15 max‐active: 100
16 max‐wait: 1000
17

访问代码:

1 @RestController
2 public class IndexController {
3
4 private static final Logger logger = LoggerFactory.getLogger(IndexController.class);
5
6 @Autowired
7 private StringRedisTemplate stringRedisTemplate;
8
9 /**
10 * 测试节点挂了哨兵重新选举新的master节点,客户端是否能动态感知到
11 * 新的master选举出来后,哨兵会把消息发布出去,客户端实际上是实现了一个消息监听机制,
12 * 当哨兵把新master的消息发布出去,客户端会立马感知到新master的信息,从而动态切换访问的maste
rip
13 *
14 * @throws InterruptedException
15 */
16 @RequestMapping("/test_sentinel")
17 public void testSentinel() throws InterruptedException {
18 int i = 1;
19 while (true){
20 try {
21 stringRedisTemplate.opsForValue().set("zhuge"+i, i+"");
22 System.out.println("设置key:"+ "zhuge" + i);
23 i++;
24 Thread.sleep(1000);
25 }catch (Exception e){
26 logger.error("错误:", e);
27 }
28 }
29 }
30 }

StringRedisTemplate与RedisTemplate详解

spring 封装了 RedisTemplate 对象来进行对redis的各种操作,它支持所有的 redis 原生的 api。在

RedisTemplate中提供了几个常用的接口方法的使用,分别是:

1 private ValueOperations<K, V> valueOps;
2 private HashOperations<K, V> hashOps;
3 private ListOperations<K, V> listOps;
4 private SetOperations<K, V> setOps;
5 private ZSetOperations<K, V> zSetOps;

RedisTemplate中定义了对5种数据结构操作

1 redisTemplate.opsForValue();//操作字符串
2 redisTemplate.opsForHash();//操作hash
3 redisTemplate.opsForList();//操作list
4 redisTemplate.opsForSet();//操作set
5 redisTemplate.opsForZSet();//操作有序set

StringRedisTemplate继承自RedisTemplate,也一样拥有上面这些操作。

StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存

的。

RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

Redis客户端命令对应的RedisTemplate中的方法列表:

明天我们说Redis高可用集群之水平扩展!

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
3月前
|
存储 缓存 NoSQL
Redis专题(持续更新) 04-VIP-Redis缓存设计与性能优化
对于恶意攻击,向服务器请求大量不存在的数据造成的缓存穿透,还可以用布隆过滤器先做一次过滤,对于不存在的数据布隆过滤器一般都能够过滤掉,不让请求再往后端发送。缓存穿透是指查询一个根本不存在的数据, 缓存层和存储层都不会命中, 通常出于容错的考虑, 如果从存储层查不到数据则不写入缓存层。向布隆过滤器询问 key 是否存在时,跟 add 一样,也会把 hash 的几个位置都算出来,看看位数组中这几个位。发过来,缓存层支撑不住,或者由于缓存设计不好,类似大量请求访问bigkey,导致缓存能支撑的并发急剧下。
161 3
|
3月前
|
缓存 NoSQL Java
Redis专题(持续更新)
文章主要介绍了Redis的主从架构,包括了搭建和配置从节点的步骤、主从复制的工作原理以及全量复制和部分复制的流程。同时还介绍了Jedis连接代码示例、Redis管道和调用Lua脚本的方法。文章详细描述了如何搭建Redis主从架构,以及主从复制的工作原理和流程,对于想要深入了解Redis主从相关知识的读者有很好的参考价值。
|
3月前
|
NoSQL Redis 索引
Redis专题(持续更新)
Redis是一个高性能的键值存储系统,其核心数据结构和高性能原理是其快速处理大量并发连接的关键。Redis是单线程的,这意味着网络IO和键值对的读写都由一个线程完成。Redis之所以能够如此快速,主要有以下原因:内存操作、单线程避免切换开销和IO多路复用。除此之外,Redis还提供了一些其他高级命令,如keys、scan和Info命令,这些命令可以帮助我们更好地管理和查询Redis的数据。通过合理地利用Redis的核心原理和高级命令,我们可以提升系统的性能和效率。
|
3月前
|
缓存 NoSQL 算法
Redis专题(持续更新) 04-VIP-Redis缓存设计与性能优化
maxIdle实际上才是业务需要的最大连接数,maxTotal是为了给出余量,所以maxIdle不要设置。些redis连接,执行简单命令,类似ping(),快速的将连接池里的空闲连接提升到minIdle的数。redis的多数据库较弱,使用数字进行区分,很多客户端支持较差,同时多业务用多数据库实际还。如果系统启动完马上就会有很多的请求过来,那么可以给redis连接池做预热,比如快速的创建一。数",在使用连接的过程中,如果连接数超过了minIdle,那么继续建立连接,如果超过了。
100 0
|
3月前
|
存储 缓存 运维
Redis专题(持续更新) 03-VIP-Redis高可用集群之水平扩展
本文介绍了如何通过水平扩展来提升Redis高可用集群的性能和可用性。文章首先展示了如何启动整个集群,并使用客户端连接至特定端口的Redis实例以及查看集群状态。接着详细介绍了增加Redis实例的步骤,包括配置新的主节点和从节点,并使用命令进行节点的添加和删除操作。其中还包括了重新分片操作以及将从节点指定给主节点的过程。最后,文章以删除主节点为结束,展示了如何将数据迁移至其他节点后进行节点的删除操作。整篇文章详细介绍了Redis高可用集群的水平扩展操作,对于需要扩展Redis集群的运维人员具有一定的指导意义。
125 0
|
3月前
|
缓存 NoSQL Java
Redis专题(持续更新) 03-VIP-Redis缓存高可用集群
这篇文章主要介绍了Redis缓存高可用集群的搭建和原理分析,包括Redis集群方案比较、高可用集群搭建步骤、Java操作Redis集群以及Redis集群的工作原理等内容。文章详细介绍了如何搭建Redis集群、Java操作Redis集群的代码示例以及Redis集群的选举原理、数据丢失问题以及对批量操作命令的支持等内容。此外,还介绍了哨兵leader选举流程。整体来说,本文对Redis缓存高可用集群的构建和使用进行了系统性的阐述,是一篇关于Redis集群实践经验的指南。
119 0
|
3月前
|
NoSQL 调度 Redis
Redis专题(持续更新)
本文详细介绍了Redis持久化机制,包括RDB快照和AOF持久化,以及它们各自的优缺点和配置方法。对比了save和bgsave两种生成RDB快照的方式,以及AOF重写的机制和配置。在介绍Redis 4.0的混合持久化时,提出了解决重启效率低的问题,并给出了相应的配置方法。最后,给出了Redis数据备份的具体策略,包括定时调度脚本、保留备份的时间和跨机器备份等内容。文章内容详实,适合对Redis持久化感兴趣的读者阅读。
|
消息中间件 NoSQL 关系型数据库
【Docker安装软件,一篇就够了】Docker安装,Docker安装Mysql8.0、Redis、RabbitMQ及常用命令(持续更新)
【Docker安装软件,一篇就够了】Docker安装,Docker安装Mysql8.0、Redis、RabbitMQ及常用命令(持续更新)
657 0
|
消息中间件 存储 缓存
redis面试题(持续更新)
redis面试题(持续更新)
154 0
redis面试题(持续更新)