sql >> データベース >  >> NoSQL >> Redis

単一のJedisインスタンスがスレッドセーフではないのはなぜですか?

    単一のJedisインスタンスは、このように実装されているため、スレッドセーフではありません。それが図書館の作者が下した決定です。

    JedisのスーパータイプであるBinaryJedisのソースコードをチェックインできますhttps://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/BinaryJedis.java

    >

    例:これらの行:

    public Transaction multi() {
        client.multi();
        client.getOne(); // expected OK
        transaction = new Transaction(client);
        return transaction;
    }
    

    ご覧のとおり、トランザクションフィールドはJedisインスタンスを使用してすべてのスレッドで共有され、このメソッドで初期化されます。後でこのトランザクションを他の方法で使用できます。 2つのスレッドが同時にトランザクション操作を実行するとします。その結果、あるスレッドによって作成されたトランザクションが、別のスレッドによって意図せずにアクセスされる可能性があります。この場合のトランザクションフィールドは、同期されていない共有状態アクセスです。これにより、Jedisはスレッドセーフではなくなります。

    著者がJedisを非スレッドセーフおよびJedisPoolスレッドセーフにすることを決定した理由は、クライアントに柔軟性を提供して、シングルスレッド環境の場合はJedisを使用してパフォーマンスを向上させるか、マルチスレッド環境の場合は使用できるようにするためかもしれません。 JedisPoolとスレッドセーフを取得します。




    1. MongoDBについて、なぜそれを使用するのですか? MongoDBの用語と実装

    2. 集計後に元のドキュメントを元に戻す方法

    3. macOS10.12上の2つのDockerコンテナ間の通信

    4. SpringセッションデータRedis-有効なセッション、現在のユーザーをRedisストアから取得