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

在多线程环境中使用Jedis

您不应该使用来自不同线程的相同实例,因为您会遇到奇怪的错误。有时创建大量的Jedis实例还不够好,因为这意味着大量的套接字和连接,这也会导致奇怪的错误。



!为了避免这些问题,您应该使用JedisPool,它是网络连接的线程安全池。可以在完成后将Jedis实例返回到池中的情况下,使用该池可靠地创建多个Jedis实例。这样,您可以克服这些奇怪的错误并获得出色的性能。

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

我想知道为什么吗?谁能帮我

最佳答案

单个Jedis实例不是线程安全的,因为它是通过这种方式实现的。那是图书馆作者做出的决定。

您可以 checkin BinaryJedis的源代码,它是Jedis的 super 类型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实例为所有线程共享了交易字段,并在此方法中对其进行了初始化。以后,可以在其他方法中使用此事务。想象两个线程同时执行事务性操作。结果可能是一个线程创建的事务被另一线程无意访问。在这种情况下,事务字段是不同步的共享状态访问。这使Jedis成为非线程安全的。

作者之所以决定使Jedis为非线程安全的和JedisPool为线程安全的,可能是为了为客户端提供灵活性,这样,如果您具有单线程环境,则可以使用Jedis并获得更好的性能;或者,如果您具有多线程环境,则可以使用JedisPool并获得线程安全。

关于redis - 为什么单个Redis实例不是线程安全的?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30107383/

10-11 01:44