springboot 整合 redis (RedisConnection RedisConnectionFactory Redis Template redis序列化)

目录

1.起步

2.钻进去康一康

2.1.RedisConnection

2.2.RedisConnectionFactory

2.3. RedisTemplate

2.4.数据的序列化


1.起步

还是老规矩,直接开始,先用最简单的配置运行起来:

pom.xml依赖 (只列出重要依赖)


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

applicaiton.yml 配置:

spring:
  # redis 配置
  redis:
    database: 8
    # 地址
    host: 127.0.0.1
    # 端口,默认为6379
    port: 6379
    # 密码
    password:
    # 连接超时时间
    timeout: 10s
    lettuce:
      pool:
        # 连接池中的最小空闲连接
        min-idle: 0
        # 连接池中的最大空闲连接
        max-idle: 8
        # 连接池的最大数据库连接数
        max-active: 8
        # #连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms

写一个简单的工具类:RedisUtils

    public class RedisUtils {
    /**
     * 此处使用的是Spring 默认提供的redisTemplate,(使用 JackSon 做序列化)
     */
    @Resource
    public RedisTemplate redisTemplate;

     /**
     * 插入缓存对象,Integer、String、实体类等
     *
     * @param key      缓存的键值
     * @param value    缓存的值
     * @param timeout  时间
     * @param timeUnit 时间颗粒度
     * @return 缓存的对象
     */
    public <T> ValueOperations<String, T> setCacheObject(String key, T value, Integer timeout, TimeUnit timeUnit) {
        ValueOperations<String, T> operation = redisTemplate.opsForValue();
        operation.set(key, value, timeout, timeUnit);
        return operation;
    }  

    /**
     * 获得缓存的基本对象。
     *
     * @param key 缓存键值
     * @return 缓存键值对应的数据
     */
    public <T> T getCacheObject(String key) {
        ValueOperations<String, T> operation = redisTemplate.opsForValue();
        T t = operation.get(key);
        return t;
    }

}

简单测试一下:(这里要记得先在命令行使用命令 redis-server 启动 redis 服务)

    @Test
    public void test1() {
        redisUtils.setCacheObject("username", "swing");
        System.out.println((String) redisUtils.getCacheObject("username"));
    }

//结果:swing

2.钻进去康一康

简单的例子可以运行了,现在我们来简要分析一下原理

redis和MySQL一样,都是数据库,只不过redis是非关系型的,而MySQL是关系型的,但他们还是有很多共同点的,

java 使用 JDBC 连接数据库,JDBC提供了一套标准的接口(例如Connection,Statement等),而这套接口的实现由各大数据库的厂家提供(也就是平时所说的数据库连接驱动)

同样,sprign-redis 也为 redis 提供了一些这样的接口,这里重点说一下 RedisConnection and RedisConnectionFactory 

2.1.RedisConnection

RedisConnection提供了Redis通信的核心构建块, 和JDBC中的Connection类似

RedisConnection 需要使用 RedisConnectionFactory获取

2.2.RedisConnectionFactory

RedisConnectionFactory 常用的有两种连接器的实现: Lettuce Connector 和 Jedis Connector,两种实现方式的配置也很简单,如下:

  • Lettuce (spring-boot-redis的默认RedisConnectionFactory的默认实现)
  <dependency>
    <groupId>io.lettuce</groupId>
    <artifactId>lettuce-core</artifactId>
    <version>5.3.1.RELEASE</version>
  </dependency>
  @Bean
  public LettuceConnectionFactory redisConnectionFactory() {
    return new LettuceConnectionFactory(new RedisStandaloneConfiguration("server", 6379));
  }
  • Jedis
  <dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.3.0</version>
  </dependency>
  @Bean
  public JedisConnectionFactory redisConnectionFactory() {
    RedisStandaloneConfiguration config = new RedisStandaloneConfiguration("server", 6379);
    return new JedisConnectionFactory(config);
  }

2.3. RedisTemplate

RedisConnection提供了接受和返回二进制值(字节数组)的低级方法,我们直接去使用RedisConnection操作redis的话无意效率太低(使用原生JDBC便能体会到这一点)所以便有了RedisTemplate , 它负责序列化和连接管理,使用户无需处理此类细节。 使操作redis 更简单高效

2.4.数据的序列化

Redis中存储的数据仅为字节。虽然Redis本身支持各种类型,但在大多数情况下,它们是指数据的存储方式,而不是其表示的内容。由用户决定是否将信息转换为字符串或任何其他对象。 在Spring Data中,用户(自定义)类型和原始数据之间的转换(反之亦然)由org.springframework.data.redis.serializer包中序列化器处理。

spring内置了这几种序列化器:(所有的序列化器都是 RedisSerializer 的实现)

redis支持对键和值提供不同的序列化方式,如下实例:

    @Bean
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
        RedisTemplate<Object, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(connectionFactory);

        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);

        //指定键的序列化器
        template.setKeySerializer(new StringRedisSerializer());
        //指定值的序列化器
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();

        return template;
    }

同样,也支持自定义序列化器,例如使用FastJson 等

  • 9
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Spring Boot可以很方便地与Redis集成,使用RedisTemplate可以实现对Redis的操作。在使用RedisTemplate时,需要对数据进行序列化和反序列化,以便存储和读取数据。Spring Boot提供了多种序列化方式,包括JdkSerializationRedisSerializer、Jackson2JsonRedisSerializer、GenericJackson2JsonRedisSerializer等。其中,JdkSerializationRedisSerializer是默认的序列化方式,但由于其效率较低,一般不建议使用。Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializer则可以将数据序列化为JSON格式,效率较高,推荐使用。在使用Jackson2JsonRedisSerializer和GenericJackson2JsonRedisSerializer时,需要注意对象的类必须有默认的构造函数。 ### 回答2: Spring Boot 是一个快速开发框架,而 Redis 是一款高效 NoSQL 数据库,二者结合在一起可以提供更加高效的开发和运行效率。在实际应用中,往往需要使用RedisSpringBoot序列化功能来存储和读取数据。 Spring Boot 提供了一种比较友好的整合 Redis 的方式,也提供了对于 Redis 序列化功能的支持。在 SpringBoot 中,我们可以通过引入 Jedis 或 Lettuce 作为 Redis 客户端来实现对 Redis 服务的访问。 在默认情况下,SpringBoot 使用的是 JDK 序列化器来序列化数据。但是 JDK 序列化器的效率并不高,而且在某些情况下可能会出现序列化和反序列化的数据不一致问题,因此建议我们自定义 Redis 序列化器来提高效率。 SpringBoot 提供了一个 RedisTemplate 实现来进行 Redis 数据操作,同时通过配置 RedisTemplate 的 ValueSerializer 和 KeySerializer 实现自定义的序列化和反序列化功能。以下是自定义 Redis 序列化器的实现步骤: - 首先,需要定义一个实现 RedisSerializer 接口的 Redis 序列化器; - 然后,通过配置 RedisTemplate 的 ValueSerializer 和 KeySerializer 来设置 Redis 序列化器; - 最后,在代码中使用 RedisTemplate 进行 Redis 数据操作即可。 以下是一个 Redis 序列化器的简单示例: public class RedisObjectSerializer implements RedisSerializer<Object> { private Converter<Object, byte[]> serializer = new SerializingConverter(); private Converter<byte[], Object> deserializer = new DeserializingConverter(); @Override public byte[] serialize(Object obj) throws SerializationException { if (obj == null) { return new byte[0]; } return serializer.convert(obj); } @Override public Object deserialize(byte[] bytes) throws SerializationException { if (bytes == null || bytes.length == 0) { return null; } return deserializer.convert(bytes); } } 以下是一个自定义 RedisTemplate 的简单示例: @Configuration public class RedisConfig { @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<Object, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new RedisObjectSerializer()); return template; } } 在进行 Redis 数据操作时,我们可以使用 RedisTemplate 对象来进行操作,如下所示: @Autowired private RedisTemplate<Object, Object> redisTemplate; public void setData(String key, Object value) { redisTemplate.opsForValue().set(key, value); } public Object getData(String key) { return redisTemplate.opsForValue().get(key); } 总之,自定义 Redis 序列化器是为了提高 Redis 的运行效率和数据传输速率,也能够避免出现数据不一致问题。在 SpringBoot 中,只需要通过配置 RedisTemplate 的 ValueSerializer 和 KeySerializer 即可完成 Redis 序列化器的自定义配置。 ### 回答3: SpringBoot 是一款非常方便的框架,可以简化企业级应用程序的开发。它已经集成了大量常用的组件,Redis 是其中一个非常常用的缓存组件。本文将介绍如何在 SpringBoot整合 Redis 缓存,并且使用序列化进行存储。 Redis 是一款基于 key-value 存储的 NoSQL 数据库,它是一个开源的高性能 Key-Value 数据库。在 Redis 中,key 和 value 都是一个二进制的字符串。因此,在存取数据时,可以通过序列化和反序列化将对象转换成字符串类型然后进行存储和读取。 使用 Redis 缓存时,我们可以使用 SpringBoot 的自动配置来集成 Redis 缓存。SpringBoot 提供了一个 starter,也就是 Redis Starter,集成了 jedis 和 lettuce 两种 Redis 客户端,可以轻松实现对 Redis 的自动配置和启动。 在使用 Redis 缓存时,需要使用序列化将需要缓存的对象转换为字符串,然后将其存入 Redis 中。SpringBoot 支持多种序列化方式,包括 JDK 序列化、gson、Jackson、fastjson 等。其中,JSON 序列化是最常用的一种方式,因为它具有良好的可读性和可扩展性。 SpringBoot 提供了一个 RedisTemplate 类,使我们可以轻松地访问 Redis 的 API。在使用 RedisTemplate 时,需要指定序列化方式,如果我们要使用 JSON 序列化,可以在 RedisTemplate 的配置中添加以下内容: ``` @Configuration public class RedisConfig { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(redisConnectionFactory); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new GenericJackson2JsonRedisSerializer()); template.setHashKeySerializer(new StringRedisSerializer()); template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer()); template.afterPropertiesSet(); return template; } } ``` 在上面的配置中,我们首先定义了一个 RedisTemplate bean,它将使用 String 作为 key,Object 作为 value。然后,我们将 RedisConnectionFactory 注入 RedisTemplate 中,并设置了默认的序列化器为 GenericJackson2JsonRedisSerializer。 以上就是整合 Redis 序列化的步骤。在对需要缓存的数据进行序列化的时候,需要注意序列化的时效性和数据的更新策略。如果数据量过大,需要考虑 Redis 的缓存清理机制以及缓存命中率等问题。希望本文对大家有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值