gpt4 book ai didi

redis - 为什么单个 Redis 实例不是线程安全的?

转载 作者:IT王子 更新时间:2023-10-29 06:01:36 26 4
gpt4 key购买 nike

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

在多线程环境中使用 Jedis

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

A single Jedis instance is not threadsafe

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

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

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

最佳答案

单个 Jedis 实例不是线程安全的,因为它是以这种方式实现的。这是库的作者做出的决定。

您可以查看 BinaryJedis 的源代码,它是 Jedis 的父类(super class)型 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 线程安全的原因可能是为客户端提供灵 active ,这样如果你有一个单线程环境,你可以使用 Jedis 并获得更好的性能,或者如果你有一个多线程环境您可以使用 JedisPool 并获得线程安全。

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com