redis 列表,生产者保持 lpush。在另一个线程中,消费者定期从列表中取出所有元素,并对元素进行分类。因为生产者一直在推动,所以必须以原子方式完成全部取出。那么有没有有效的方法来做到这一点?可以使用spring-data-redis 。
// producer
getOpsForList.push(k, v);
// consumer
alist = range(k,0,-1); // take all out
alist.parallelStream() // during which a producer thread could push but I hope it is "blocked".
delete(k); // list is now empty and push from producer is unblocked.
multi
并exec
没有达到我的目标,因为它实际上提交了lrange
,lpush
而且delete
只是在一次交易中。到目前为止,我能想到的唯一方法是保留lpop
并添加返回,alist
直到列表为空。
编辑,这就是我的想法:当你想确保一个操作只运行一次时,使用watch
:
watch key
val = get key
val = val + 1
multi
set key val
exec
当您不想被“中断”(不是多线程中断)并且不在乎它运行多少次时,事务(multi
和exec
)就足够了。
multi
val = lrange key 0 -1
delete key
exec
val
完成后仍然是一个列表,就像官方文档中所说的那样
事务中的所有命令都被序列化并按顺序执行。在 Redis 事务的执行过程中服务于另一个客户端发出的请求永远不会发生。
除了redis,我把数据操作list.stream.parallelism
拿出来了,现在函数只关注数据getter,和上一段代码一模一样。;)