我尝试在redis数据库中存储注释。我的数据结构:
z
列出我持有commentId的位置。让我们评论一下= 3. comment:3
一样使用评论文本,ip,useragent和评论时间。 当我zadd首先从中获取最大ID时,再加上1 - 它将是新的Id。
当同时添加2条评论时,问题就开始了。并且它们都可以获得相同的Id,然后在哈希表中可以丢失一条注释。
那么如何计算newId而不重复高并发?
答案 0 :(得分:2)
将您的两步程序包裹在a Lua script中并拨打电话。因为redis是单线程的,所以lua脚本调用将被序列化(=没有竞争条件)。
或者您可以将评论ID存储在可以INCR的单独密钥中。这样,即使不将两个步骤都包含在脚本中,它也应该可以工作。