1.Redisとは
Redisは、アクセスパフォーマンスの高い非リレーショナルデータベースです。通常、データベースの通常のストレージの負荷を軽減するためのキャッシュデータベースとして使用されます。
Redisは、キーと5つの異なるデータ構造タイプの間のマッピングを格納できます。5つのデータ構造タイプは、文字列(文字列)、リスト(リスト)、セット(コレクション)、ハッシュ(ハッシュ)、およびZset(順序付き)です。
これらの5つのデータ構造タイプの簡単な紹介は次のとおりです。
2.RedisTemplateと関連メソッド
1. RedisTemplate
Springは、Redisでさまざまな操作を実行するためにRedisTemplateオブジェクトをカプセル化し、すべてのRedisネイティブAPIをサポートします。RedisTemplateは、spring-data-redisパッケージの下にあります。RedisTemplateは、さまざまなredis操作、例外処理とシリアル化を提供し、パブリッシュとサブスクライブをサポートし、Spring3.1キャッシュを実装します。RedisTemplateは、さまざまなredis操作、例外処理とシリアル化を提供し、パブリッシュとサブスクライブをサポートし、Spring3.1キャッシュを実装します。RedisTemplateは、さまざまなredis操作、例外処理とシリアル化を提供し、パブリッシュとサブスクライブをサポートし、Spring3.1キャッシュを実装します。RedisTemplateは、さまざまなredis操作、例外処理、シリアル化を提供し、パブリッシュとサブスクライブをサポートし、Spring3.1キャッシュを実装します。
RedisTemplateは、キーと値の両方が汎用であるテンプレートクラスであることに注意してください。通常、キーは、RedisTemplate <String、Object>のようにString型です。
さらに、特別な状況がない場合は、RedisTemplate <Object、Object>として定義しないでください。定義しないと、Richter置換原則に従って使用したときにタイプエラーが発生します。
spring-data-redisは、jedisに次の関数を提供します
。1。自動接続プール管理。高度にカプセル化された「RedisTemplate」クラスを提供し
ます。2。jedisクライアントで多数のAPIを分類およびカプセル化し、Operationと同じタイプの操作をカプセル化します。インターフェイス
ValueOperations:単純なKV操作
SetOperations:set类型数据操作
ZSetOperations:zset类型数据操作
HashOperations:针对map类型的数据操作
ListOperations:针对list类型的数据操作
```
2.RedisTemplate中定义了对5种数据结构操作
```c
redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set
opsForXXX和boundXXXOps的区别?
XXXは値のタイプです。前者は演算子を取得しますが、操作オブジェクト(キー)を指定せず、接続内で複数のキーと対応する値を操作できます(トランザクション)。後者は指定された操作オブジェクト(キー)を取得します。 )演算子は、接続(トランザクション)内でこのキーに対応する値のみを操作できます。
カウントAPI(インクリメント)にバグがあるため、注意が必要です。インクリメントをカウントした後、getメソッドでカウント値を取得すると、EOF例外がスローされる場合があります(ローカルjdkおよびredisコンパイル済みバージョン)。boundValueOps(key).get(0、-1)を使用してカウント値を取得することを検討してください。
3.Redisデータベースを操作するRedisTemplateの具体例
1.値型操作:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml")
public class TestValue {
@Autowired
private RedisTemplate redisTemplate;
@Test
public void setValue(){
//存值,针对值类型,ops相当于options
redisTemplate.boundValueOps("name").set("itcast");
}
@Test
public void getValue(){
String str = (String) redisTemplate.boundValueOps("name").get();
System.out.println(str);
}
@Test
public void deleteValue(){
redisTemplate.delete("name");
}
}
2.セットタイプ操作のセットタイプは順序付けられていません。つまり、アクセスシーケンスは必ずしも同じではありません。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:spring/applicationContext-redis.xml")
public class TestSet {
@Autowired
private RedisTemplate redisTemplate;
/**
* 存入值
*/
@Test
public void setValue(){
redisTemplate.boundSetOps("nameset").add("曹操");
redisTemplate.boundSetOps("nameset").add("刘备");
redisTemplate.boundSetOps("nameset").add("孙权");
}
/**
* 提取值
*/
@Test
public void getValue(){
Set members = redisTemplate.boundSetOps("nameset").members();
System.out.println(members);
}
/**
* 删除集合中的某一个值
*/
@Test
public void deleteValue(){
redisTemplate.boundSetOps("nameset").remove("孙权");
}
/**
* 删除整个集合
*/
@Test
public void deleteAllValue(){
redisTemplate.delete("nameset");
}
}
出力結果:[孫権、劉備、曹操]、さらに、セットタイプの要素を繰り返すことはできません。セットに値がない場合は、[]
3。リスト型操作を返します。
リストタイプは2つのタイプに分けられます。1つは左プッシュスタックで、もう1つは右プッシュスタックです。
スタックを右に押します:
/**
* 右压栈:后添加的对象排在后边,相当于队列,相当于先进先出
*/
@Test
public void testSetValue1(){
redisTemplate.boundListOps("namelist1").rightPush("刘备");
redisTemplate.boundListOps("namelist1").rightPush("关羽");
redisTemplate.boundListOps("namelist1").rightPush("张飞");
}
/**
* 显示右压栈集合,range 表示查询的索引,从第几个查到第几个,如果想查询所有的数的话只能将第二个数写得大一点。
*/
@Test
public void testGetValue1(){
List list = redisTemplate.boundListOps("namelist1").range(0, 10);
System.out.println(list);
}
実行結果:[劉備、関羽、張飛]、要素を繰り返すことができます
スタックを左に押します:
/**
* 左压栈:后添加的对象排在前边,相当于栈,先进后出
*/
@Test
public void testSetValue2(){
redisTemplate.boundListOps("namelist2").leftPush("刘备");
redisTemplate.boundListOps("namelist2").leftPush("关羽");
redisTemplate.boundListOps("namelist2").leftPush("张飞");
}
/**
* 显示左压栈集合
*/
@Test
public void testGetValue2(){
List list = redisTemplate.boundListOps("namelist2").range(0, 10);
System.out.println(list);
}
実行結果:[張飛、関羽、劉備]
インデックスに基づくクエリ要素
/**
* 查询集合某个元素
*/
@Test
public void testSearchByIndex(){
String s = (String) redisTemplate.boundListOps("namelist1").index(1);
System.out.println(s);
}
演算結果:インデックスが1の要素の値を返し、要素を削除します
/**
* 移除集合某个元素,其中remove中第一个参数是移除的个数
*/
@Test
public void testRemoveByIndex(){
redisTemplate.boundListOps("namelist1").remove(1, "关羽");
}
これは「関羽」を取り除くことを意味します。
4.ハッシュ型操作
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/applicationContext-redis.xml")
public class TestHash {
@Autowired
private RedisTemplate redisTemplate;
// 存值
@Test
public void testSetValue() {
redisTemplate.boundHashOps("namehash").put("a", "唐僧");
redisTemplate.boundHashOps("namehash").put("b", "悟空");
redisTemplate.boundHashOps("namehash").put("c", "八戒");
redisTemplate.boundHashOps("namehash").put("d", "沙僧");
}
//获取所有的key
@Test
public void testGetKeys() {
Set s = redisTemplate.boundHashOps("namehash").keys();
System.out.println(s);
}
// 获取所有的value
@Test
public void testGetValues() {
List values = redisTemplate.boundHashOps("namehash").values();
System.out.println(values);
}
// 根据key获取值
@Test
public void testGetValueByKey() {
Object object = redisTemplate.boundHashOps("namehash").get("b");
System.out.println(object);
}
//根据key移除值
@Test
public void testRemoveValueByKey() {
redisTemplate.boundHashOps("namehash").delete("c");
}
}
4.RedisTemplateとStringRedisTemplateの違い
2つの関係は、StringRedisTemplateがRedisTemplateを継承することです。
2つのデータは一般的ではありません。つまり、StringRedisTemplateはStringRedisTemplateのデータのみを管理でき、RedisTemplateはRedisTemplateのデータのみを管理できます。
SDRでデフォルトで採用されているシリアル化戦略は2つあり、1つはStringのシリアル化戦略であり、もう1つはJDKのシリアル化戦略です。
StringRedisTemplateはデフォルトで文字列シリアル化戦略を採用しており、保存されたキーと値はこの戦略を使用してシリアル化および保存されます。
RedisTemplateはデフォルトでJDKシリアル化戦略を使用し、保存されたキーと値はこの戦略を使用してシリアル化および保存されます。
RedisTemplateで使用されるシーケンスクラスはデータの操作にあります。たとえば、データが格納されると、データはバイト配列にシリアル化されてからRedisデータベースに格納されます。このとき、Redisを開いて表示すると、データがにないことがわかります。読み取り可能な形式で表示されますが、次のようなバイト配列で表示されます。
もちろん、Redisからデータを取得する場合、デフォルトでデータはバイト配列として変換されます。これにより問題が発生します。取得する必要のあるデータがバイト配列としてredisに格納されていないが、通常の読み取り可能な文字列である場合、たとえば、次のフォーム