キャッシュは、サービスの応答を高速化する非常に効果的で簡単な方法であると言えます。キャッシュ分野では、Ehcache、Guava、Hazelcastなどの多くの有名なフレームワークがあります。キー価値データベースとして、Redisはその機能により人気のあるデータキャッシュツールにもなりました。
従来の方法では、キャッシュ処理コードは非常に肥大化しています。
たとえば、キャッシュ関数にクエリ関数を追加する必要があります。これには、約3つのステップが必要です。
1.関数が実行される前に、キャッシュにデータがあるかどうかを確認する必要があります。存在する場合は、キャッシュデータを返します。
2。存在しない場合は、データベースデータに照会する必要があります。
3.最後に、データをキャッシュに保存します。次回この関数が呼び出されると、キャッシュされたデータを直接使用してデータベースの圧力を軽減できます。
では、上記の3つのステップを実装するのにどのくらいのコードが必要ですか?これが例です:
上記の写真の赤い部分はすべてテンプレートコードですが、この関数に実際に関連するコードは1/5のみを占めています。キャッシュ関数を実装する必要があるすべての機能には、肥大化したテンプレートコードが必要です。それは非常に不可能な解決策です。
では、どうすれば肥大化したコードを新鮮な時間に戻すことができますか?
AOPはこのテンプレートスタイルのコードの最良のソリューションではありませんか?幸いなことに、セクションを自分で実装する必要はもうありません。 SpringCacheは私たちに良いセクションを提供してくれました。以下のように、元の構成に戻すために簡単な構成を作成するだけです。
注釈を追加するだけです。元のコードを変更する必要さえありません。あなたはそれを試してみたいと思っていますか?
SpringCacheを構成する手順は3つしかありません。
ステップ1:関連する依存関係を追加します:
<Dependency> GroupId> Redis.Clients </groupId> <Artifactid> jedis </artifactid> <version> 2.9.0 </version> </depence> <deplency> springframework.data </groupId> <artifactid> spring-data-redis </artifactid> </> 1.6.0 <Dependency> groupId> org.apache.commons </groupid> <artifactid> commons-lang3 </artifactid> <バージョン> 3.3.2 </version> </dependency>
ステップ2:SpringCache、Redis接続、その他の情報を構成します
ApplicationContext-redis.xml
<?xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns:p = "http://www.springframework.org/schema/p" xmlns:context = "http://www.springframework.org/schema/mvc" xmlns:cache = "http://www.springframework. xsi:schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.2.xsd http://www. http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.2.xsd "> <! - 構成ファイルの読み込み - > <コンテキスト:プロパティホルドロケーション=" CACHE:* cache-manager = "cachemanager" /> <! - redis connection pool-> <bean id = "poolconfig"> <property name = "maxidle" value = "$ {redis.maxidle}" /> <プロパティ名= "maxwaitmillis" value = "" $ {redis.maxwait} " value = "$ {redis.testonborrow}"/> </bean> <! - connection Factory-> <bean id = "jedisconnectionfactory" p:host-name = "$ {redis.host}" p: "$ {redis.port}" p:password = "$ {redis.p:pool-config" "/> <is-ref =テンプレート - > <bean id = "redistemplate"> <プロパティ名= "connectionfactory" ref = "jedisconnectionfactory" /> < /bean> <bean id = "cachemanager"> <プロパティ名= "caches"> <set> < value = "content"/> <! - 名前に対応する名前は、クラスまたは方法の注釈で使用する必要があります - > </bean> </set> </jean> </bean> </beans>Redis.Propertiesファイル:
#redis settings#server ip redis.host = 192.168.100.55#サーバーポートRedis.port = 6379#サーバーパスRedis.pass.pass =#dbindex redis.database = 0 #max idelインスタンスのJedisredis.maxidle = 300 #if #if kermatedis.maxwait = 300 #if Jedisインスタンス、あなたが取得するものはすべて有用です。testonborrow= true
3番目のステップは、キャッシュインターフェイスの実装クラスを作成することです
Springは、キャッシュ用の抽象インターフェイスのみを提供し、インターフェイスを介して関数を呼び出します。特定の実装クラスはないため、特定の操作を自分で実装する必要があります。
上記の構成では、各実装クラスがRedistemplateインスタンスを挿入し、Redistemplateを介してRedisを操作できることがわかります。
パッケージcom.cky.rest.utils; import java.io.serializable; Import org.apache.commons.lang3.serializationutils; Import org.springframework.cache.cache; Import org.springframework.cache.cache.support.simplevaluewrapper; import org.springframework. org.springframework.data.redis.connection.redisconnection; Import org.springframework.data.redis.core.rediscallback; Import org.springframework.data.redis.core.redistemplate; public class rediscache emplements cacheプライベート文字列名; @Override public void clear(){system.out.println( "--------------"); redistemplate.execute(new Rediscallback <String>(){@Override public String doinredis(redisconnection connection)throws dataaccessexception {connection.flushdb(); return "ok";}}); } @Override public void evict(object key){system.out.println( "-----------------");最終文字列keyf = key.toString(); redistemplate.execute(new Rediscallback <long>(){@Override public long doinredis(redisconnection connection)throws dataaccessexception {return connection.del(keyf.getBytes());}}); } @Override public ValueWrapper get(object key){system.out.println( "-------------------"+key.toString());最終文字列keyf = key.toString();オブジェクトオブジェクト= null; object redistemplate.execute(new rediscallback <object>(){@Override public object doinredis(redisconnection connection)dataaccessexception {byte [] keyf.getBytes(); byte [] value = connection.get(key); if(value == null){retuntln out.out.out.out.out.out.out.out.out.Outlintln( serializationutils.deserialize(value)}); valueWrapper obj =(object!= null?new SimpleValueWrapper(object):null); System.out.println( "-----------------------------------------"+obj); OBJを返します。 } @Override public void put(object key、object value){system.out.println( "-------------------"); System.out.println( "key ----:"+key); System.out.println( "key ----:"+value);最終文字列keyString = key.toString();最終オブジェクト値=値;最終的な長いlivetime = 86400; redistemplate.execute(new Rediscallback <long>(){@Override public long doinredis(redisconnection connection)throws data acccessexception {byte [] keyb = keystring.getBytes(); byte [] valueb = serializationutils.serialize((serializable)valuet); set(key) Connection.Expire(keyb、livetime); } @override public <t> t get(object arg0、class <t> arg1){// dodo auto-enerated method stub return null; } @Override public String getName(){return this.name; } @Override public Object getnativecache(){return this.redistemplate; } @Override public ValueWrapper putifabsent(object arg0、object arg1){// dodo auto-enerated method stub return null; } public redistemplate <string、object> getRedistemplate(){return redistemplate; } public void setRedistemplate(redistemplate <string、object> redistemplate){this.redistemplate = redistemplate; } public void setName(string name){this.name = name; }}構成プロセス中に2つのエラーがありました。
1.xxxx.classnotfoundexception最後に、JARのダウンロードが不完全であることがわかりました。 Maven Local Repositoryの対応するJARパッケージフォルダーを削除して、もう一度ダウンロードしてください。
2.xxxx.methodnotfoundexceptionこの状況は間違ったバージョンであり、最初のステップでバージョンに変更するだけです。
Springcacheでの一般的な注釈の使用:
@Cachable Annotation
最も一般的に使用される注釈は、注釈付きメソッドの返品値をキャッシュします。それがどのように機能するか:最初にキャッシュを検索します。メソッドが実行されず、結果がキャッシュされ、次にデータが返されます。この注釈のキャッシュ名は指定する必要があり、キャッシュマネージャーのキャッシュのキャッシュの名前値に対応する必要があります。値またはcachenamesを使用して指定できます。
キー属性が指定されていない場合、Springはデフォルトのプライマリキージェネレーターを使用してプライマリキーを生成します。また、プライマリキーをカスタマイズすることもでき、SPEL式をキーで使用できます。次のように:
@cachable(cachenames =” content”、key =”#user.userid”)public user getuser(user user){xxxxx}次のように、条件属性を使用してキャッシュに条件を追加できます。
@cachable(cachenames =” content”、key =”#user.userid”、condition =”#user.age <40”)public user getuser(user user){xxxxx}@cacheputアノテーション
最初にメソッドを実行してから、戻り値をキャッシュに戻します。キャッシュアップデートとして使用できます。
@Cacheevict Annotation
この注釈は、キャッシュからデータを明示的に削除する責任があります。通常、キャッシュされたデータには有効期限があり、データも有効期限が切れると削除されます。
この注釈には2つの追加属性があります。
Allentriesがすべてのキャッシュエントリを削除するかどうか。
Invocationの前:メソッドが呼び出される前または後に除去操作を完了します。 true/false
上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。