【发布时间】:2022-01-01 03:23:08
【问题描述】:
考虑一种情况:
List = get_list_by_key(key) //get from redis
if(list.size() != 0)
{
//do something
} else
{
add_to_list(key, value) //put to redis
}
我面临的问题是当两个同时线程进来时,当列表为空时,(我不能等待另一个线程启动,这可能永远不会),有什么好的方法来处理这个?
理想情况下,如果块应该被执行,但在上述情况下它不会。
编辑:此代码是在集群环境中运行的应用程序的一部分,因此可能无法进行同步,在我的情况下,锁也不可行,因为它会阻塞另一个线程(我正在尝试避免)。
【问题讨论】:
-
听起来整个块应该是
synchronized(或使用其他一些锁定机制),因此一次只有一个线程可以运行整个代码块。 -
因此可能无法同步:也许您可以使用
distributed lock? -
如果您谈论的是集群环境,我猜您并不是真正关心多线程,而是更多关于访问同一个 Redis 的多个进程和服务。我建议根据您的用例调查事务和乐观锁或悲观锁。如果您使用框架来访问 Redis,这可能会为您提供一种使请求具有事务性的简单方法。
-
您可以使用Lua script 使代码原子化。
标签: java database multithreading redis