JavaSpringはRedisTemplateを使用してRedisデータベースを操作します

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に格納されていないが、通常の読み取り可能な文字列である場合、たとえば、次のフォーム
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/dcj19980805/article/details/115179473