Redis 整合

这是一篇关于 Redis 整合的文章,cpp转java实录。在Spring Boot中集成Redis和操作使用。

Redis 整合

还是再提一下常考的RDB和AOF,二者都是为了保证数据的持久化,比较Redis是存在内存当中的,还是不可避免的要保存到硬盘中。

RDB: 以快照的方式,以一定的时间间隔存到硬盘当中,这个间隔会因为存储频率的变化而变化。

AOF: 以日志的方式,记录对数据库执行的所有操作,只要操作成功,就会被追加到文件末尾。

引入依赖

在Spring Boot中集成Redis,需要在pom.xml中添加Redis的依赖:

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

配置application.yml

然后在application.yml中配置Redis的连接信息:

spring:
redis:
host: 127.0.0.1 # Redis服务器地址
port: 6379 # Redis服务器端口
password: <PASSWORD>
lettuce: # 一般新的springboot用的都是lettuce
pool:
max-active: 8 # 连接池最大连接数(使用负值表示没有限制)
max-idle: 8 # 连接池最大空闲连接数
min-idle: 0 # 连接池最小空闲连接数
time-between-eviction-runs: 10m # 连接空闲超时时间

注入

然后就可以在Spring Boot的Bean中注入RedisTemplate,进行Redis的操作:

@Autowired
private RedisTemplate<String, Object> redisTemplate;

或者注入StringRedisTemplate,进行字符串操作:

@Autowired
private StringRedisTemplate stringRedisTemplate;

这样就可以在Spring Boot中使用Redis了。

基本用法

  1. String:

    1. set
      stringRedisTemplate.opsForValue().set(key, value);
    2. get
      stringRedisTemplate.opsForValue().get(key);
    3. delete
      stringRedisTemplate.delete(key);
    4. expire
      stringRedisTemplate.expire(key, timeout, timeUnit);
    5. exists
      stringRedisTemplate.hasKey(key);
  2. Hash

    1. put
      stringRedisTemplate.opsForHash().put(key, hashKey, value);
    2. putAll
      一次性把所有field-value对存入hashmap中
      Map<String, String> map = new HashMap<>();
      map.put("key1", "value1");
      map.put("key2", "value2");
      stringRedisTemplate.opsForHash().putAll(key, map);
    3. get
      stringRedisTemplate.opsForHash().get(key, hashKey);
    4. expire
      stringRedisTemplate.expire(key, timeout, timeUnit);
    5. delete
      stringRedisTemplate.opsForHash().delete(key, hashKey);
      也可以一次把key对应的所有field-value对删除
      stringRedisTemplate.delete(key);
  3. List

    1. leftPush
      stringRedisTemplate.opsForList().leftPush(key, value);
    2. rightPush
      stringRedisTemplate.opsForList().rightPush(key, value);
    3. leftPop
      stringRedisTemplate.opsForList().leftPop(key);
    4. rightPop
      stringRedisTemplate.opsForList().rightPop(key);
    5. size
      stringRedisTemplate.opsForList().size(key);
    6. range
      stringRedisTemplate.opsForList().range(key, start, end);
    7. expire
      stringRedisTemplate.expire(key, timeout, timeUnit);
    8. delete
      stringRedisTemplate.opsForList().delete(key, index);
  4. Set

    1. add
      stringRedisTemplate.opsForSet().add(key, value);
    2. size
      stringRedisTemplate.opsForSet().size(key);
    3. members
      stringRedisTemplate.opsForSet().members(key);
    4. expire
      stringRedisTemplate.expire(key, timeout, timeUnit);
    5. delete
      stringRedisTemplate.opsForSet().delete(key, value);

其他的暂且不提,因为用的确实比较少

问题记录

接下来记录一下我遇到的问题

  1. 在我们使用@Autowired注解尝试对redisTemplate进行注入时会报Warning。

    这个呢,你要么用@Resource注解,要么用IDEA推荐的方法,将要注入的redisTemplate通过输入的参数来获取

  2. StringRedisTemplate能用,但是RedisTemplate使用报null的错。

    这个是因为两者默认的序列化方式不同,你注意发现的话,前者在redis中显示的方式就是可阅读的字符串,而后者则是0x开头的字节码形式。所以如果你要用RedisTemplate,需要我们去配置一下redisTemplate的序列化方式。

    // 这个可以放在config包下的RedisConfig类中
    // 这里的Object可以替换成你要序列化的对象类型
    @Configuration
    public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
    RedisTemplate<String, Object> template = new RedisTemplate<>();
    template.setConnectionFactory(factory);
    template.setKeySerializer(new StringRedisSerializer());
    template.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    template.setHashKeySerializer(new StringRedisSerializer());
    template.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
    return template;
    }
    }