iT邦幫忙

2024 iThome 鐵人賽

DAY 17
0

在當今分散式系統當道之下,隨著流量大量增長,對各種資源的使用也變得更加謹慎,當中DB就是一個容易成為效能瓶頸的地方。因此為了減少對DB的依賴、Cache的概念就隨之而生。

Spring Framework 本身有提供 @Cache 這個註解已執行簡單的Cache,但Spring Cache的資料只要服務重啟後就會消失,無法應對更加複雜的商業場景,所以後續有了Redis的出現。

如果我們想要在Spring中使用Redis,首先要引入依賴:

 <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-pool2</artifactId>
    <version>2.12.0</version>
</dependency>

為了方便使用,建議註冊以下的Bean

@Bean
public LettuceConnectionFactory lettuceConnectionFactory() {
    RedisStandaloneConfiguration config = new RedisStandaloneConfiguration();
    config.setHostName("127.0.0.1");
    config.setPort(6379); // Redis的預設埠號
    config.setPassword(""); // 放Redis的密碼,這裡暫時沒有設定
    config.setDatabase(0);

    GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
    poolConfig.setMaxWaitMillis(3000);
    // 當連線取完時,欲取得連線的最大的等待時間,超出就是連線逾時
    // Pool若是滿的狀況就會一直堵塞值到超出等待時間 JedisConnectionException
    poolConfig.setMaxIdle(8); // 最大空閒連線數
    poolConfig.setMinIdle(4); // 最小空閒連線數
    poolConfig.setMaxTotal(3000); // 最大連線數

    LettucePoolingClientConfiguration poolingClientConfig =
            LettucePoolingClientConfiguration.builder()
                    .commandTimeout(Duration.ofMillis(3000))
                    .poolConfig(poolConfig)
                    .build();

    return new LettuceConnectionFactory(config, poolingClientConfig);
}

@Bean
public RedisTemplate<String, String> redisTemplate() {
    RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
    redisTemplate.setConnectionFactory(lettuceConnectionFactory()); //建立與Redis的連接
    redisTemplate.setDefaultSerializer(
            new Jackson2JsonRedisSerializer<>(Object.class)); // 轉換Java物件格式與Redis儲存格式
    redisTemplate.setEnableTransactionSupport(true); // 加入交易
    redisTemplate.afterPropertiesSet(); // Bean設定完成後才初始化
    return redisTemplate;
}

以下一一說明功能:

  • new RedisStandaloneConfiguration(); 建立了一個Redis設定的物件
  • setHostName 設定了 連線的路徑 setPort 設定了連線的Port setPassword則是Redis的密碼
  • setDatabase 選擇要使用哪一個Redis資料庫,Redis內部預設提供16個Database,因此setDatabase 代表使用第0個資料庫,有時根據商業場景需要隔離環境時,就會需要用資料庫分區來隔離。
  • GenericObjectPoolConfig 用來配置Redis Pool 的各種連線設定
  • setMaxWaitMillis 當Redis的Pool都被取完時,請求會等候多久才回報連線逾時,
  • setMaxIdle 設定最大空閒連線數,如果空閒的連線超過這個數字就會被關閉,來節省資源。
  • setMinIdle 設定最小空閒連線數。
  • setMaxTotal 設定最大連線數,以上面的例子就是允許同時有3000個程序使用Redis
  • commandTimeout 設定Redis的Timeout時間

做好以上設定後,你就可以使用Redis進行資料的存取與讀寫了。

Redis 可以存取的類型共有五種,分別是:

  1. String 字串
  2. Hash Key-value對的資料類型
  3. List 有序列表
  4. Set 無序列表
  5. SortedSet

針對Redis在各型別的讀寫如下:

// String 讀寫
redisTemplate.opsForValue().set(key, value);
redisTemplate.opsForValue().get(key);
// Hash 讀寫
 redisTemplate.opsForHash().put(key, hashKey, value);
 redisTemplate.opsForHash().get(key, hashKey);
 // List
 redisTemplate.opsForList().rightPush(key, value); // 在list尾端加入
 redisTemplate.opsForList().leftPop(key); // 移除第一個List元素
 // Set 讀寫
 redisTemplate.opsForSet().add(key, value);
 redisTemplate.opsForSet().members(key) // 獲取集合中的所有成員
 // Sorted Set
 redisTemplate.opsForZSet().add(key, value, score)
 redisTemplate.opsForZSet().range(key, start, end)

以上就是今天的內容了,明天也會繼續講Redis 那麼明天見了。


上一篇
[DAY 21] Spring Test
下一篇
[DAY 23] Redis Between RDBMS
系列文
週日時在做什麼?有沒有空?可以來寫SpringBoot嗎?30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言