php - 以线程安全的方式从redis的列表中删除第n个元素

标签 php multithreading redis

在 cron 作业中,我希望在迭代期间以线程安全的方式从 redis 的列表中删除第 n 个元素。

有可能吗?我可以知道我该怎么做吗?

我正在寻找线程安全的方式。会有另外一个writer进程,时不时的对同一个list进行写操作。

while (true) {
    // Get all elements from "mylist" list.
    $list = $redis->lrange("mylist", 0, -1);

    // Iterate through "mylist" list.
    for ($n = 0; $n < count($list); ++$n) {
        if ($list[$n] == "dummy") {
            // I wish to remove nth element (with "dummy" value) from "mylist" 
            // in thread safe fashion. But how?
        }
    }
}

线程安全很重要,这样就不会发生下面的情况

  1. Cron 作业找出“dummy”元素是第 5 个元素,并准备将其删除。
  2. Writer 进程正在将附加元素插入到列表的头部,这会将“虚拟”元素推到第 6 个位置。
  3. Cron 作业从列表中删除了第 5 个元素,它不再是“虚拟”元素!

在 Java 中,我通常使用 Copy On Write 来解决这个读写器问题。 (通过 CopyOnWriteArrayList )。但是,在 PHP 和 Redis 中呢?

最佳答案

使用LREM这样做:

LREM mylist 0 "dummy"
        ^   ^    ^
        |   |    |- `value` to delete   
        |   |------ remove all elements equal to `value`.
        |---------- list key name   

您可以使用 count(上面示例中的 0)从头到尾(或从尾到头)移动。

关于php - 以线程安全的方式从redis的列表中删除第n个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24357792/

相关文章:

ruby-on-rails - 什么 Rubygem 可以轻松地向一部分用户发布新功能?

php - MySQL - WHERE 子句中的自定义错误

java - 如何让 System.in 从 JTextField 中读取

java - 在外部修改时流式传输并发集合是否安全?

java - 线程安全队列类出现问题。具体来说,除了异常(exception)情况

node.js - 如何使用包含数据库创建的 dockerfile 构建 docker 镜像

php - 使用AJAX打开php文件

php - 在 Laravel 中使用同步分离数据透视表

php - .htaccess:此处不允许的选项 cwp

redis - 使用 redis cli 执行批处理命令