次のコラム Redis チュートリアル では、Spring Redis アノテーションによって実装されたキャッシュ メカニズムを紹介します。
1. XML 設定
<bean id="poolConfigTax" class="redis.clients.jedis.JedisPoolConfig"> <property name="maxIdle" value="${redis_tax.maxIdle}" /> <property name="minIdle" value="${redis_tax.minIdle}" /> <property name="maxTotal" value="${redis_tax.maxTotal}" /> <property name="testOnBorrow" value="${redis_tax.testOnBorrow}" /> </bean> <!-- Tax redis 数据库 --> <bean id="connectionFactoryTax" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory" p:host-name="${redis_tax.host}" p:port="${redis_tax.port}" p:password="${redis_tax.pass}" p:pool-config-ref="poolConfigTax" p:database="0"/> <!--redis操作模版,使用该对象可以操作redis --> <bean id="redisTemplateTax" class="org.springframework.data.redis.core.RedisTemplate" > <property name="connectionFactory" ref="connectionFactoryTax" /> <!--如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!! --> <property name="keySerializer" > <bean class="org.springframework.data.redis.serializer.StringRedisSerializer" /> </property> <property name="valueSerializer" > <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer" /> </property> <property name="hashKeySerializer"> <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/> </property> <property name="hashValueSerializer"> <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/> </property> <!--开启事务 --> <property name="enableTransactionSupport" value="false"></property> </bean> <!-- 配置RedisCacheManager --> <bean id="redisCacheManager" class="org.springframework.data.redis.cache.RedisCacheManager"> <constructor-arg name="redisOperations" ref="redisTemplateTax" /> </bean> <cache:annotation-driven cache-manager="redisCacheManager"/>
2. キャッシュ アノテーションの詳細説明 @Cacheable、@CacheEvict、@CachePut
1. @Cacheable の使用法の詳細説明
1. はどこですか使ったの?メソッドまたはクラスで使用されます。
2. これら 2 つの用途の違いは何ですか?
メソッドで使用して、メソッドの戻り値がキャッシュされることを示します
クラスで使用して、クラスのすべてのメソッドがこのアノテーションをサポートしていることを示します
3. 使用後の結果はどうなりますか?次回このメソッドが同じメソッドと同じパラメータを使用して呼び出されるとき、メソッドを再度実行する必要なく、値がキャッシュから直接取得されます。
4. 戻り値はどのようにキャッシュに保存されるのでしょうか?キーと値のペアの形式でキャッシュに保存され、値は戻り値であり、キーはデフォルト ストラテジとカスタム ストラテジの 2 つのストラテジによって生成されます
5. デフォルト ストラテジとデフォルト ストラテジの使用方法は?
デフォルトの戦略: 値の後の二重「::」スプライシング、仮パラメータのリスト、仮パラメータがオブジェクトの場合、JSON 形式を使用:
@CacheConfig(cacheNames="enterprise")//<!-- 声明缓存使用的缓存名称 --> public interface EnterpriseRepo extends JpaRepository<Enterprise, Integer>,JpaSpecificationExecutor<Enterprise>{ @Cacheable(value="cash1") Enterprise findByid(Integer id); @CachePut(value="cash1") Enterprise save(Enterprise enterprise); }
カスタム戦略: Spring を指定するために key 属性が使用されます。キャッシュ メソッドの戻り結果は、対応するキーです。このプロパティは SpringEL 式をサポートします。この属性を指定しない場合、Spring はデフォルトの戦略を使用してキーを生成します。
カスタム戦略とは、Spring の EL 式を通じてキーを指定できることを意味します。ここでの EL 式では、メソッド パラメーターとそれに対応するプロパティを使用できます。メソッドパラメータを使用する場合、「#パラメータ名」または「#pparameterインデックス」を直接使用できます。以下に、パラメータをキーとして使用する例をいくつか示します。
@Cacheable(value="users", key="#id") public User find(Integer id) { return null; } @Cacheable(value="users", key="#p0") public User find(Integer id) { return null; } @Cacheable(value="users", key="#user.id") public User find(User user) { return null; } @Cacheable(value="users", key="#p0.id") public User find(User user) { return null; }
キーとしての上記のメソッド パラメーターに加えて、Spring はキーの生成に使用できるルート オブジェクトも提供します。このルート オブジェクトを通じて、次の情報を取得できます。
ルート オブジェクトのプロパティをキーとして使用する場合は、「#root」を省略することもできます。これは、Spring がデフォルトでルート オブジェクトのプロパティを使用するためです。例:
@Cacheable(value={"users", "xxx"}, key="caches[1].name") public User find(User user) { return null; }
6. 条件属性は、発生の条件を指定します
メソッドの戻り結果のすべてをキャッシュしたくない場合があります。この機能は、condition 属性を通じて実現できます。デフォルトでは、condition 属性は空です。これは、すべての通話状況がキャッシュされることを意味します。その値は SpringEL 式で指定され、true の場合はキャッシュを意味し、false の場合はキャッシュなし、つまりメソッドが呼び出されるたびにメソッドが実行されることを意味します。次の例は、ユーザーの ID が偶数の場合にのみキャッシュが発生することを示しています。
@Cacheable(value={"users"}, key="#user.id", condition="#user.id%2==0") public User find(User user) { System.out.println("find user by user " + user); return user; }
2. @CachePut
Spring Cache をサポートする環境では、@Cacheable アノテーションが付けられたメソッドの場合、Spring は各メソッドの前に、キャッシュ内に同じキーを持つキャッシュ要素があるかどうかを確認します。存在する場合、メソッドは実行されなくなりますが、結果はキャッシュから直接取得されて返されます。それ以外の場合、メソッドは実行され、返された結果は指定されたキャッシュに格納されます。 @CachePut は、キャッシュ機能をサポートするメソッドを宣言することもできます。 @Cacheable との違いは、 @CachePut アノテーションが付けられたメソッドは、実行前に以前に実行された結果がキャッシュにあるかどうかをチェックせず、毎回メソッドが実行され、実行結果が key- の形式で保存されることです。指定されたキャッシュ内の値のペア。
通常、保存および更新メソッドで使用されます。
@CachePut はクラスやメソッドに注釈を付けることもできます。 @CachePut を使用するときに指定できる属性は @Cacheable と同じです。
@CachePut(“users”)//メソッドは毎回実行され、結果は指定されたキャッシュに保存されます
public User find(Integer id) { return null; }
3. @CacheEvict
@CacheEvict は、キャッシュ要素をクリアする必要があるメソッドまたはクラスに注釈を付けるために使用されます。クラスにマークが付けられている場合は、そのクラス内のすべてのメソッドの実行によってキャッシュのクリア操作がトリガーされることを意味します。 @CacheEvict で指定できる属性には、value、key、condition、allEntries、beforeInvocation が含まれます。値、キー、および条件のセマンティクスは、@Cacheable の対応する属性と似ています。つまり、value はクリア操作が行われるキャッシュ (キャッシュの名前に対応) を示します。key はどのキーをクリアする必要があるかを示します。指定しない場合は、デフォルトのポリシーによって生成されたキーが使用されます。condition は条件を示しますクリア操作が発生します。 2 つの新しい属性 allEntries と beforeInvocation を導入しましょう。
1. allEntries 属性
allEntries はブール型で、キャッシュ内のすべての要素をクリアする必要があるかどうかを示します。デフォルトは false で、これは必要ないことを意味します。 allEntries が true に指定されている場合、Spring Cache は指定されたキーを無視します。場合によっては、キャッシュからすべての要素を一度にクリアする必要があります。これは、要素を 1 つずつクリアするよりも効率的です。
@CacheEvict(value="users", allEntries=true) public void delete(Integer id) { System.out.println("delete user by id: " + id); }
2. beforeInvocation 属性
デフォルトでは、対応するメソッドが正常に実行された後にクリア操作がトリガーされます。つまり、メソッドが正常に戻らなかった場合、クリア操作はトリガーされません。例外。 beforeInvocation を使用して、クリア操作がトリガーされる時間を変更できます。このプロパティの値を true に指定すると、Spring はこのメソッドを呼び出す前にキャッシュ内の指定された要素をクリアします。
以上がキャッシュ機構を実装する Spring Redis アノテーションについての詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。