SpringBoot集成Redis

2021-06-09 18:04

阅读:349

标签:host   code   new   需要   方法   config   源码   zab   block   

SpringBoot整合Redis

SpringBoot 操作数据 :spring-data jpa jdbc mongodb redis!

SpringData 也是和SpringBoot 齐名的一个项目

说明:在 SpringBoot2.X之后,之前使用的jedis被替换为了lettuce

jedis: 采用的是直连方式,多个线程操作不安全,如果想避免,就使用 jedis pool 连接池!更像BIO模式

lettuce:采用netty,实例可以在多个线程中共享,不存在线程不安全的情况!减少线程数量,更像NIO模式

源码分析:

@Bean
@ConditionalOnMissingBean(name = "redisTemplate") // 我们可以自己定义一个redisTemplate的Bean实例来替换这个默认的
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
  //默认的 RedisTemplate 没有过多的设置,redis对象都是需要序列化!
  //两个泛型都是 object 类型,我们后面是用需要强制转换
   RedisTemplate template = new RedisTemplate();
   template.setConnectionFactory(redisConnectionFactory);
   return template;
}

@Bean
@ConditionalOnMissingBean // 由于String类型是我们Redis中最常用的类型,所以单独提出来了一个Bean
@ConditionalOnSingleCandidate(RedisConnectionFactory.class)
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) {
   StringRedisTemplate template = new StringRedisTemplate();
   template.setConnectionFactory(redisConnectionFactory);
   return template;
}

整合测试一下

1、导入依赖

org.springframework.boot
    spring-boot-starter-data-redis

2、配置连接

#配置redis
spring:
  redis:
    host: 127.0.0.1
    port: 6379

3、测试

package com.suxunan;

import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisTemplate;

@SpringBootTest
class Springboot09RedisApplicationTests {
    @Autowired
    @Qualifier("redisTemplate")
    private RedisTemplate redisTemplate;

    @Test
    void contextLoads() {

        // redisTemplate       操作不同的数据类型,api和我们的指令是一样的
        //  opsForValue     操作字符串 类似String
        //  opsForList      操作List 类似List
        //  opsForSet
        //  opsForHash
        //  opsForZSet
        //  opsForGeo
        //  opsForHyperLogLog

        //除了基本的操作,我们常用的方法都可以直接通过redisTemplate使用,比如事务和基本的crud

        //获取redis的连接对象
//        RedisConnection connection = redisTemplate.getConnectionFactory().getConnection();
//        connection.flushDb();
//        connection.flushAll();

        redisTemplate.opsForValue().set("mykey","苏绪南学Java");
        System.out.println(redisTemplate.opsForValue().get("mykey"));

    }

}

技术图片

技术图片

不使用序列化(pojo类不实现 Serializable 接口):

技术图片

所以我们需要自定义我们自己的redisTemplate:

@Configuration
public class RedisConfig {

    //编写我们自己的 redisTemplate
    //固定模板
    //@Bean
    public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        //我们为了自己开发方便,一般直接使用 
        RedisTemplate template = new RedisTemplate();
        template.setConnectionFactory(redisConnectionFactory);
        //Json序列化配置
        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);
        //String的序列化
        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);

        return template;
    }
}

SpringBoot集成Redis

标签:host   code   new   需要   方法   config   源码   zab   block   

原文地址:https://www.cnblogs.com/suxunan/p/14489427.html


评论


亲,登录后才可以留言!