복붙노트

[REDIS] 하나의 레디 스 인스턴스는 스레드로부터 안전하지 않습니다 이유는 무엇입니까?

REDIS

하나의 레디 스 인스턴스는 스레드로부터 안전하지 않습니다 이유는 무엇입니까?

https://github.com/xetorthio/jedis/wiki/Getting-started

다중 스레드 환경에서 Jedis를 사용

당신이 이상한 오류가있는 것이기 때문에 당신은 다른 스레드에서 동일한 인스턴스를 사용할 수 없습니다. 이 소켓과 연결 많은 이상한 오류로 리드뿐만 아니라 의미하기 때문에 Jedis 인스턴스 때때로 만드는 많은 좋은 충분하지 않습니다.

! 이러한 문제를 방지하려면 네트워크 연결의 스레드 풀입니다 JedisPool를 사용해야합니다. 당신은 안정적으로 할 때 풀에 Jedis 인스턴스를 반환 주어진 여러 Jedis 인스턴스를 생성하기 위해 풀을 사용할 수 있습니다. 이 방법 당신은 그 이상한 오류를 극복하고 뛰어난 성능을 달성 할 수있다.

=================================================

그 이유를 알고 싶어? 캔 사람의 도움을 저에게주십시오

해결법

  1. ==============================

    1.단일 Jedis 인스턴스는이 방법을 구현하기 때문에 스레드 안되지 않습니다. 즉, 라이브러리의 저자가 만든 것을 결정합니다.

    단일 Jedis 인스턴스는이 방법을 구현하기 때문에 스레드 안되지 않습니다. 즉, 라이브러리의 저자가 만든 것을 결정합니다.

    당신은 Jedis https://github.com/xetorthio/jedis/blob/master/src/main/java/redis/clients/jedis/BinaryJedis.java의 슈퍼 타입 BinaryJedis의 소스 코드에서 확인하실 수 있습니다

    이 라인은 예를 들어 :

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

    당신이 볼 수 있듯이 트랜잭션 필드는 Jedis 인스턴스를 사용하여 모든 스레드에 대한 공유 및이 방법에 초기화됩니다. 나중에이 거래는 다른 방법으로 사용할 수 있습니다. 두 스레드가 동시에 트랜잭션 작업을 수행 상상해보십시오. 그 결과는 하나의 스레드에 의해 생성 된 트랜잭션이 아니게 다른 스레드에 의해 액세스되도록 할 수있다. 이 경우 트랜잭션 필드는 동기화되지 않습니다에 대한 상태 액세스를 공유됩니다. 이 Jedis 않는, 쓰레드를 만든다.

    저자는 Jedis 비 - 스레드와 JedisPool는 스레드가 단일 스레드 환경이있는 경우 Jedis를 사용하여 더 나은 성능을 얻을 수 또는 다중 스레드 환경이있는 경우 사용할 수 할 수 있도록 고객을위한 유연성을 제공 할 수 있습니다하기로 결정 이유 JedisPool 및 스레드 안전을 얻는다.

  2. from https://stackoverflow.com/questions/30107383/why-a-single-jedis-instance-is-not-threadsafe by cc-by-sa and MIT license