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/