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 等

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章