在 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?
}
}
}
线程安全很重要,这样就不会发生下面的情况
- Cron 作业找出“dummy”元素是第 5 个元素,并准备将其删除。
- Writer 进程正在将附加元素插入到列表的头部,这会将“虚拟”元素推到第 6 个位置。
- 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/