Redis集群方案及实战(六)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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再次进行封装
相关实践学习
基于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
相关文章
|
2月前
|
canal 缓存 NoSQL
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
根据对一致性的要求程度,提出多种解决方案:同步删除、同步删除+可靠消息、延时双删、异步监听+可靠消息、多重保障方案
Redis缓存与数据库如何保证一致性?同步删除+延时双删+异步监听+多重保障方案
|
3月前
|
监控 NoSQL Redis
看完这篇就能弄懂Redis的集群的原理了
看完这篇就能弄懂Redis的集群的原理了
112 0
|
14天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:优化百万数据查询的实战经验
【10月更文挑战第13天】 在处理大规模数据集时,传统的关系型数据库如MySQL可能会遇到性能瓶颈。为了提升数据处理的效率,我们可以结合使用MySQL和Redis,利用两者的优势来优化数据查询。本文将分享一次实战经验,探讨如何通过MySQL与Redis的协同工作来优化百万级数据统计。
39 5
|
20天前
|
缓存 NoSQL Java
Spring Boot与Redis:整合与实战
【10月更文挑战第15天】本文介绍了如何在Spring Boot项目中整合Redis,通过一个电商商品推荐系统的案例,详细展示了从添加依赖、配置连接信息到创建配置类的具体步骤。实战部分演示了如何利用Redis缓存提高系统响应速度,减少数据库访问压力,从而提升用户体验。
52 2
|
1月前
|
存储 NoSQL 大数据
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
大数据-51 Redis 高可用方案CAP-AP 主从复制 一主一从 全量和增量同步 哨兵模式 docker-compose测试
31 3
|
2月前
|
缓存 NoSQL 应用服务中间件
Redis实战篇
Redis实战篇
|
3月前
|
NoSQL 安全 Java
Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
这篇文章深入探讨了Redis中的String数据类型,包括键操作的命令、String类型的命令使用,以及String在Redis中的内部数据结构实现。
Redis6入门到实战------ 三、常用五大数据类型(字符串 String)
|
3月前
|
NoSQL 关系型数据库 Redis
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
这篇文章深入探讨了Redis事务的概念、命令使用、错误处理机制以及乐观锁和悲观锁的应用,并通过WATCH/UNWATCH命令展示了事务中的锁机制。
Redis6入门到实战------ 九、10. Redis_事务_锁机制_秒杀
|
1月前
|
存储 NoSQL Java
Spring Boot项目中使用Redis实现接口幂等性的方案
通过上述方法,可以有效地在Spring Boot项目中利用Redis实现接口幂等性,既保证了接口操作的安全性,又提高了系统的可靠性。
34 0
|
3月前
|
运维 监控 NoSQL
【Redis】哨兵(Sentinel)原理与实战全解~炒鸡简单啊
Redis 的哨兵模式(Sentinel)是一种用于实现高可用性的机制。它通过监控主节点和从节点,并在主节点故障时自动进行切换,确保集群持续提供服务。哨兵模式包括主节点、从节点和哨兵实例,具备监控、通知、自动故障转移等功能,能显著提高系统的稳定性和可靠性。本文详细介绍了哨兵模式的组成、功能、工作机制以及其优势和局限性,并提供了单实例的安装和配置步骤,包括系统优化、安装、配置、启停管理和性能监控等。此外,还介绍了如何配置主从复制和哨兵,确保在故障时能够自动切换并恢复服务。