SpringBoot整合Redis集群(Lettuce客户端)

小灰灰 2022-10-29 13:30 113阅读 0赞

在这里插入图片描述

文章目录

  • 一. 问题背景
  • 二. 搭建好Redis集群
  • 三. SpringBoot整合Redis集群
    • 3.1 引入依赖
    • 3.2 配置Redis集群信息
    • 3.3 自定义Redis相关的组件
    • 3.4 封装Redis操作的类
    • 3.5 封装Redis操作的实现类
    • 3.6 测试
      • 3.6.1 创建一个业务逻辑类
      • 3.6.2 创建一个controller
    • 3.7 测试

一. 问题背景

研究完基于Docker搭建Redis集群,开始用SpringBoot整合Redis集群,没有想象中的那么难,和SpringBoot整合Redis(Lettuce客户端)差不多

参考自:

  • Redis 架构演变与 Redis-cluster 群集读写方案

二. 搭建好Redis集群

我采用Redis-Cluster(最新版的Redis集群架构)去搭建集群,详情可参考基于Docker搭建Redis集群

三. SpringBoot整合Redis集群

3.1 引入依赖

SpringBoot2.x默认使用Lettuce客户端了,因此我们也直接使用默认的Lettuce客户端,肯定有它的优点:

  1. <!-- SpringBoot整合Redis的依赖 -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-redis</artifactId>
  5. </dependency>
  6. <!-- lettuce pool 缓存连接池-->
  7. <dependency>
  8. <groupId>org.apache.commons</groupId>
  9. <artifactId>commons-pool2</artifactId>
  10. <version>2.9.0</version>
  11. </dependency>

3.2 配置Redis集群信息

去yml配置Redis集群的相关信息,如下:

  1. spring:
  2. redis:
  3. cluster:
  4. timeout: 1000
  5. max-redirects: 3
  6. nodes: 192.168.199.130:6379,192.168.199.130:6380,192.168.199.130:6381,192.168.199.130:6382,192.168.199.130:6383,192.168.199.130:6384
  7. lettuce:
  8. pool:
  9. max-idle: 10 # 连接池中的最大空闲连接
  10. max-wait: 500 # 连接池最大阻塞等待时间(使用负值表示没有限制)
  11. max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
  12. min-idle: 0 # 连接池中的最小空闲连接

注意:spring.redis.cluster.nodes的值要修改成你自己的Redis节点所在的ip地址以及端口号

3.3 自定义Redis相关的组件

Redis默认存入的value是用jdk的序列化方式,这会导致中文乱码,我们自定义一个序列化器:

  1. @Configuration
  2. @Slf4j
  3. public class RedisConfig {
  4. @Bean
  5. public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
  6. log.info("RedisConnectionFactory class: {}", redisConnectionFactory.getClass());
  7. RedisSerializer<Object> serializer = redisSerializer();
  8. RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
  9. redisTemplate.setConnectionFactory(redisConnectionFactory);
  10. redisTemplate.setKeySerializer(new StringRedisSerializer());
  11. redisTemplate.setValueSerializer(serializer);
  12. redisTemplate.setHashKeySerializer(new StringRedisSerializer());
  13. redisTemplate.setHashValueSerializer(serializer);
  14. redisTemplate.afterPropertiesSet();
  15. return redisTemplate;
  16. }
  17. @Bean
  18. public RedisSerializer<Object> redisSerializer() {
  19. // 创建JSON序列化器
  20. Jackson2JsonRedisSerializer<Object> serializer =
  21. new Jackson2JsonRedisSerializer<>(Object.class);
  22. ObjectMapper objectMapper = new ObjectMapper();
  23. objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
  24. // 必须设置,否则无法将json转化为对象,会转化为Map类型
  25. objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance,
  26. ObjectMapper.DefaultTyping.NON_FINAL);
  27. serializer.setObjectMapper(objectMapper);
  28. return serializer;
  29. }
  30. }

3.4 封装Redis操作的类

  1. /** * redis操作Service, * 对象和数组都以json形式进行存储 */
  2. public interface RedisService {
  3. /** * 存储数据 * @param key * @param value */
  4. void set(String key, String value);
  5. /** * 获取数据 * @param key * @return */
  6. Object get(String key);
  7. /** * 设置超时时间 * @param key * @param expire * @return */
  8. boolean expire(String key, long time);
  9. /** * 删除数据 * @param key */
  10. void remove(String key);
  11. /** * 自增操作 * @param key * @param delta * @return */
  12. Long increment(String key, long delta);
  13. }

3.5 封装Redis操作的实现类

  1. /** * redis操作Service的实现类 */
  2. @Service
  3. public class RedisServiceImpl implements RedisService {
  4. @Autowired
  5. private RedisTemplate<String, Object> stringRedisTemplate;
  6. @Override
  7. public void set(String key, String value) {
  8. stringRedisTemplate.opsForValue().set(key, value);
  9. }
  10. @Override
  11. public Object get(String key) {
  12. return stringRedisTemplate.opsForValue().get(key);
  13. }
  14. @Override
  15. public boolean expire(String key, long time) {
  16. return stringRedisTemplate.expire(key, time, TimeUnit.SECONDS);
  17. }
  18. @Override
  19. public void remove(String key) {
  20. stringRedisTemplate.delete(key);
  21. }
  22. @Override
  23. public Long increment(String key, long delta) {
  24. return stringRedisTemplate.opsForValue().increment(key, delta);
  25. }
  26. }

3.6 测试

创建一些类用于测试效果

3.6.1 创建一个业务逻辑类

  1. /** * @Author Androidla * @Date 2021/2/14 13:30 * @Description **/
  2. @Service
  3. @Slf4j
  4. public class TestServiceImpl {
  5. @Autowired
  6. private RedisService redisService;
  7. @Value("${redis.key.authCode}")
  8. private String REDIS_KEY_AUTH_CODE;
  9. @Value("${redis.expire.authCode}")
  10. private Long REDIS_EXPIRE_AUTH_CODE;
  11. public void testRedis() {
  12. log.info("test start ...");
  13. String key = REDIS_KEY_AUTH_CODE + "10010";
  14. redisService.set(key, "管理员权限");
  15. redisService.expire(key, REDIS_EXPIRE_AUTH_CODE);
  16. String value = (String) redisService.get(key);
  17. log.info("value is : {}", value);
  18. }
  19. }

3.6.2 创建一个controller

  1. /** * 测试redis是否整合成功 */
  2. @RestController
  3. @RequestMapping("/test")
  4. public class TestController {
  5. @Autowired
  6. private TestServiceImpl testService;
  7. @GetMapping("/redis")
  8. public String testRedis() {
  9. testService.testRedis();
  10. return "success";
  11. }
  12. }

3.7 测试

用postman发送请求进行测试。并登录Redis Desktop Manager查看是否有效果

发表评论

表情:
评论列表 (有 0 条评论,113人围观)

还没有评论,来说两句吧...

相关阅读