《解锁Redis系列8》SpringBoot2.X操作Redis5.X集群

觉得不错,点个赞吧!你的支持就是我的动力!微信搜索公众号【达摩克利斯之笔】获取更多资源,文末有二维码!

一、smart客户端

1.1、介绍

上片文章我们说到Redis集群的伸缩,提到有一个问题就是如果去操作Redis集群,这个key不在该节点上那么会发生moved重定向,去其他节点上操作,如果集群正在伸缩在做槽的迁移那么会发生ask重定向,会大大影响我们对Redis集群操作的性能,我们可以使用smart客户端完成高性能的操作Redis Cluster。我们通过JedisCluster对象操作Redis集群。

1.2、原理

  1. 从集群中选择一个可以运行的节点,使用Cluster slots初始化槽和节点映射
  2. 将这种映射关系存储到本地,为每一个节点创建一个Jedis Pool
  3. 之后直接连接到Redis节点上去执行命令
  4. smart客户端将key发送到指定的节点上,如果成功就会得到响应
  5. 如果出现连接出错,随机找个活跃节点,向其发送命令,大概率会得到 moved 异常,然后重新初始化 slot 和 node 的映射关系,再向目标节点发送命令
  6. 如果这样的情况连续出现 5 次,报错:Too many cluster redirection!

二、JedisCluster使用

我们这里使用SpringBoot2.1.12去操作Redis5.0.5  Cluster

  1. 配置pom文件
  2. 配置application.yml文件,这里我只做最简单的配置
  3. 配置RedisConfig类,自定义RedisTemplate
  4. 测试

2.1、pom文件

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.2、application.yml文件

spring:
  redis:
    cluster:
      nodes: 192.168.11.101:8000,192.168.11.101:8001,192.168.11.101:8002,192.168.11.101:8003,192.168.11.101:8004,192.168.11.101:8005
    timeout: 5000ms

2.3、RedisConfig类

这个类在我的《解锁Redis系列3》中写过,以及Redis的工具类都在里边,大家可以去看看

package com.stt.rediscluster.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

@Configuration
public class RedisConfig {
    @Bean
    @SuppressWarnings("all")
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(factory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

2.4、测试

这里的测试就是做了个简单的数据添加和查询

package com.stt.rediscluster.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class RedisController {

    @Autowired
    private RedisTemplate<String,Object> redisTemplate;

    @GetMapping(value = "add")
    public Object add(){
        redisTemplate.opsForValue().set("stt","石添添");
        Object stt = redisTemplate.opsForValue().get("stt");
        return stt;
    }

    @GetMapping(value = "get")
    public Object get(){
        return redisTemplate.opsForValue().get("stt");
    }
}

到这我们就完成对Redis的基本操作,如果你用的不是SpringBoot而是传统的springMVC框架那么这里会复杂点

未完待续... ...

写在最后:

各位的支持和认可(点赞)是我最大的动力,请不要轻轻的来,用力留下你的足迹!

本篇文章有任何错误希望不吝指出,不胜感激!我们下篇再见!

求知并无捷径,如果有,那就是放弃这个幼稚的想法,静下心来多读书、总结


发布了24 篇原创文章 · 获赞 49 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_36386908/article/details/104425512