1. ホーム
  2. Redis

RedisTemplateでRedisを操作する、この記事で十分です(a)

2022-02-20 15:56:32
<パス

RedisTemplateでRedisを操作する、この記事一本で十分です(a)
StringRedisTemplateとRedisTemplateの違い(II)
StringRedisTemplateの小さな例(III)


記事の目次


I. SpringDataRedis の紹介

1. レディス

redisはメモリ上で動作するオープンソースのKey-Valueデータベースで、C言語で書かれています。エンタープライズ開発では、キャッシュを実装するためにRedisがよく使われます。類似の製品として、memcache、memcachedなどがあります。

2. ジェダイ

JedisはRedisの公式のJava指向クライアントで、Java言語が呼び出すための多くのインターフェイスを提供しています。Redisのウェブサイトからダウンロードできますが、Jredis、SRPなどのクライアントを提供しているオープンソースの愛好家もいます。Jedisをお勧めします。

3. Spring データ Redis

Spring-data-redisはspringファミリーの一部で、簡単な設定によりsrpingアプリケーションでredisサービスへのアクセスを提供します。基盤となるredis開発パッケージ(Jedis、JRedis、RJC)に高度にカプセル化されており、RedisTemplateはredis操作、例外処理、シリアライズ、リリースサブスクリプションのサポートが提供されます。RedisTemplateは、様々なredis操作、例外処理とシリアライゼーション、パブリッシュ・サブスクライブのサポート、spring3.1キャッシュの実装を提供します。
spring-data-redis は jedis に対して以下の機能を提供します。

  1. 高度にカプセル化されたRedisTemplateクラスによる自動接続プール管理。
  2. jedisクライアントの多数のapiを分類し、同じ種類の操作を操作インターフェースにカプセル化する
  • ValueOperations:単純なK-V演算
  • SetOperations:セット型データ操作
  • ZSetOperations:Zsetタイプのデータ操作
  • HashOperations: map 型のデータに対する操作
  • ListOperations:リスト型のデータに対する操作
  1. キー操作のための "bound"(バインド)APIを提供します。指定したキーをboundでカプセル化し、再度キーを明示的に指定しなくても一連の操作を実行できる、すなわちBoundKeyOperationsを提供します。
  • BoundValueOperations(バウンドバリューオペレーション
  • BoundSetOperations
  • BoundListOperations
  • BoundSetOperations
  • BoundHashOperations
  1. トランザクション操作をコンテナ制御でラッピングします。
  2. データのシリアライズ/デシリアライズのための複数のオプションストラテジーを提供する(RedisSerializer)

JdkSerializationRedisSerializerです。 POJOオブジェクトのアクセスシナリオは、JDK自体のシリアライゼーション機構を使用して、シリアライズ操作のためのObjectInputStream / ObjectOutputStreamを介してpojoクラスは、最終的にredis -サーバーは、バイトシーケンスを格納します。これは、はるかに最も一般的なシリアライズ戦略です。

StringRedisSerializerです。 キーまたは値が文字列の場合、データのバイト列を指定された charset に従って文字列にエンコードします。これは "new String(bytes, charset)" および "string.getBytes( charset)" の直接的なラッパーです。これは、最も軽量で効率的な方法です。

JacksonJsonRedisSerializerです。 jackson-json ツールは、redis に保存するために pojo インスタンスを json 形式にシリアライズしたり、json 形式のデータを pojo インスタンスに変換するために、javabean と json 間の変換機能を提供します。jacksonツールはシリアライズとデシリアライズの際にClassタイプを明示的に指定する必要があるため、この戦略はカプセル化が若干複雑になります。[jackson-mapper-aslツールのサポートが必要です。

II. RedisTemplateでAPIを使用する

1. pom.xml の依存関係

<! --Redis-->

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

# Redis server connection port
spring.redis.port=6379
# Redis server address
spring.redis.host=127.0.0.1
# Redis database index (default is 0)
spring.redis.database=0
# Redis server connection password (default is empty)
spring.redis.password=
# Maximum number of connections to the connection pool (use negative values to indicate no limit)
spring.redis.jedis.pool.max-active=8
# Maximum connection pool blocking wait time (use negative values to indicate no limit)
spring.redis.jedis.pool.max-wait=-1ms
# The maximum idle connections in the connection pool
spring.redis.jedis.pool.max-idle=8
# The minimum idle connections in the connection pool
spring.redis.jedis.pool.min-idle=0
# Connection timeout (milliseconds)
spring.redis.timeout=5000ms


2. 設定ファイル

@Autowired
private RedisTemplate redisTemplate;


3. RedisTemplateのダイレクトメソッド

まず@Autowiredを使ってRedisTemplateをインジェクトします(後で直接使うので特に指示はありません)

// Delete key
public void delete(String key){
    redisTemplate.delete(key);
}


1. キーを1つ削除する

// Delete multiple keys
public void deleteKey (String ... . keys){
    redisTemplate.delete(keys);
}


2. 複数キーの削除

// Specify the expiration time of the key
public void expire(String key,long time){
    redisTemplate.expire(key,time,TimeUnit.MINUTES);
}


3. 鍵の有効期限を指定する

// Get the expiration time according to the key
public long getExpire(String key){
    Long expire = redisTemplate.getExpire(key);
    return expire;
}


4. キーに基づき有効期限を取得する

// Determine if the key exists or not
public boolean hasKey(String key){
    return redisTemplate.hasKey(key);
}

//1, set the value via redisTemplate
redisTemplate.boundValueOps("StringKey").set("StringValue");
redisTemplate.boundValueOps("StringKey").set("StringValue",1, TimeUnit.MINUTES);

//2. Set the value by BoundValueOperations
BoundValueOperations stringKey = redisTemplate.boundValueOps("StringKey");
stringKey.set("StringVaule");
stringKey.set("StringValue",1, TimeUnit.MINUTES);

//3. Set the value by ValueOperations
ValueOperations ops = redisTemplate.opsForValue();
ops.set("StringKey", "StringVaule");
ops.set("StringValue","StringVaule",1, TimeUnit.MINUTES);

redisTemplate.boundValueOps("StringKey").expire(1,TimeUnit.MINUTES);
redisTemplate.expire("StringKey",1,TimeUnit.MINUTES);

//1, set the value via redisTemplate
String str1 = (String) redisTemplate.boundValueOps("StringKey").get();

//2. Get the value by BoundValueOperations
BoundValueOperations stringKey = redisTemplate.boundValueOps("StringKey");
String str2 = (String) stringKey.get();

//3. Get the value by ValueOperations
ValueOperations ops = redisTemplate.opsForValue();
String str3 = (String) ops.get("StringKey");

Boolean result = redisTemplate.delete("StringKey");

redisTemplate.boundValueOps("StringKey").increment(3L);

redisTemplate.boundValueOps("StringKey").increment(-3L);

//1. Set the value via redisTemplate
redisTemplate.boundHashOps("HashKey").put("SmallKey", "HashVaue");

//2. Set the value by BoundValueOperations
BoundHashOperations hashKey = redisTemplate.boundHashOps("HashKey");
hashKey.put("SmallKey", "HashVaue");

//3. Set the value by ValueOperations
HashOperations hashOps = redisTemplate.opsForHash();
hashOps.put("HashKey", "SmallKey", "HashVaue");

redisTemplate.boundValueOps("HashKey").expire(1,TimeUnit.MINUTES);
redisTemplate.expire("HashKey",1,TimeUnit.MINUTES);

HashMap
4), set expiration time (set separately)
redisTemplate.boundValueOps("HashKey").expire(1,TimeUnit.MINUTES);
redisTemplate.expire("HashKey",1,TimeUnit.MINUTES);

5), extract all small keys
//1. Get the values via redisTemplate
Set keys1 = redisTemplate.boundHashOps("HashKey").keys();

//2. Get the value by BoundValueOperations
BoundHashOperations hashKey = redisTemplate.boundHashOps("HashKey");
Set keys2 = hashKey.keys();

//3. Get the value by ValueOperations
HashOperations hashOps = redisTemplate.opsForHash();
Set keys3 = hashOps.keys("HashKey");

6), extract all value values
//1. Get the values via redisTemplate
List values1 = redisTemplate.boundHashOps("HashKey").values();

//2. Get the values by BoundValueOperations
BoundHashOperations hashKey = redisTemplate.boundHashOps("HashKey");
List values2 = hashKey.values();

//3. Get the values by ValueOperations
HashOperations hashOps = redisTemplate.opsForHash();
List values3 = hashOps.values("HashKey");

7), extract value value based on key
//1, get by redisTemplate
String value1 = (String) redisTemplate.boundHashOps("HashKey").get("SmallKey");

//2. Get the value by BoundValueOperations
BoundHashOperations hashKey = redisTemplate.boundHashOps("HashKey");
String value2 = (String) hashKey.get("SmallKey");

//3. Get the value by ValueOperations
HashOperations hashOps = redisTemplate.opsForHash();
String value3 = (String) hashOps.get("HashKey", "SmallKey");

8), Get all the key-value pairs collection
//1. Get via redisTemplate
Map entries = redisTemplate.boundHashOps("HashKey").entries();

//2. Get the value by BoundValueOperations
BoundHashOperations hashKey = redisTemplate.boundHashOps("HashKey");
Map entries1 = hashKey.entries();

//3. Get the value by ValueOperations
HashOperations hashOps = redisTemplate.opsForHash();
Map entries2 = hashOps.entries("HashKey");

9), Delete
//delete small key
redisTemplate.boundHashOps("HashKey").delete("SmallKey");
//delete the large key
redisTemplate.delete("HashKey");

10), determine if the value is in the Hash
Boolean isEmpty = redisTemplate.boundHashOps("HashKey").hasKey("SmallKey");

6、Set type related operations
1), add Set cache (value can be one or more) (2/3 is a recursive value of 1)
//1. Set the value via redisTemplate
redisTemplate.boundSetOps("setKey").add("setValue1", "setValue2", "setValue3");

//2. Set the value by BoundValueOperations
BoundSetOperations setKey = redisTemplate.boundSetOps("setKey");
setKey.add("setValue1", "setValue2", "setValue3");

//3. Set values by ValueOperations
SetOperations setOps = redisTemplate.opsForSet();
setOps.add("setKey", "SetValue1", "setValue2", "setValue3");

2), set expiration time (set separately)
redisTemplate.boundValueOps("setKey").expire(1,TimeUnit.MINUTES);
redisTemplate.expire("setKey",1,TimeUnit.MINUTES);

3) Get all values in Set based on key
//1. Get the values via redisTemplate
Set set1 = redisTemplate.boundSetOps("setKey").members();

//2. Get the value through BoundValueOperations
BoundSetOperations setKey = redisTemplate.boundSetOps("setKey");
Set set2 = setKey.members();

//3. Get the value through ValueOperations
SetOperations setOps = redisTemplate.opsForSet();
Set set3 = setOps.members("setKey");

4), query from a set based on value, whether it exists
Boolean isEmpty = redisTemplate.boundSetOps("setKey").isMember("setValue2");

5), Get the length of the Set cache
Long size = redisTemplate.boundSetOps("setKey").size();

6), Remove the specified element
Long result1 = redisTemplate.boundSetOps("setKey").remove("setValue1");

7), remove the specified key
Boolean result2 = redisTemplate.delete("setKey");

7. LIST type related operations
1), add cache (2/3 is a recursive value of 1)
//1. Set the value via redisTemplate
redisTemplate.boundListOps("listKey").leftPush("listLeftValue1");
redisTemplate.boundListOps("listKey").rightPush("listRightValue2");

//2. Set the value by BoundValueOperations
BoundListOperations listKey = redisTemplate.boundListOps("listKey");
listKey.leftPush("listLeftValue3");
listKey.rightPush("listRightValue4");

//3. Set values by ValueOperations
ListOperations opsList = redisTemplate.opsForList();
opsList.leftPush("listKey", "listLeftValue5");
opsList.rightPush("listKey", "listRightValue6");


2), put List into cache
ArrayList
 list = new ArrayList<>();
redisTemplate.boundListOps("listKey").rightPushAll(list);
redisTemplate.boundListOps("listKey").leftPushAll(list);

3), set expiration time (set separately)
redisTemplate.boundValueOps("listKey").expire(1,TimeUnit.MINUTES);
redisTemplate.expire("listKey",1,TimeUnit.MINUTES);

4), get all contents of List cache (start index, end index)
List listKey1 = redisTemplate.boundListOps("listKey").range(0, 10); 

5), pop up an element from the left or from the right
String listKey2 = (String) redisTemplate.boundListOps("listKey").leftPop(); //pop an element from the left
String listKey3 = (String) redisTemplate.boundListOps("listKey").rightPop(); //pop an element from the right side

6), query elements by index
String listKey4 = (String) redisTemplate.boundListOps("listKey").index(1);

7), Get the length of the List cache
Long size = redisTemplate.boundListOps("listKey").size();

8), modify a data in List according to index (key, index, value)
redisTemplate.boundListOps("listKey").set(3L,"listLeftValue3");

9), remove N values as value(key,remove number,value)
redisTemplate.boundListOps("listKey").remove(3L,"value");

8. Related operations of Zset type
1), insert elements into the set and set the score
//1. Set the value via redisTemplate
redisTemplate.boundZSetOps("zSetKey").add("zSetVaule", 100D);

//2. Set the value by BoundValueOperations
BoundZSetOperations zSetKey = redisTemplate.boundZSetOps("zSetKey");
zSetKey.add("zSetVaule", 100D);

//3. Set the value by ValueOperations
ZSetOperations zSetOps = redisTemplate.opsForZSet();
zSetOps.add("zSetKey", "zSetVaule", 100D);

2) Insert multiple elements into the collection, and set the score
DefaultTypedTuple
 p1 = new DefaultTypedTuple<>("zSetVaule1", 2.1D);
DefaultTypedTuple
 p2 = new DefaultTypedTuple<>("zSetVaule2", 3.3D);
redisTemplate.boundZSetOps("zSetKey").add(new HashSet<>(Arrays.asList(p1,p2)));

3) Print the elements in the specified interval in order of ranking (from smallest to largest), -1 is to print all
Set
 range = redisTemplate.boundZSetOps("zSetKey").range(0, -1);

4), Get the score of the specified element
Double score = redisTemplate.boundZSetOps("zSetKey").score("zSetVaule");

5), return the number of members in the collection
Long size = redisTemplate.boundZSetOps("zSetKey").size();

6), return the number of members of the specified range of scores in the collection (Double type)
Long COUNT = redisTemplate.boundZSetOps("zSetKey").count(0D, 2.2D);

7), return the ranking of the elements in the set within the specified score range (from smallest to largest)
Set byScore = redisTemplate.boundZSetOps("zSetKey").rangeByScore(0D, 2.2D);

8), with offset and number, (key, starting score, max score, offset, number)
Set
 ranking2 = redisTemplate.opsForZSet().rangeByScore("zSetKey", 0D, 2.2D 1, 3);

9), return the ranking of the elements in the collection, and the score (from smallest to largest)
Set
>
 tuples = redisTemplate.boundZSetOps("zSetKey").rangeWithScores(0L, 3L);
  for (TypedTuple
 tuple : tuples) {
      System.out.println(tuples.getValue() + " : " + tuple.getScore());
  }ss

10), return the ranking of the specified member
//from smallest to largest
Long startRank = redisTemplate.boundZSetOps("zSetKey").rank("zSetVaule");
//from largest to smallest
Long endRank = redisTemplate.boundZSetOps("zSetKey").reverseRank("zSetVaule");

11), Delete the specified element from the collection
redisTemplate.boundZSetOps("zSetKey").remove("zSetVaule");

12), Delete the elements of the specified index range (Long type)
redisTemplate.boundZSetOps("zSetKey").removeRange(0L,3L);

13), Delete elements in the specified fraction range (Double type)
redisTemplate.boundZSetOps("zSetKey").removeRangeByScorssse(0D,2.2D);


14), add points to the specified element (Double type)
Double score = redisTemplate.boundZSetOps("zSetKey").incrementScore("zSetVaule",1.1D);


5. キーが存在するかどうかを判断する

redisTemplate.boundValueOps("HashKey").expire(1,TimeUnit.MINUTES);
redisTemplate.expire("HashKey",1,TimeUnit.MINUTES);


4. 文字列型関連操作

1)、キャッシュの追加(2/3は1の再帰的値)
//1. Get the values via redisTemplate
Set keys1 = redisTemplate.boundHashOps("HashKey").keys();

//2. Get the value by BoundValueOperations
BoundHashOperations hashKey = redisTemplate.boundHashOps("HashKey");
Set keys2 = hashKey.keys();

//3. Get the value by ValueOperations
HashOperations hashOps = redisTemplate.opsForHash();
Set keys3 = hashOps.keys("HashKey");


2)、有効期限を設定(別途設定)
//1. Get the values via redisTemplate
List values1 = redisTemplate.boundHashOps("HashKey").values();

//2. Get the values by BoundValueOperations
BoundHashOperations hashKey = redisTemplate.boundHashOps("HashKey");
List values2 = hashKey.values();

//3. Get the values by ValueOperations
HashOperations hashOps = redisTemplate.opsForHash();
List values3 = hashOps.values("HashKey");


3)、キャッシュされた値を取得する(2/3は1の再帰的な値です)
//1, get by redisTemplate
String value1 = (String) redisTemplate.boundHashOps("HashKey").get("SmallKey");

//2. Get the value by BoundValueOperations
BoundHashOperations hashKey = redisTemplate.boundHashOps("HashKey");
String value2 = (String) hashKey.get("SmallKey");

//3. Get the value by ValueOperations
HashOperations hashOps = redisTemplate.opsForHash();
String value3 = (String) hashOps.get("HashKey", "SmallKey");


4)、削除キー
//1. Get via redisTemplate
Map entries = redisTemplate.boundHashOps("HashKey").entries();

//2. Get the value by BoundValueOperations
BoundHashOperations hashKey = redisTemplate.boundHashOps("HashKey");
Map entries1 = hashKey.entries();

//3. Get the value by ValueOperations
HashOperations hashOps = redisTemplate.opsForHash();
Map entries2 = hashOps.entries("HashKey");


5)、シーケンシャルインクリメンタル
//delete small key
redisTemplate.boundHashOps("HashKey").delete("SmallKey");
//delete the large key
redisTemplate.delete("HashKey");


6), 順番が下がる
Boolean isEmpty = redisTemplate.boundHashOps("HashKey").hasKey("SmallKey");


5. ハッシュ型関連操作

1)、キャッシュの追加(2/3は1の再帰的値)
//1. Set the value via redisTemplate
redisTemplate.boundSetOps("setKey").add("setValue1", "setValue2", "setValue3");

//2. Set the value by BoundValueOperations
BoundSetOperations setKey = redisTemplate.boundSetOps("setKey");
setKey.add("setValue1", "setValue2", "setValue3");

//3. Set values by ValueOperations
SetOperations setOps = redisTemplate.opsForSet();
setOps.add("setKey", "SetValue1", "setValue2", "setValue3");


2)、有効期限を設定(別途設定)
redisTemplate.boundValueOps("setKey").expire(1,TimeUnit.MINUTES);
redisTemplate.expire("setKey",1,TimeUnit.MINUTES);


3)、Mapコレクションを追加する
//1. Get the values via redisTemplate
Set set1 = redisTemplate.boundSetOps("setKey").members();

//2. Get the value through BoundValueOperations
BoundSetOperations setKey = redisTemplate.boundSetOps("setKey");
Set set2 = setKey.members();

//3. Get the value through ValueOperations
SetOperations setOps = redisTemplate.opsForSet();
Set set3 = setOps.members("setKey");

Boolean isEmpty = redisTemplate.boundSetOps("setKey").isMember("setValue2");