SpringBoot使用Redis分布式缓存

发布时间 2023-10-29 10:41:37作者: 残城碎梦

Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。

RedisTempate

引入依赖

<!--spring boot 2.0以后默认使用lettuce-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--lettuce 依赖commons-pool-->
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.11.1</version>
</dependency>
<!-- jackson -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.1</version>
</dependency>

application.yml配置

实际开发中,jedis和lettuce二选一即可。

server:
  port: 9999

#系统默认连接池,这种方式 redisTemplate 可直接使用默认,在使用的地方直接注入即可
spring:
  redis:
    cluster:
      nodes: 192.168.198.155:7000,192.168.198.155:7001,192.168.198.155:7002,192.168.198.155:7003,192.168.198.155:7004,192.168.198.155:7005
      max-redirects: 3
    timeout: 6000
    #lettuce客户端
    lettuce:
      pool:
        max-active: 50
        max-idle: 8
        min-idle: 0
        max-wait: 1000ms
      shutdown-timeout: 100ms
    #jedis客户端
    jedis:
      pool:
        max-active: 50
        max-idle: 8
        min-idle: 0
        max-wait: 1000ms

Jedis和Lettuce的配置类

实际开发中二选一即可。

  • RedisJedisClusterConfig.java
@Configuration
public class RedisJedisClusterConfig {

    @Bean(name = "redisJedisTemplate")
    public RedisTemplate<String, Object> redisJedisTemplate(RedisConnectionFactory redisConnectionFactory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        return redisTemplate;
    }
}
  • RedisLettuceClusterConfig.java
@Configuration
public class RedisLettuceClusterConfig extends CachingConfigurerSupport {

    @Bean(name = "redisLettuceTemplate")
    public RedisTemplate<String, Object> redisLettuceTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(factory);

        // 使用Jackson2JsonRedisSerialize 替换默认序列化
        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);

        // key采用String的序列化方式
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        // value序列化方式采用jackson
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的key也采用String的序列化方式
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        // hash的value序列化方式采用jackson
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();

        return redisTemplate;
    }
}