JavaではJedisが基本的に使われています。

8426 ワード

前ではRedisコマンドラインクライアントredis-cliの使用を学びました。次に、RedisがJavaプログラミング言語に基づくクライアントを調べます。
Java言語システムでは、3つのよく使用されるRedisクライアントJedisRedissonLettuceがある。三つの特徴があります。それぞれの場面があります。
Java Redis客户端
  • Jedis:RedisのJavaによって実現されるクライアントは、APIがより包括的なRedisコマンドのサポートを提供する。
  • Jedisにおける方法呼び出しは、比較的低い層の露出されたRedisのAPI、すなわちJedisにおけるJava方法の基本とRedisのAPIと一致しています。RedisのAPIを知ることで、Jedisを上手に使うことができます。
  • Redisson:分散型および拡張可能なJavaデータ構造を実現し、多くの分散型関連サービスを提供しています。例えば、分散型ロック、分散型セットは、Redisによって遅延キューをサポートすることができます。Jedisと比較して、機能は比較的簡単で、文字列の操作をサポートしないで、並べ替え、事務、パイプ、パーティションなどのRedis特性をサポートしません。Redissonは、利用者のRedisに対する関心分離を促進することを目的としており、利用者がより集中的に業務処理ロジックに注力することができるようにする。
  • Redissonにおける方法は、比較的高い抽象化を行うことであり、各方法の呼び出しは、1つまたは複数のRedis方法の呼び出しを行うことができる。
  • Lettuce:スレッドセキュリティ同期、非同期、応答使用のための上位Redisクライアントは、クラスタ、Sentinel、パイプライン、エンコーダをサポートする。Spring Boot 2.xバージョンのデフォルトのクライアントです。
  • はい、私達はJedisの使用を学び始めましょう。
    1、Jedisの基本使用
    Mavenプロジェクトを作成し、プロジェクトにJedis依存を追加します。
    
       <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>2.8.2</version>
            </dependency>
    Jedisの使い方はとても簡単です。3行のコードで基本的なset/get機能を実現できます。
    
            //1.    Jedis  ,         Redis      
            Jedis jedis = new Jedis("127.0.0.1", 6379);
            // 2.jedis  set  
            jedis.set("hello", "world");
            //3.jedis  get  ,value="world"
            String value = jedis.get("hello");
    
    Jedisを初期化するには、2つのパラメータが必要です。RedisのインスタンスのIPとポートは、これらの2つのパラメータに加えて、もう1つは4つのパラメータを含む構造関数が一般的です。
    
    Jedis(final String host, final int port, final int connectionTimeout, final int soTimeout)
    パラメータの説明:
  • host:Redisの例があるマシンのIP
  • ポート:Redisの例
  • connection Timeout:クライアント接続タイムアウト
  • soTimeout:クライアント読み書きタイムアウト
  • 上記のプログラムの結果をプリントアウトできます。
    运行结果
    JDBCと似ていますが、このようなネットワークI/Oの操作に関しては、try catch finallyの形式を使って、上の例を少し修正したほうがいいです。
    
            Jedis jedis = null;
            try {
                jedis = new Jedis("127.0.0.1", 6379);
                jedis.get("hello");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (jedis != null) {
                    jedis.close();
                }
            }
    
    次に、Jedisの各種基本データの種類に対する操作を見ます。
    文字列
    
            jedis.set("hello", "world");
            //   world
            System.out.println(jedis.get("hello"));
           //   1
            System.out.println(jedis.incr("counter"));
    
    sh
    
            jedis.hset("myhash", "f1", "v1");
            jedis.hset("myhash", "f2", "v2");
            //     {f2=v2, f1=v1}
            System.out.println(jedis.hgetAll("myhash"));
    
    リスト
    
            jedis.rpush("mylist", "1");
            jedis.rpush("mylist", "2");
            jedis.rpush("mylist", "3");
            //     [1, 2, 3]
            System.out.println(jedis.lrange("mylist",0,-1));
    
    セット
    
            jedis.sadd("myset", "a");
            jedis.sadd("myset", "b");
            jedis.sadd("myset", "a");
            //     [b, a]
            System.out.println(jedis.smembers("myset"));
    
    zset
    
            Jedis jedis = new Jedis("127.0.0.1", 6379);
            jedis.zadd("thezset", 99, "tom");
            jedis.zadd("thezset", 66, "peter");
            jedis.zadd("thezset", 33, "james");
            //     james 33.0 peter 66.0 tom 99.0
            jedis.zrangeWithScores("thezset",0,-1).stream().forEach(s->{
                System.out.print(s.getElement()+" "+s.getScore()+" ");
            });
    
    2、プロローグ
    Javaでは、保存対象は一般的に序列化と逆順序化されますが、Jedis自体は序列化をサポートしていません。XML、Json、GoogleのProtobuf、FacebookのThriftなど、ゲーム額の第三者のプログレッシブツールを導入することができます。
    私たちはプロスタフ(ProtobufのJavaクライアント)を例にとって学習を行います。
    プロトスタフ依存を導入する
    
       <properties>
            <protostuff.version>1.0.11</protostuff.version>
        </properties>
        
            <dependency>
                <groupId>com.dyuproject.protostuff</groupId>
                <artifactId>protostuff-runtime</artifactId>
                <version>${protostuff.version}</version>
            </dependency>
            <dependency>
                <groupId>com.dyuproject.protostuff</groupId>
                <artifactId>protostuff-core</artifactId>
                <version>${protostuff.version}</version>
            </dependency>    
    
    エンティティクラスを定義
    
    public class Club implements Serializable {
        private int id; // id
        private String name; //   
        private String info; //   
        private Date createDate; //     
        private int rank; //   
        //  getter/setter 
    }    
    
    プロローグとアンチプロローグをテストします。
    
            // 1.        
            ProtostuffSerializer protostuffSerializer = new ProtostuffSerializer();
            // 2.  Jedis  
            Jedis jedis = new Jedis("127.0.0.1", 6379);
            // 3.   
            String key = "club:1";
            //       
            Club club = new Club(1, "AC", "  ", new Date(), 1);
            //    
            byte[] clubBtyes = protostuffSerializer.serialize(club);
            jedis.set(key.getBytes(), clubBtyes);
            // 4.    
            byte[] resultBtyes = jedis.get(key.getBytes());
            Club resultClub = protostuffSerializer.deserialize(resultBtyes);
            //   Club{id=1, name='AC', info='  ', createDate=Sat May 15 22:21:42 CST 2021, rank=1}
            System.out.println(resultClub.toString());
    
    3、Jedis接続池
    上で私達が使っているのはJedisの直結方式です。毎回TCP接続を新設して、使ってから接続を切断します。
    このような頻繁な接続/切断の過程は明らかに資源に対する浪費である。
    Jedis直连Redis
    データベース接続池と同様に池化技術を導入して、Jedisをプールに接続して、毎回池に取りに行きます。再作成しなくてもいいです。
    Jedis连接池使用
    接続池の方式はJedis接続を初期化しておくことができるので、毎回Jedis接続池から借りるだけでいいです。借用と返却操作は現地で行われています。少量の合併同期オーバーヘッドだけが、新規TCP接続のオーバーヘッドよりはるかに小さいです。
    JedisはJedis Poolという種類を提供しています。Jedisに対する接続池として、Apacheの共通の対象プールツールcommon-poolを資源の管理ツールとして使用しています。
    JedisPoolを使用したRedisの例は以下の通りである。
    1)Jedis接続池(通常はJedisPoolは一例):
    
            // common-pool     ,        
            GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
            //    Jedis   
            JedisPool jedisPool = new JedisPool(poolConfig, "127.0.0.1", 6379);
    
    2)Jedisオブジェクトの取得は、Jedisオブジェクトを直接生成して直接接続するのではなく、接続池から直接取得する:
    
            Jedis jedis = null;
            try {
                // 1.       jedis   
                jedis = jedisPool.getResource();
                // 2.      
                jedis.get("hello");
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (jedis != null) {
                    //     JedisPool,close        ,        
                    jedis.close();
                }
            }
    
    顔Generanic Object PoolConfigはデフォルトの設定を使用しています。実際には池の中の大連接続数、最大アイドル接続数、最小アイドル接続数、接続活性測定などの多くのパラメータが提供されています。
    参考:
    【1】「Redis開発と維持」
    【2】:redisいくつかのjavaクライアントの比較
    以上、Javaの中でJedisの基本的な使用についての文章を紹介しました。Java Jedisの使用内容については、以前の文章を検索したり、下記の関連記事を見たりしてください。これからもよろしくお願いします。