我的spring-boot 集成redis(方便自己看)

本次問題(結(jié)尾解答):

1.java.lang.IllegalArgumentException: Invalid character found in method name [0x160x030x01錯誤

2.Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool] with root cause

3.自定義模板,解決序列化問題

正題開始,在 SpringBoot2.x 之后,原來使用的jedis 被替換為了 lettuce

jedis : 采用的直連,多個線程操作的話,是不安全的,如果想要避免不安全的,使用 jedis pool 連接
池!
lettuce : 采用netty,實例可以再多個線程中進行共享,不存在線程不安全的情況!可以減少線程數(shù)據(jù)。
在pom.xml文件添加依賴:這里我使用的連接池技術(shù)是jedis

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <!-- 1.5的版本默認(rèn)采用的連接池技術(shù)是jedis  2.0以上版本默認(rèn)連接池是lettuce, 在這里采用jedis,所以需要排除lettuce的jar -->
            <exclusions>
                <exclusion>
                    <groupId>io.lettuce</groupId>
                    <artifactId>lettuce-core</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <!-- 添加jedis客戶端 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
        </dependency>
        <!-- 將作為Redis對象序列化器 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

然后application.properties添加:

(假如redis有密碼的話:自行添加 spring.redis.password=xxxxx)

spring.redis.host=120.25.26.86
spring.redis.port=6379

在service層簡單實現(xiàn)普通添加數(shù)據(jù)進入redis:

public interface RedisService {
    void addkey(String key,String value);
}



@Service
public class RedisServiceImp implements RedisService {
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;

    @Override
    public void addkey(String key,String value) {
        redisTemplate.opsForValue().set(key,value);
    }
}

在控制層實現(xiàn)service操作redis的方法:

@Autowired
    private RedisService redisService;
    @RequestMapping("/redis")
    public @ResponseBody String RedisDemo(@RequestParam String key, String value){
        System.out.println(key);
        System.out.println("進來了");
        redisService.addkey(key,value);
        return "ok";
    }

啟動springboot測試一下:

http://localhost:8080/redis?key=hi&value=hi

圖片.png

圖片.png

遇到的問題:

1.java.lang.IllegalArgumentException: Invalid character found in method name [0x160x030x01錯誤解決
https://localhost:8080/ 改為http://localhost:8080/

2.Cannot get Jedis connection; nested exception is redis.clients.jedis.exceptions.JedisException: Could not get a resource from the pool] with root cause
假如引入的依賴沒錯的話,有可能是你的遠(yuǎn)程redis的不對外連接,需要修改一下redis配置文件:


圖片.png

還不行的話,看看你的遠(yuǎn)程服務(wù)器6379端口有沒有開放。

3.redis有一個問題,就是在存對象的時候,會序列化成2進制文件。

原因:
spring-data-redis的RedisTemplate<K, V>模板類在操作redis時默認(rèn)使用JdkSerializationRedisSerializer來進行序列化

解決:
自定義RestTemplate,使用GenericJackson2JsonRedisSerializer解決序列化問題。

public class RedisConfig {
 
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
        redisTemplate.setConnectionFactory(redisConnectionFactory);
 
//        // 使用Jackson2JsonRedisSerialize 替換默認(rèn)序列化
//        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
//
//        ObjectMapper objectMapper = new ObjectMapper();
//        objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
//        objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
//
//        jackson2JsonRedisSerializer.setObjectMapper(objectMapper);
 
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
 
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
 
        // 設(shè)置value的序列化規(guī)則和 key的序列化規(guī)則
        redisTemplate.setKeySerializer(stringRedisSerializer);
        redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
 
        redisTemplate.setHashKeySerializer(stringRedisSerializer);
        redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
 
        redisTemplate.setDefaultSerializer(genericJackson2JsonRedisSerializer);
        redisTemplate.setEnableDefaultSerializer(true);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }
 
}

自定義redisTemple后,使用自動注入@Autowired即可使用。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容