Redis集群方案及实战(六)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: Redis集群方案及实战
  • 第七步:在RedisCluster文件下执行命令构建集群
docker-compose up -d

  • 第八步:测试
# 进入7901容器
docker exec -it redis-7901 bash
# 连接7901节点
redis-cli -c -p 7901 -a 123456
# 查看集群信息
cluster info
# 查看当前Redis节点
info replication
# 查看当前节点槽位
cluster nodes
  • 注意:要保证节点STATUS都是"Up XX seconds"才算成功

六.Java操作RedisCluster

1.概述

  • Redis目前Java中最火热的三个客户端都是可以操作RedisCluster:Jedis、Redisson、Lettuce
  • SpringBoot高版本中将spring-boot-starter-data-redis默认客户端从Jedis替换到了Lettuce,所以如果我们想要使用JedisCluster,那么需要移除Lettuce依赖,并引入Jedis依赖
  • 本文以SpringBoot中的JedisCluster集成进入RedisTemplate为例,演示Java当中如何使用JedisCluster操作RedisCluster
  • RedisTemplate: Spring对Redis操作的一层封装,高版本中底层是通过Lettuce实现的
  • 核心配置对象:SpringBoot项目会自动读取配置并为我们创建,所以我们只需要使用即可
  • JedisPoolConfig:用于配置连接池,包括最大连接数、最大空闲连接数、连接超时时间等等。连接池的作用是避免频繁创建和关闭连接,提高连接复用率和性能
  • RedisClusterConfiguration:用于配置Redis Cluster各个节点的信息,包括节点的IP地址和端口号
  • JedisConnectionFactory:连接工厂,它继承自RedisConnectionFactory,可以通过传入JedisPoolConfig和RedisClusterConfiguration来创建连接
  • RedisTemplate:它是一个泛型类,可以指定键和值的类型。通过JedisConnectionFactory创建出RedisTemplate Bean后,就可以通过它来进行各种Redis操作,如get、set、incr、zadd等等
  • 默认情况下,RedisTemplate使用的是JdkSerializationRedisSerializer进行序列化,这种序列化方式不易读取并且会出现乱码。为了解决这个问题,可以使用其他序列化方式,如Jackson和Fastjson

2.实战

  • 第一步:创建一个Maven工程

  • 第二步:导入依赖
        <!--SpringBoot父依赖-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.2</version>
    </parent>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <!--排除默认的lettuce-core客户端依赖-->
            <exclusions>
                <exclusion>
                    <groupId>io.lettuce</groupId>
                    <artifactId>lettuce-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!--引入Jedis客户端依赖-->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>3.6.1</version>
        </dependency>
        <!--jackson依赖-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.7.1</version>
        </dependency>
        <!--SpringBoot测试-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
  • 第三步:创建配置文件
server:
  port: 8080
spring:
  redis:
    timeout: 5000 # 超时时间
    database: 0 # 默认连接那个库
    cluster: # 集群节点Ip+Port,多个以逗号隔开
      nodes:
        - 127.0.0.1:6379
        - 127.0.0.1:6380
        - 127.0.0.1:6381
        - 127.0.0.1:6382
        - 127.0.0.1:6383
        - 127.0.0.1:6384
      max-redirects: 3 # 重定向最大次数
    jedis:
      pool: # jedis连接池配置
        max-active: 8 # 连接池中最大的活跃连接数,即同时能从连接池中获取的最大连接数
        max-wait: -1 # 当连接池中没有可用连接时,调用者最大阻塞等待时间(单位为毫秒),超过这个时间后将抛出异常,-1为无限等待
        max-idle: 8 # 连接池中最大的空闲连接数,即连接池中最多能保持多少个空闲连接,超过这个数目的空闲连接将被释放
        min-idle: 0 # 接池中最小的空闲连接数,即连接池中保持的最少的空闲连接数,如果空闲连接数小于这个数目且总连接数小于 max-active,连接池就会创建新的连接
    password: 123456 # 配置连接密码

  • 第四步:自定义创建RedisTemplate实例化对象
package cn.neuronet.config;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachingConfigurerSupport;
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 RedisConfiguration extends CachingConfigurerSupport {
        @Autowired
        private RedisConnectionFactory factory;
        @Bean
        public RedisTemplate<String, Object> redisTemplate() {
            // 1.创建一个key是String,value是Object类型的RedisTemplate,使用时类型必须对应
            RedisTemplate<String, Object> template = new RedisTemplate<>();
            // 2.JedisConnectionFactory会使用RedisClusterConfiguration和JedisPoolConfig对象来创建JedisCluster连接池
            template.setConnectionFactory(factory);
            // 3.创建一个Jackson2JsonRedisSerializer对象,指定需要序列化和反序列化的对象类型为Object类型,替换默认的jdkSerializeable序列化
            Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
            // 4.创建ObjectMapper对象,用于设置访问属性和默认类型
            ObjectMapper om = new ObjectMapper();
            // 5.设置所有访问属性可见,同时将对象的类型信息一起序列化到JSON串中
            om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
            om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
            // 6.将ObjectMapper对象设置到Jackson2JsonRedisSerializer中
            jackson2JsonRedisSerializer.setObjectMapper(om);
            // 7.用于序列化Redis中的String类型的数据。它是RedisTemplate的默认key序列化器,将Rediskey从String类型序列化为字节数组,以便于存储到Redis中
            StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
            // 8.String数据类型的Key采用String的序列化方式
            template.setKeySerializer(stringRedisSerializer);
            // 9.Hash数据类型的key也采用String的序列化方式
            template.setHashKeySerializer(stringRedisSerializer);
            // 10.String数据类型的value序列化方式采用jackson
            template.setValueSerializer(jackson2JsonRedisSerializer);
            // 11.Hash数据类型的value序列化方式采用jackson
            template.setHashValueSerializer(jackson2JsonRedisSerializer);
            template.afterPropertiesSet();
            return template;
        }
    }
  • 第五步:测试
package cn.neuronet;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.junit4.SpringRunner;
/**
* @Author: Neuronet
* @Date: 2023-04-23
* @Description: RedisCluster集群测试
* @Version:1.0
*/
@SpringBootTest
    public class RedisClusterTest {
        @Autowired
        private RedisTemplate<String, Object> redisTemplate;
        @Test
        public void test() throws Exception{
            redisTemplate.opsForValue().set("neuronet", "稀土掘金");
            Object neuronetStr = redisTemplate.opsForValue().get("neuronet");
            System.out.println(neuronetStr);
        }
    }

  • 第七步:由于原生RedisTemplate方法在开发时会感觉到使用不便,所以通常来说项目中都会对RedisTemplate再次进行封装
相关文章
|
3月前
|
存储 负载均衡 NoSQL
【赵渝强老师】Redis Cluster分布式集群
Redis Cluster是Redis的分布式存储解决方案,通过哈希槽(slot)实现数据分片,支持水平扩展,具备高可用性和负载均衡能力,适用于大规模数据场景。
286 2
|
1月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
282 5
|
2月前
|
存储 NoSQL 前端开发
Redis专题-实战篇一-基于Session和Redis实现登录业务
本项目基于SpringBoot实现黑马点评系统,涵盖Session与Redis两种登录方案。通过验证码登录、用户信息存储、拦截器校验等流程,解决集群环境下Session不共享问题,采用Redis替代Session实现数据共享与自动续期,提升系统可扩展性与安全性。
213 3
Redis专题-实战篇一-基于Session和Redis实现登录业务
|
2月前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
165 1
Redis专题-实战篇二-商户查询缓存
|
2月前
|
存储 监控 NoSQL
Redis高可用架构全解析:从主从复制到集群方案
Redis高可用确保服务持续稳定,避免单点故障导致数据丢失或业务中断。通过主从复制实现数据冗余,哨兵模式支持自动故障转移,Cluster集群则提供分布式数据分片与水平扩展,三者层层递进,保障读写分离、容灾切换与大规模数据存储,构建高性能、高可靠的Redis架构体系。
|
5月前
|
缓存 监控 NoSQL
Redis 实操要点:Java 最新技术栈的实战解析
本文介绍了基于Spring Boot 3、Redis 7和Lettuce客户端的Redis高级应用实践。内容包括:1)现代Java项目集成Redis的配置方法;2)使用Redisson实现分布式可重入锁与公平锁;3)缓存模式解决方案,包括布隆过滤器防穿透和随机过期时间防雪崩;4)Redis数据结构的高级应用,如HyperLogLog统计UV和GeoHash处理地理位置。文章提供了详细的代码示例,涵盖Redis在分布式系统中的核心应用场景,特别适合需要处理高并发、分布式锁等问题的开发场景。
373 41
|
3月前
|
存储 NoSQL 算法
Redis的集群架构与使用经验
本文介绍了Redis的集群架构与使用经验,包括主从复制、哨兵集群及Cluster分片集群的应用场景与实现原理。内容涵盖Redis主从同步机制、数据分片存储方式、事务支持及与Memcached的区别,并讨论了Redis内存用尽时的处理策略。适用于了解Redis高可用与性能优化方案。
|
4月前
|
负载均衡 NoSQL Redis
【赵渝强老师】Redis的主从复制集群
Redis主从复制是指将一台Redis服务器的数据复制到其他Redis服务器,实现数据热备份、故障恢复、负载均衡及高可用架构的基础。主节点负责写操作,从节点同步数据并可提供读服务,提升并发处理能力。
133 5
|
3月前
|
监控 NoSQL 关系型数据库
保障Redis与MySQL数据一致性的强化方案
在设计时,需要充分考虑到业务场景和系统复杂度,避免为了追求一致性而过度牺牲系统性能。保持简洁但有效的策略往往比采取过于复杂的方案更加实际。同时,各种方案都需要在实际业务场景中经过慎重评估和充分测试才可以投入生产环境。
204 0
|
5月前
|
机器学习/深度学习 存储 NoSQL
基于 Flink + Redis 的实时特征工程实战:电商场景动态分桶计数实现
本文介绍了基于 Flink 与 Redis 构建的电商场景下实时特征工程解决方案,重点实现动态分桶计数等复杂特征计算。通过流处理引擎 Flink 实时加工用户行为数据,结合 Redis 高性能存储,满足推荐系统毫秒级特征更新需求。技术架构涵盖状态管理、窗口计算、Redis 数据模型设计及特征服务集成,有效提升模型预测效果与系统吞吐能力。
518 2