项目中整合SpringDataRedis的正确姿势?

refer:https://blog.youkuaiyun.com/yangshangwei/article/details/113827617
https://artisan.blog.youkuaiyun.com/article/details/113820856
refer:设计参考:https://github.com/jantent/springbootRedis



SpringDataRedis使用Jedis来操作Redis

1、POM依赖
 <!-- 实现对 Spring Data Redis 的自动化配置 -->
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-redis</artifactId>
     <exclusions>
         <!-- 去掉  Lettuce 的依赖-->
         <!-- Spring Boot默认集成的是Lettuce作为Redis客户端来操作Redis-Server -->
         <exclusion>
             <groupId>io.lettuce</groupId>
             <artifactId>lettuce-core</artifactId>
         </exclusion>
     </exclusions>
 </dependency>

 <!-- 将 lettuce 替换为 Jedis -->
 <dependency>
     <groupId>redis.clients</groupId>
     <artifactId>jedis</artifactId>
 </dependency>

 <!-- 使用 fastjson 作为 JSON 序列化的工具 -->
 <dependency>
     <groupId>com.alibaba</groupId>
     <artifactId>fastjson</artifactId>
     <version>1.2.61</version>
 </dependency>

 <!-- Spring Data Redis 默认使用 Jackson 作为 JSON 序列化的工具 -->
 <dependency>
     <groupId>com.fasterxml.jackson.core</groupId>
     <artifactId>jackson-databind</artifactId>
 </dependency>

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

2、配置文件
spring:
  # redis的基本配置:
  # 对应 RedisProperties 类
  redis:
    host: 127.0.0.1
    port: 6379
    password: # Redis 服务器密码,默认为空。生产中,一定要设置 Redis 密码!
    database: 0 # Redis 数据库号,默认为 0 。
    timeout: 0 # Redis 连接超时时间,单位:毫秒。
    # 客户端-连接池配置
    # 对应 RedisProperties.Jedis 内部类
    jedis:
      pool:
        max-active: 8 # 连接池最大连接数,默认为 8 。使用负数表示没有限制。
        max-idle: 8 # 默认连接数最小空闲的连接数,默认为 8 。使用负数表示没有限制。
        min-idle: 0 # 默认连接池最小空闲的连接数,默认为 0 。允许设置 0 和 正数。
        max-wait: -1 # 连接池最大阻塞等待时间,单位:毫秒。默认为 -1 ,表示不限制。

3、配置类

自定义RedisTemplate

package com.artisan.config;

import org.springframework.beans.factory.annotation.Autowired;
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.RedisSerializer;
	
@Configuration
public class RedisConfiguration {
	/**
     * 因为在 springoot 2.x版本中,默认采用的是使用Lettuce作为操作redis的客户端。
     *    所以springboot的自动化配置是:无法自动的初始化出Jedis的连接对象的,JedisConnectionFactory,
     *    所以我们需要手动配置并注入:
     * @return
     */
    @Bean
    public JedisConnectionFactory jedisConnectionFactory() {
        JedisConnectionFactory factory = new JedisConnectionFactory();
        return factory;
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate() {
        RedisTemplate<String,Object> template = new RedisTemplate();
        template.setConnectionFactory(jedisConnectionFactory());
        
       //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式),
       //故pom中需引入json依赖
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<Object>(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);
         // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);

        template.setHashKeySerializer(jackson2JsonRedisSerializer);
        template.setHashValueSerializer(jackson2JsonRedisSerializer);

        template.afterPropertiesSet();

        return template;
    }
}

额外的类型信息如下:在这里插入图片描述
RedisTemplate的配置类中若有如下配置代码,om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); 那么存储的数据就会存在类型信息,故一般 不写如下的配置代码。

4、实体类
@Data
public class Person {
    private Integer id;
    private String name;
}

如何使用RedisTemplate:

@RestController
public class HelloController {

    @Autowired
    private RedisTemplate redisTemplate;

    @RequestMapping("/set")
    public Object set() {
        Person person = new Person();
        person.setId(1);
        person.setName("lq");
        
        //存值
        redisTemplate.opsForValue().set("p1", person);
        //取出的值为json对象,将json对象转为对应的json格式的字符串
        Object p1 = redisTemplate.opsForValue().get("p1");
        String jsonStr = JSONObject.toJSONString(p1);
        //将json字符串 解析为对应的对象
        Person object = JSONObject.parseObject(jsonStr, Person.class);
     
        return object;
    }

    @RequestMapping("/set2")
    public Object set2() {
        Person p1 = new Person();
        p1.setId(1);
        p1.setName("lq");

        Person p2 = new Person();
        p2.setId(2);
        p2.setName("lq2");

        Person p3 = new Person();
        p3.setId(3);
        p3.setName("lq4");

        Person p4 = new Person();
        p4.setId(4);
        p4.setName("lq4");

        List<Person> list = new ArrayList<>();
        list.add(p1);
        list.add(p2);
        list.add(p3);
        list.add(p4);
			
		//存储:value为List
        redisTemplate.opsForValue().set("ps", list);
        
        //将json对象转为json字符串
        String jsonString = JSONObject.toJSONString(redisTemplate.opsForValue().get("ps"));
        //将json字符串解析为对应的集合类
        List<Person> personList = JSONObject.parseObject(jsonString, new TypeReference<List<Person>>() {
        });
        return personList;
    }
}

注:从redis中取出的数据是JSON类型,需使用fastjson转为json字符串,再转为对应的对象来使用。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值