Spring Boot Redis整合

springboot项目中经常会用到redis作为缓存数据库,而springboot又带有cache缓存机制。怎么不用springboot自带的cache,而仅仅只用redis功能呢?

关于springboot cache介绍可以参考:https://mrbird.cc/Spring-Boot%20cache.html
其他参考博客:
1.https://www.jianshu.com/p/5596c3a4978d
2.

Jedis和Lettuce的区别在哪?

1、Jedis 是直连模式,在多个线程间共享一个 Jedis 实例时是线程不安全的,每个线程都去拿自己的 Jedis 实例,当连接数量增多时,物理连接成本就较高了。

2、Lettuce的连接是基于Netty的,连接实例可以在多个线程间共享,如果你不知道Netty也没事,大致意思就是一个多线程的应用可以使用同一个连接实例,而不用担心并发线程的数量。通过异步的方式可以让我们更好地利用系统资源。

参考:https://www.cnblogs.com/gaoquanquan/p/11278333.html
https://blog.csdn.net/wangpf2011/article/details/106451782

既然有这么大的好处,干脆就用了这个,跟上时代的变化。下面新建一个SpringBootRedis项目,开始整合。

1.添加依赖

 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
 </dependency>

 <dependency>
     <groupId>org.apache.commons</groupId>
     <artifactId>commons-pool2</artifactId>
 </dependency>

2.application.yml配置文件

spring:
  redis:
    database: 0
    host: 127.0.0.1
    port: 6379
    password: 123456
    lettuce:
      pool:
        max-active: 8
        max-wait: -1ms
        max-idle: 8
        min-idle: 0

3.新建config包,创建RedisConfig类

@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory factory){
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(factory);

        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
        Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper om = new ObjectMapper();
        // 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        // 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jacksonSeial.setObjectMapper(om);

        // 值采用json序列化
        template.setValueSerializer(jacksonSeial);
        //使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());

        // 设置hash key 和value序列化模式
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(jacksonSeial);
        template.afterPropertiesSet();

        return template;
    }
}

因为不用cache,所以这里并没用@EnableCaching注解,也没继承CachingConfigurerSupport类

这里自定义序列化器,是因为默认的JdkSerializationRedisSerializer中文会乱码

问题
template.afterPropertiesSet();
此方法是应该是初始化参数和初始化工作

但注释后测试了下,好像也没报错,敢问各位看官有谁知道的?

4.测试


	@Autowired
    private RedisTemplate<String, Object> template;

    @RequestMapping("/usertest")
    @ResponseBody
    public String test(){
        User user = new User();
        user.setUsername("allen");
        user.setPhone("123123");
        String key = "key";
        template.opsForValue().set(key, user);

        return template.opsForValue().get(key).toString();
    }

序列化器

这里先说一下Spring提供了那些序列化器(各自作用自行百度,这里不再赘述)

  • Jackson2JsonRedisSerializer
  • JdkSerializationRedisSerializer
  • OxmSerializer
  • StringRedisSerializer
  • GenericToStringRedisSerializer
  • GenericJackson2JsonRedisSerializer

然后以下是一些问题需要搞清楚

  • 为什么需要序列化?
    你要记住一句话,在JAVA中,一切皆对象,而将对象的状态信息转为存储或传输的形式需要序列化。
  • 默认的序列化器
    对于String类型,默认选择的StringRedisSerializer序列化器;而对象,默认是JdkSerializationRedisSerializer

RedisTemplate

Spring Boot 的 spring-boot-starter-data-redis 为 Redis 的相关操作提供了一个高度封装的 RedisTemplate 类,而且对每种类型的数据结构都进行了归类,将同一类型操作封装为 operation 接口。RedisTemplate 对五种数据结构分别定义了操作,如下所示:

  • 操作字符串:redisTemplate.opsForValue()
  • 操作 Hash:redisTemplate.opsForHash()
  • 操作 List:redisTemplate.opsForList()
  • 操作 Set:redisTemplate.opsForSet()
  • 操作 ZSet:redisTemplate.opsForZSet()

redis工具类

参考https://blog.csdn.net/mengxiangxingdong/article/details/88419976

redis集群配置

yml配置文件

spring:
  redis:
    timeout: 6000ms
    password: 
    cluster:
      max-redirects: 3  # 获取失败 最大重定向次数 
      nodes: 192.168.3.222:7000,192.168.3.222:7001,192.168.3.222:7002,192.168.3.223:7003,192.168.3.223:7004,192.168.3.223:7005
    lettuce:
      pool:
        max-active: 1000  #连接池最大连接数(使用负值表示没有限制)
        max-idle: 10 # 连接池中的最大空闲连接
        min-idle: 5 # 连接池中的最小空闲连接
        max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)

若没有cluster配置,则redis默认是单机连接;加了cluster,可以不用host配置
RedisConfig类不用做改变,springboot会默认帮我们配置好

redis 连接池

默认使用lettuce连接池,在配置文件显示声明,如

redis:
 lettuce:
      pool:
        max-active: 1000  #连接池最大连接数(使用负值表示没有限制)
        max-idle: 10 # 连接池中的最大空闲连接
        min-idle: 5 # 连接池中的最小空闲连接
        max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)

如果使用jedis则显示声明:

redis:
 jedis:
 	pool:
 		....

版权声明:本文为qq_16739693原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。