まず、キャッシュ マネージャーを構成する必要があります。その後、キャッシュ アノテーションを使用してキャッシュを管理できます。
package com.cherish.servicebase.handler; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializationContext; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import java.time.Duration; @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport { @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<>(); RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); template.setConnectionFactory(factory); //key序列化方式 template.setKeySerializer(redisSerializer); //value序列化 template.setValueSerializer(jackson2JsonRedisSerializer); //value hashmap序列化 template.setHashValueSerializer(jackson2JsonRedisSerializer); return template; } @Bean public CacheManager cacheManager(RedisConnectionFactory factory) { RedisSerializer<String> redisSerializer = new StringRedisSerializer(); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); //解决查询缓存转换异常的问题 ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); // 配置序列化(解决乱码的问题),过期时间600秒 RedisCacheConfiguration config = RedisCacheConfiguration .defaultCacheConfig() .entryTtl(Duration.ofSeconds(600)) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)) .disableCachingNullValues(); RedisCacheManager cacheManager = RedisCacheManager.builder(factory) .cacheDefaults(config) // 可以给每个cacheName不同的RedisCacheConfiguration 设置不同的过期时间 //.withCacheConfiguration("Users",config.entryTtl(Duration.ofSeconds(100))) .transactionAware() .build(); return cacheManager; } }
は、識別するためにメソッドまたはクラスにマークされます。メソッドまたはクラスがそれをサポートしていること。 Spring がアノテーション識別メソッドを呼び出した後、戻り値は redis にキャッシュされ、次回同じ条件でメソッドが呼び出されたときに戻り値がキャッシュから直接取得されるようになります。これにより、この方式による業務処理プロセスを再実行する必要がなくなり、効率が向上する。
@Cacheable 一般的に使用される 3 つのパラメータは次のとおりです。
cacheNames キャッシュ名
key キャッシュされたキー。キーの記述方法に注意する必要があります。
conditionキャッシュ実行の条件 (true が返された場合) Execution
Example
//查询所有用户,缓存到redis中 @GetMapping("/selectFromRedis") @Cacheable(cacheNames = "Users",key = "'user'") public ResultData getUserRedis(){ List<User> list = userService.list(null); return ResultData.ok().data("User",list); }
最初のクエリはデータベースからクエリされ、redis にキャッシュされます。キャッシュされた情報を表示するための視覚化ツール
2 番目のクエリはキャッシュ コンソールに移動しますが、出力はありません。そのため、Redis キャッシュは Redis で結果を取得して返します。直接。
がメソッドにマークされており、メソッドの実行後、条件またはキーに基づいて対応するキャッシュが削除されます。一般的に使用される属性:
allEntries ブール型。キャッシュ内のすべての要素をクリアする必要があるかどうかを示します。
key キャッシュ内のすべての要素をクリアする必要があるかどうかを示します。削除する必要があります
//调用这个接口结束后,删除指定的Redis缓存 @PostMapping("updateUser") @CacheEvict(cacheNames ="Users",key = "'user'") public ResultData updateUser(@RequestBody User user){ String id = user.getId(); QueryWrapper<User> wrapper=new QueryWrapper<>(); wrapper.eq("id",id); boolean b = userService.update(user, wrapper); return ResultData.ok().data("flag",b); }
//不删除redis缓存 @PostMapping("updateUser2") public ResultData updateUser2(@RequestBody User user){ String id = user.getId(); QueryWrapper<User> wrapper=new QueryWrapper<>(); wrapper.eq("id",id); boolean b = userService.update(user, wrapper); return ResultData.ok().data("flag",b); }
データベース内のデータを更新するときは、Redis キャッシュをクリアする必要があります。そうしないと、クエリするデータは Redis キャッシュ内のデータとなり、データベースとキャッシュされたデータの間に不整合が発生します。
例: @CacheEvict アノテーションなしでインターフェースを呼び出してデータを変更する クエリで取得したデータは変更前のものです。
したがって、データを変更するためにインターフェイスを呼び出すときは、キャッシュをクリアする必要があります
@CacheEvict アノテーションを追加して、対応するキャッシュをクリアします。今回は、データはクエリ中に検出され、最新であり、データベースと一致しています。
Spring Cacheの基本機能を実装し、RedisCacheManger
としてRedisを統合しましたが、ご存知のとおり、 @Cacheable
アノテーションを使用する場合、キャッシュに有効期限を与えることはできません。ただし、シナリオによっては、キャッシュに有効期限を本当に設定する必要がある場合があります。これはデフォルトの有効期限です
#新しい Redis 構成を使用し、キャッシュされたデータを再度クエリしてデータの有効期間を確認します
以上がspringboot と redis の統合で @Cacheable を使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。