Spring Boot-Redis教程

banq發表於2024-05-14

Redis 是一種開源記憶體資料結構儲存,可用作資料庫、快取和訊息代理。將 Redis 與 Spring Boot 整合提供了一種在應用程式中利用 Redis 的簡單而有效的方法。下面總結一下如何將Redis與Spring Boot整合:

Docker 檔案
這是基本的 docker-compose redis 配置

services:
    redis:
    image: redis:latest
    restart: always
    ports:
      - <font>"6379:6379"
    environment:
      - REDIS_PASSWORD=my-password
      - REDIS_PORT=6379
      - REDIS_DATABASES=16

Maven 依賴

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

應用程式yml檔案

spring:
  cache:
    type: redis
    redis:
      host: localhost
      port: 6379

cache:
  config:
    entryTtl: 60
    jwtToken:
      entryTtl: 30

在application yml檔案中,定義了快取型別和redis主機、埠資訊。

Redis 配置類

@Configuration
@EnableCaching
@Slf4j
public class RedisConfig {

    @Value(<font>"${spring.cache.redis.host}")
    private String redisHost;

    @Value(
"${spring.cache.redis.port}")
    private int redisPort;

    @Bean
    public LettuceConnectionFactory redisConnectionFactory() {
        RedisStandaloneConfiguration configuration = new RedisStandaloneConfiguration(redisHost, redisPort);
        configuration.setPassword(
"my-password");
        log.info(
"Connected to : {} {}", redisHost, redisPort);

        return new LettuceConnectionFactory(configuration);
    }

    @Bean
    public RedisCacheManager cacheManager(RedisConnectionFactory connectionFactory) {
        return RedisCacheManager.create(connectionFactory);
    }

    @Bean
    public RedisTemplate<String, Object> redisTemplate(){
        final RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashKeySerializer(new GenericToStringSerializer<Object>(Object.class));
        redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer());
        redisTemplate.setValueSerializer(new StringRedisSerializer());
        redisTemplate.setConnectionFactory(redisConnectionFactory());
        return redisTemplate;
    }
}

使用快取註釋
要在應用程式中啟用快取,您可以使用註釋,然後使用、和@EnableCaching註釋應快取的方法@Cacheable@CachePut@CacheEvict

@GetMapping(<font>"/product/{id}")  
@Cacheable(value =
"product", key = "id")
public Product getProductById(@PathVariable long id) {...}

1. @Cacheable用於從資料庫中獲取資料,並將其儲存在快取中。以後呼叫時,該方法會直接檢索快取的值,無需再次執行該方法。
該value屬性建立一個具有特定名稱的快取,同時該key屬性允許使用 Spring 表示式語言動態計算金鑰。因此,方法結果儲存在“product”快取中,其中相應的“product_id”作為唯一鍵。這種方法透過將每個結果與不同的鍵相關聯來最佳化快取。

2、 @CachePut用於當源資料庫有更新時更新快取中的資料。

@PutMapping(<font>"/product/{id}")
@CachePut(cacheNames =
"product", key = "id")
public Product editProduct(@PathVariable long id, @RequestBody Product product) {...}

3 . @CacheEvict用於從快取中刪除陳舊或未使用的資料。

@DeleteMapping(<font>"/product/{id}")
@CacheEvict(cacheNames =
"product", key = "id", beforeInvocation = true)
public String removeProductById(@PathVariable long id) {...}

我們使用cacheName和key從快取中刪除特定資料。 beforeIncation 屬性允許我們控制逐出過程,使我們能夠選擇逐出是在方法執行之前還是之後發生。

@DeleteMapping(<font>"/product/{id}")
@CacheEvict(cacheNames =
"product", allEntries = true)
public String removeProductById(@PathVariable long id) {...}

或者,也可以透過將 allEntries 屬性設定為 true 來刪除給定快取的所有資料。該註釋允許我們透過提供多個值作為cacheName來清除多個快取的資料。

4 . @Caching用於同一方法上的多個巢狀快取。

@PutMapping(<font>"/{id}")
@Caching(
     evict = {@CacheEvict(value =
"productList", allEntries = true)},
     put = {@CachePut(value =
"product", key = "id")}
)
public Product editProduct(@PathVariable long id, @RequestBody Product product) {...}

由於 Java 不允許為一個方法宣告相同型別的多個註釋,因此這樣做會產生編譯錯誤。我們可以將不同的註釋分組到快取中,如圖所示。

5 . @CacheConfig用於集中配置。

@CacheConfig(cacheNames = <font>"product")
public class ProductController {...}

使用 RedisTemplate
您可以使用RedisTemplate與Redis互動。例如,將資料儲存到Redis中:

@Autowired
private RedisTemplate<String, Object> redisTemplate;

public void saveData(String key, Object data) {
    redisTemplate.opsForValue().set(key, data);
}

從Redis中檢索資料

public Object getData(String key) {
    return redisTemplate.opsForValue().get(key);
}

Redis 模板的示例服務類

@Service
public class CacheTokenService {

    private final StringRedisTemplate stringRedisTemplate;
    private final RedisTemplate<String, Object> redisTemplate;

    public CacheTokenService(StringRedisTemplate stringRedisTemplate, RedisTemplate<String, Object> redisTemplate) {
        this.stringRedisTemplate = stringRedisTemplate;
        this.redisTemplate = redisTemplate;
    }

    public void saveData(String key, Object data) {
        redisTemplate.opsForValue().set(key, data);
    }

    public Object getData(String key) {
        return redisTemplate.opsForValue().get(key);
    }

    public void cacheToken(String username, String token) {
        stringRedisTemplate
        .opsForValue()
        .set(<font>"token:" + username, token, Duration.ofMinutes(60));
    }

    public String getCachedToken(String username) {
       
// Retrieve the token from Redis cache<i>
        return stringRedisTemplate
        .opsForValue()
        .get(
"token:" + username);
    }

}

Redis 圖形使用者介面:RedisInsight
下載連結:https://redis.io/insight/

相關文章