安装

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

配置

application配置

单机模式

spring:
  redis:
    password: redis-password
    port: 6379
    host: localhost
    database: 0
    lettuce:
      pool:
# 在给定时间池可以分配的最大连接数,使用负值表示没有限制。
        max-active: 200
# 池中“空闲”连接的最大数量,使用负值表示无限数量的空闲连接。
        max-idle: 50
# 当池耗尽时,在抛出异常之前连接分配应该阻塞的最长时间,使用负值无限期阻止
        max-wait: 5s
# 池中要维护的最小空闲连接数的目标,此设置仅在为正值时才有效。
        min-idle: 5
# 空闲对象退出线程的运行之间的时间。当为正时,空闲对象逐出线程启动,否则不执行空闲对象逐出
        time-between-eviction-runs: 30s
    timeout: 5s

集群模式+sentinel模式

以上为redis单机模式的常规配置,连接池配置视情况配置,以下为集群模式配置

spring:
  redis:
    password: redis-password
    cluster:
#host:port,host:port,host:port
      nodes: 127.0.0.1:6379,127.0.0.1:6380,127.0.0.1:6381
# 跨集群执行命令时要遵循的最大重定向数。
      max-redirects: 3
    database: 0
    lettuce:
      pool:
# 在给定时间池可以分配的最大连接数,使用负值表示没有限制。
        max-active: 200
# 池中“空闲”连接的最大数量,使用负值表示无限数量的空闲连接。
        max-idle: 50
# 当池耗尽时,在抛出异常之前连接分配应该阻塞的最长时间,使用负值无限期阻止
        max-wait: 5s
# 池中要维护的最小空闲连接数的目标,此设置仅在为正值时才有效。
        min-idle: 5
# 空闲对象退出线程的运行之间的时间。当为正时,空闲对象逐出线程启动,否则不执行空闲对象逐出
        time-between-eviction-runs: 30s
    timeout: 5s
#-------------sentinel模式与cluster模式不同时使用-------------#
    sentinel:
# Redis 服务器的名称。
      master: sentinel-master
#host:port,host:port,host:port
      nodes: 127.0.0.1:6379,127.0.0.1:6380,127.0.0.1:6381

序列化配置

序列化配置一般针对使用RedisTemplate的或者自定义的项目,StringRedisTemplate的序列化全部使用的是String方式序列化,一般使用StringRedisTemplate的也不会再去配置,因为字符串序列化就已经是最快的序列化方式了。

@Configuration(
        proxyBeanMethods = false
)
@ConditionalOnClass({RedisOperations.class})
@EnableConfigurationProperties({RedisProperties.class})
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        template.setKeySerializer(RedisSerializer.string());
        Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
        jackson2JsonRedisSerializer.setObjectMapper(new ObjectMapper()
                .setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY)
                .activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL));
        template.setValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
    
    @Autowired
    private RedisTemplate<String, Object> redisTemplate;
}

Redis操作工具类

提供一个工具类,这个工具类并不是很全面但是都是比较常用的操作,有需要还可以自行添加。

@Configuration
@Slf4j
public class RedisUtil {

    @Autowired
    private StringRedisTemplate redisTemplate;

    /**
     * 用于隔开缓存前缀与缓存键值
     */
    private static final String KEY_SPLIT = "-";

    /**
     * 设置缓存
     *
     * @param key   缓存key
     * @param value 缓存value
     */
    public void set(String key, String value) {
        redisTemplate.opsForValue().set(key, value);
    }

    /**
     * 设置缓存
     *
     * @param prefix 缓存前缀(用于区分缓存,防止缓存键值重复)
     * @param key    缓存key
     * @param value  缓存value
     */
    public void set(String prefix, String key, String value) {
        set(prefix + KEY_SPLIT + key, value);
    }

    /**
     * 设置缓存,并且自己指定过期时间
     *
     * @param key        key
     * @param value      value
     * @param expireTime 过期时间(秒)
     */
    public void set(String key, String value, int expireTime) {
        redisTemplate.opsForValue().set(key, value, expireTime, TimeUnit.SECONDS);
    }

    /**
     * 设置缓存,并且自己指定过期时间
     *
     * @param prefix     key前缀
     * @param key        key
     * @param value      value
     * @param expireTime 过期时间(秒)
     */
    public void set(String prefix, String key, String value, int expireTime) {
        set(prefix + KEY_SPLIT + key, value, expireTime);
    }

    /**
     * 获取指定key的缓存
     *
     * @param prefix key前缀
     * @param key    key
     * @return string value
     */
    public String get(String prefix, String key) {
        return get(prefix + KEY_SPLIT + key);
    }

    /**
     * 获取指定key的缓存
     *
     * @param key key
     */
    public String get(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    /**
     * 1、根据指定key获取value,如果获取到key直接返回value
     * 2、如果key不存在,设置key的值为vluae
     *
     * @param key   key
     * @param value value
     * @return string value
     */
    public String getset(String key, String value) {
        Optional<Boolean> isExists = Optional.ofNullable(redisTemplate.opsForSet().isMember(key, value));
        if (isExists.isPresent()) {
            return value;
        }
        redisTemplate.opsForSet().add(key, value);
        return value;
    }

    /**
     * 设置指定key的过期时间
     *
     * @param key     key
     * @param seconds 秒
     */
    public Boolean expire(String key, int seconds) {
        return redisTemplate.expire(key, seconds, TimeUnit.SECONDS);
    }

    /**
     * 删除指定key的缓存
     *
     * @param prefix key前缀
     * @param key    key
     */
    public void deleteWithPrefix(String prefix, String key) {
        delete(prefix + KEY_SPLIT + key);
    }

    /**
     * 删除一个key
     *
     * @param key key
     */
    public void delete(String key) {
        redisTemplate.delete(key);
    }

    /**
     * 删除多个key
     *
     * @param keyPrefix key的前缀
     */
    public void delKeys(String keyPrefix) {
        Set<String> stringSet = redisTemplate.keys(keyPrefix + "*");
        Optional.ofNullable(stringSet).ifPresent(x -> {
            redisTemplate.delete(stringSet);
        });
    }


    /**
     * 在HashKey中设置值
     *
     * @param key   key
     * @param field hashKey
     * @param value value
     */
    public void hashSet(String key, String field, String value) {
        redisTemplate.opsForHash().put(key, field, value);
    }

    /**
     * 从HashKey中获取字符串值
     *
     * @param key   key
     * @param field hashKey
     * @return string value
     */
    public String hashGet(String key, String field) {
        return (String) redisTemplate.opsForHash().get(key, field);
    }
}