ホームページ  >  記事  >  データベース  >  Java SpringBoot は Redis をどのように操作しますか?

Java SpringBoot は Redis をどのように操作しますか?

PHPz
PHPz転載
2023-06-03 18:01:45589ブラウズ

    Redis

    1. Redis 依存関係の追加

    spring Boot は Redis 統合用のコンポーネント パッケージを提供します: spring -boot-starter-data-redis、spring-data-redis と lettuce に依存します。

    さらに、ここには 2 つの小さな詳細があります:

    • Spring Boot 1.x 時代では、spring-data-redis の最下層では Jedis が使用されていました。 2.x 時代 レタスに置き換えられました。

    • Lettuce は commons-pool2

    <!-- springboot整合redis--> 
    <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    <!-- 使用 lettuce 时要加这个包;使用 jedis 时则不需要。-->
    <dependency>
      <groupId>org.apache.commons</groupId>
      <artifactId>commons-pool2</artifactId>
    </dependency>

    2 に依存します。設定ファイル

    ## Redis 服务器地址
    spring.redis.host=localhost
    ## Redis 服务器连接端口
    spring.redis.port=6379
    ## Redis 数据库索引(默认为 0)
    spring.redis.database=0
    
    ## 以下非必须,有默认值
    ## Redis 服务器连接密码(默认为空)
    spring.redis.password=
    ## 连接池最大连接数(使用负值表示没有限制)默认 8
    spring.redis.lettuce.pool.max-active=8
    ## 连接池最大阻塞等待时间(使用负值表示没有限制)默认 -1
    spring.redis.lettuce.pool.max-wait=-1
    ## 连接池中的最大空闲连接 默认 8
    spring.redis.lett	uce.pool.max-idle=8
    ## 连接池中的最小空闲连接 默认 0
    spring.redis.lettuce.pool.min-idle=0

    3. 操作 redis API

    この単体テストでは、redisTemplate を使用して文字列 "Hello Redis" を保存します。

    Spring Data Redis は API を再分類してカプセル化し、同じ種類の操作を Operation インターフェイスにカプセル化しました:

    ValueOperations文字列型のデータ操作##ListOperationsSetOperationsZSetOperationsHashOperations##
    //解决中文乱码问题
    @Configuration
    public class RedisConfig {
        
        @Bean
        public RedisTemplate redisTemplateInit(RedisConnectionFactory redisConnectionFactory) {
    
            RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
    
            redisTemplate.setConnectionFactory(redisConnectionFactory);
            //设置序列化Key的实例化对象
            redisTemplate.setKeySerializer(new StringRedisSerializer());
            //设置序列化Value的实例化对象
            redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
    
            /**
             *
             * 设置Hash类型存储时,对象序列化报错解决
             */
            redisTemplate.setHashKeySerializer(new StringRedisSerializer());
            redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
            return redisTemplate;
        }
    }
    4、RedisTemplate および StringRedisTemplate
    独自の操作 説明
    リスト型データ操作
    set 型データ操作
    zset 型データ操作
    マップ型データ操作
    RedisTemplate7dc753a36b631fb07bbc53d69c55f087 は、キーと値の型が String である必要がないため、StringRedisTemplate よりも「強力」に見えます。

    しかし、明らかに、これは Redis の実際の状況に反しています。最小のストレージ ユニット レベルでは、Redis は基本的に文字列のみを保存でき、他の型は保存できません。この観点から見ると、StringRedisTemplate は Redis のストレージの性質により一致しています。 RedisTemplate は値をシリアル化することでどのように任意の型をサポートしますか?

    RedisTemplate を使用してオブジェクトを保存すると、オブジェクトのアドレスが逆シリアル化のために保存され、ストレージ スペースが大幅に浪費されます。この問題を解決するには、手動でのシリアル化と逆シリアル化が必要であることを考慮して StringRedisTemplate を使用してください

     Users users = new Users();
     users.setId(2);
     users.setUsername("李四2");
     redisTemplate.opsForValue().set("user:2", JSON.toJSONString(users)); //存的时候序列化对象
     String u = redisTemplate.opsForValue().get("user:2");  //redis 只能返回字符串
     System.out.println("u="+ JSON.parseObject(u,Users.class));  //使用JSON工具反序化成对象

    spring-boot-starter-web 依存関係が springboot に導入されていない場合は、jackson 依存関係を追加する必要があります。

    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
    </dependency>

    5. SpringBoot は文字列 string

    a. キーの有効期限

    キーの自動有効期限の問題 Redis は各データを保存するときにタイムアウトを設定できます。この時間が経過すると自動的に削除されます。
    一般的に使用される Redis 時間単位

    MINUTES

    : 分

    SECONDS

    : 秒

    DAYS

    : Day

    //给user对象设置10分钟过期时间
    redisTemplate.opsForValue().set("user:1", JSON.toJSONString(users),10,TimeUnit.MINUTES );
    b、データの削除
     //删除键
     redisTemplate.delete(key);
     //判断键是否存在
     boolean exists = redisTemplate.hasKey(key);

    6、SpringBoot はハッシュ (ハッシュ) を操作します
    通常、キーを保存するときは、get を使用すると自然に/set を store に設定するのは実際には良い考えではありません。 Redis にはキーを保存するための最小メモリが必要です。保存するキーがどれほど小さくても、このメモリより少なくなることはありません。したがって、ハッシュを適切に使用すると、メモリを大幅に節約できます。

    	@Test
        public void testHash() {
            String key = "tom";
            HashOperations<String, Object, Object> operations = redisTemplate.opsForHash();
            operations.put(key, "name", "tom");
            operations.put(key, "age", "20");
            String value= (String) operations.get(key,"name");
            System.out.println(value);
        }

    上記のテスト ケースによると、ハッシュの設定中に 3 つのパラメーターを渡す必要があることがわかります。1 つ目はキー、2 つ目はフィールド、3 つ目は格納された値です。一般に、Key はデータの集合を表し、field はキーに関連する属性、value は属性に対応する値を表します。

    7. SpringBoot は List コレクション型を操作します

    Redis List には多くのアプリケーション シナリオがあり、Redis の最も重要なデータ構造の 1 つです。 List を使用してキューを簡単に実装できます。List の典型的なアプリケーション シナリオはメッセージ キューです。List の Push 操作を使用してタスクを List に保存し、ワーカー スレッドが POP 操作を使用してタスクを実行のために取り出します。 。

    /**
         * 测试List
         * leftPush 将数据添加到key对应的现有数据的左边,也就是头部
         * leftPop  取队列最左边数据(从数据库移除)
         * rightPush 将数据添加到key对应的现有数据的右边,也就是尾部
         */
        @Test
        public void testList() {
            final String key = "list";
            ListOperations<String,Object> list = redisTemplate.opsForList();
            list.leftPush(key, "hello");
            list.leftPush(key, "world");
            list.leftPush(key, "goodbye");
          
            Object mete = list.leftPop("list");
            System.out.println("删除的元素是:"+mete); //删除 goodbye 
            String value = (String) list.leftPop(key);
    
            System.out.println(value.toString());
            
            // range(key, 0, 2) 从下标0开始找,找到2下标
            List<Object> values = list.range(key, 0, 2);
            for (Object v : values) {
                System.out.println("list range :" + v);
            }
        }
    }

    Redis List は双方向のリンク リストとして実装されており、逆方向検索とトラバーサルをサポートできるため、操作がより便利になります。ただし、追加のメモリ オーバーヘッドが発生し、送信などの Redis 内の多くの実装が発生します。バッファキューなどにもこのデータ構造が使用されます。

    8. SpringBoot は Set コレクション型を操作します

    Redis Set が提供する外部関数は List に似ています。これはリスト関数です。特別なことは、Set は必要なときに自動的に重複排除できることです。 Set は、データのリストを保存し、重複データを望まない場合に適した選択肢であり、Set は、メンバーが Set コレクションに含まれているかどうかを判断するための重要なインターフェイスを提供しますが、List では提供できません。

     /**
         * 测试Set
         */
        @Test
        public void testSet() {
            final String key = "set";
            SetOperations<String,Object> set = redisTemplate.opsForSet();
            set.add(key, "hello");
            set.add(key, "world");
            set.add(key, "world");
            set.add(key, "goodbye");
            Set<Object> values = set.members(key);
            for (Object v : values) {
                System.out.println("set value :" + v);
            }
           
            Boolean exist = set.isMember(key,"hello") //判断是否存在某个元素
            operations.move("set", "hello", "setcopy"); //把set集合中的hello元素放到setcopy 中
     
        }
    }

    9. SpringBoot は ZSet コレクション タイプを操作します

    Redis ZSet の使用シナリオは Set と似ています。違いは、Set が自動的に順序付けされず、ZSet が追加の優先順位 (スコア) を提供できることです。 ) パラメータを使用してメンバーを並べ替えます。これは挿入順、つまり自動並べ替えです。

    rree

    以上がJava SpringBoot は Redis をどのように操作しますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

    声明:
    この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。