引入依赖

  1. <!-- 引入 redis 依赖 -->
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-starter-data-redis</artifactId>
  5. </dependency>

配置redis

可以在 SpringBoot autoconfigure 的 RedisAutoConfiguration 里找到 RedisProperties ,查看有哪些配置项
包含 基本连接设置,哨兵和集群配置
2.x 以上版本默认使用 lettuce,使用 Jedis 是不会注入的,要另导入依赖
如果配置连接池要配置 lettuce
image.png

spring:
  redis:
    database: 1
    host: 192.168.1.191
    port: 6379
    password: some_pwd  # 如果未单独配置默认为空即可

image.png

  • @ConditionalOnMissingBean 如果没有这个类,就执行注入.
    • 如果这个类已经生成,也就是可以自定义 redisTemplate 类然后替换掉这里的配置。
  • 可以看到这里 RedisTemplate 没有其他设置,没有序列化的配置
  • key,value 都是 Object 类型,直接使用需要强制转换
  • 如果只操作 String 类型,就直接使用 StringRedisTemplate 就可以了

    封装一下 StringRedisTemplate

    ```java public class RedisOperator { @Resource private StringRedisTemplate redisTemplate;

    /**

    • TTL key,以秒为单位,返回给定 key的剩余生存时间(TTL, time to live)。
    • @param key key
    • @return 剩余生存时间 */ public Long ttl(String key) { return redisTemplate.getExpire(key); }

      /**

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

      /**

    • 设置key-value和超时时间(秒)
    • @param key key
    • @param value value
    • @param timeout timeout (s) */ public void set(String key, String value, long timeout) { redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS); }

      /**

    • 返回 key所关联的字符串值。
    • @param key key
    • @return value */ public String get(String key) { return (String)redisTemplate.opsForValue().get(key); }

      /**

    • 设置 map 中所有值到 哈希表 key
    • @param key
    • @param map */ public void hPutAll(String key, Map map) { redisTemplate.opsForHash().putAll(key, map); }

      /**

    • 将哈希表 key 中的域 field 的值设为 value
    • @param key key
    • @param field field
    • @param value value */ public void hPut(String key, String field, Object value) { redisTemplate.opsForHash().put(key, field, value); }

      /**

    • 返回哈希表 key 中给定域 field 的值
    • @param key key
    • @param field field
    • @return value */ public String hGet(String key, String field) { return (String) redisTemplate.opsForHash().get(key, field); }

      /**

    • 删除哈希表 key 中的一个或多个指定域,不存在的域将被忽略。
    • @param key key
    • @param fields fields */ public void hDel(String key, Object… fields) { redisTemplate.opsForHash().delete(key, fields); }

      /**

    • 返回哈希表 key 中,所有的域和值
    • @param key key
    • @return map */ public Map hGetAll(String key) { return redisTemplate.opsForHash().entries(key); }

      /**

    • 将一个值 value 插入到列表 key 的表头
    • @param key key
    • @param value value
    • @return 列表长度 */ public Long lPush(String key, String value) { return redisTemplate.opsForList().leftPush(key, value); }

      /**

    • 移除并返回列表 key 的头元素
    • @param key key
    • @return value 头元素 */ public String lPop(String key) { return redisTemplate.opsForList().leftPop(key); }

      /**

    • 将一个值 value 插入到列表 key 的表尾(最右边)
    • @param key key
    • @param value value
    • @return 列表长度 */ public Long rPush(String key, String value) { return redisTemplate.opsForList().rightPush(key, value); } }
<a name="oN5Pv"></a>
## 自定义序列化
序列化:把 java 对象转换为 二进制/字符串,存储到内存中。<br />反序列化:读取内存中的 二进制/字符串,转换为 java 对象。

SpringBoot 提供了:<br />JdkSerializationRedisSerializer(默认)<br />StringRedisSerializer<br />项目中一般是 自定义 json 序列化

创建 RedisConfig 配置类
```java
@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory)
            throws UnknownHostException {
        // 为了方便,一般直接使用 <String, Object>
        RedisTemplate<String, Object> template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);
        // 序列化 json 配置
        GenericJackson2JsonRedisSerializer jackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();

        // String 的序列化
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key 用 String 序列化
        template.setKeySerializer(stringRedisSerializer);
        // value 采用 jackson 序列化
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash 的 key 也用 String 序列化
        template.setHashKeySerializer(stringRedisSerializer);
        // hash 的 value 采用 jackson 序列化
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}