【问题标题】:redis - add multiple values to a list and fetch multiple valuesredis - 将多个值添加到列表并获取多个值
【发布时间】:2018-09-06 18:53:44
【问题描述】:

我不知道list 是不是正确的数据类型?

我需要将很多项目添加到列表中,然后我必须获取所有项目。获取项目后,必须将其删除

$list = 'the:list';
$redis
    ->multi()
    ->lRange($list, 0, -1)
    ->lTrim($list, -1, 0)
    ->exec();

上面的代码获取了项目但在获取后没有删除它们?我做错了什么?

【问题讨论】:

  • 您的代码应该可以工作。更好的方法是删除列表:MULTI && LRANGE && DEL && EXEC

标签: php redis


【解决方案1】:

一旦您获取数据。然后您可以使密钥过期。

例如: https://redis.io/commands/expire

【讨论】:

  • 如果同时有新商品被推送到列表中怎么办?
【解决方案2】:

如果您按顺序读回它们,您可以使用LPOP 或RPOP 将其从列表中删除并返回。

如果你需要随机读取它们,那么可能使用 SET 而不是 LIST 数据类型,那么你可以使用SPOP

更新 根据您在原始问题中所做的一些 cmet,听起来您想读出整个列表然后将其删除,但您担心在读取和删除操作之间插入项目?

如果是这种情况,则使用 redis transaction。使用LRange,然后在密钥上使用DEL。正如您从文档中看到的那样,事务确保不会影响两个操作之间的列表,因此对它的任何新添加都将最终重新创建列表。

事务中的所有命令都被序列化并执行 依次。永远不会发生另一个人发出的请求 客户端在 Redis 执行过程中提供服务 交易。这保证了命令作为 单个隔离操作。

或者换句话说,用删除替换你的修剪,你就可以开始了。

【讨论】:

  • pop 在有很多项目时太慢了.. 所以这不是一个选项
  • LPOP 和 RPOP 是 O(1) 操作。有多少项目让你觉得它看起来很慢?
  • 我用 mysql 表进行了基准测试,在某些时候使用 mysql 获取条目比 redis 更快。现在不记得数量了。我刚刚意识到@987654330 @ 不会工作.. 我需要一次性获取所有条目
  • 好的,我想我明白你想要什么。您的问题是按顺序读出的,但您自己的代码是批量读出的,因此会造成混淆。因此,您只想获取所有项目,然后批量删除它们,但又不会冒险删除来自其他客户端的任何内容……因此,您只需将修剪替换为原始代码中的删除即可。
  • 好的.. 所以这会工作$entries = $redis->multi()->lRange($buffer_list, 0, -1)->del($buffer_list)->exec()[0] ?? []; 吗? :)
猜你喜欢
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 2021-04-25
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多