前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >就像一个从来没有杀过猪的人在教别人杀猪

就像一个从来没有杀过猪的人在教别人杀猪

原创
作者头像
半月无霜
发布2024-05-17 23:24:52
690
发布2024-05-17 23:24:52
举报
文章被收录于专栏:半月无霜半月无霜

就像一个从来没有杀过猪的人在教别人杀猪

一、介绍

在上一篇文章里,在公共模块中引入了redis依赖,从而造成没有配置redis信息的模块,在启动时,会默认去连接localhost:6379

这是我们不希望看到的,所以便有了上一篇文章

当SpringBoot引用Redis依赖但没有配置Redis信息时 | 半月无霜 (banmoon.top)

好巧不巧,目前又出现了一个情况。

就是reactiveselevt两种不同的web去引用了这个模块。

selevt是好了,但我的gateway出现了问题,它连不上redis了,连对应的bean都没有创建出来。

所以没办法,我只能再继续改造这个RedisConfig.java

二、代码

1)配置类

原本的RedisConfig.java,用来给selevt使用

代码语言:javascript
复制
package com.banmoon.business.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
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;

/**
 * @author banmoon
 * @date 2024/03/07 12:08:25
 */
@SuppressWarnings("all")
@Configuration
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@EnableAutoConfiguration(exclude = {RedisAutoConfiguration.class})
public class RedisConfig {

    @Bean
    @ConditionalOnBean(RedisConnectionFactory.class)
    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;
    }

}

新开一个ReactiveRedisConfig.java,给reactive使用

代码语言:javascript
复制
package com.banmoon.business.config;

import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.boot.autoconfigure.AutoConfigureBefore;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
import org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.ReactiveRedisConnectionFactory;
import org.springframework.data.redis.core.ReactiveRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;

/**
 * @author banmoon
 * @date 2024/03/07 12:08:25
 */
@SuppressWarnings("all")
@Configuration(proxyBeanMethods = false)
@AutoConfigureBefore({RedisAutoConfiguration.class, RedisReactiveAutoConfiguration.class})
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)
public class ReactiveRedisConfig {

    @Bean
    @ConditionalOnBean(ReactiveRedisConnectionFactory.class)
    public ReactiveRedisTemplate<String, Object> reactiveRedisTemplate(ReactiveRedisConnectionFactory 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();
        RedisSerializationContext<String, Object> serializationContext = RedisSerializationContext
                .<String, Object>newSerializationContext(stringRedisSerializer)
                .value(jackson2JsonRedisSerializer)
                .hashKey(stringRedisSerializer)
                .hashValue(jackson2JsonRedisSerializer)
                .build();
        ReactiveRedisTemplate<String, Object> template = new ReactiveRedisTemplate<>(factory, serializationContext);
        return template;
    }

}

注意此处,需要指定在其之前加载,那样才能保证使用的是我们自己的reactiveRedisTemplate

@AutoConfigureBefore({RedisAutoConfiguration.class, RedisReactiveAutoConfiguration.class})

2)测试

写一个controller进行测试

代码语言:javascript
复制
package com.banmoon.controller;

import com.banmoon.business.obj.dto.ResultData;
import com.banmoon.obj.request.RedisSetValueRequest;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.redis.core.ReactiveRedisTemplate;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Mono;

import javax.annotation.Resource;
import javax.validation.Valid;

@Slf4j
@Api(tags = "redis测试模块")
@Validated
@RestController
@RequestMapping("/redis/test")
public class RedisTestController {

    @Resource
    private ReactiveRedisTemplate<String, Object> reactiveRedisTemplate;

    @ApiOperation("获取redis缓存")
    @GetMapping("/get")
    public Mono<ResultData<String>> get(String key) {
        return reactiveRedisTemplate.opsForValue()
                .get(key)
                .map(value -> ResultData.success(value.toString()));
    }

    @ApiOperation("设置redis缓存")
    @PostMapping("/set")
    public Mono<ResultData<?>> set(@RequestBody @Valid RedisSetValueRequest request) {
        return reactiveRedisTemplate.opsForValue()
                .set(request.getKey(), request.getValue())
                .map(result -> result ? ResultData.success() : ResultData.fail());
    }

}

执行测试

image-20240517230158000
image-20240517230158000
image-20240517230227446
image-20240517230227446

三、最后

那些我记录的技能点,就算是哪天我在某处看到的一篇文章,它就像一个引子,我想把它分享出去,这个问题可以试试用这个去解决。

就当我满心欢喜的分享我所知道的技术的时候,冷不防的一句话将我真是让我哑口无言

就像一个从来没有杀过猪的人在教别人杀猪!

行吧,半响之后,我从牙缝里面挤出这个词。

以后,再无共勉,工作上的事情,还是不要报太大的兴趣吧。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 就像一个从来没有杀过猪的人在教别人杀猪
    • 一、介绍
      • 二、代码
        • 1)配置类
        • 2)测试
      • 三、最后
      相关产品与服务
      云数据库 Redis
      腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档