37

我正在使用 redis 列表并将新项目推送到列表中。问题是我真的只需要列表中最近的 10 项。

lpush用来将项目添加到列表并lrange获取最新的 10 个。

有没有在一定数量后丢弃物品?我最终会得到可能包含 1,000 个项目的列表,并且可能会导致延迟出现性能问题。

谢谢!

4

5 回答 5

53

在 every 之后lpush,调用ltrim将列表修剪为 10 个元素

http://redis.io/commands/ltrim

于 2012-08-21T17:33:06.070 回答
32

您可以在任何 LPUSH 之后间歇性地使用LTRIM , 无需在每次 LPUSH 之后调用 LTRIM,因为这会增加应用程序的整体延迟(虽然 redis 非常快,但您可以节省大量 LPUSH 操作)

这是大约每 5 个 LPUSH 实现 LTRIM 的伪代码:

LPUSH mylist 1
random_int = some random number between 1-5
if random_int == 1:  # trim my list with 1/5 chance
   LTRIM mylist 0 10

尽管您的列表有时可能会增长到超过 10 个元素的几个元素,但它肯定会定期被截断。这种方法适用于大多数实际目的,并且可以节省大量 LTRIM 操作,从而保持快速推送。

于 2016-06-17T06:56:15.090 回答
10

以下代码,

  • 将项目推送到列表中,
  • 保持大小固定为 10,
  • 并返回最近的 10 个元素

在一次交易中。

MULTI
LPUSH list "item1"
LTRIM list 0 9
LRANGE list 0 9
EXEC
于 2015-03-09T10:22:57.680 回答
6

从来没有人提到过只存储最近 10 个项目的真正解决方案。

让我们创建一个包含 15 个项目的示例列表(这里只是数字):

RPUSH list 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

现在指示从列表末尾的偏移量:

LTRIM list -10 -1

显示列表

LRANGE list 0 -1

 1) "6"
 2) "7"
 3) "8"
 4) "9"
 5) "10"
 6) "11"
 7) "12"
 8) "13"
 9) "14"
10) "15"

现在您可以添加新项目并运行修剪:

RPUSH list 16
LTRIM list -10 -1

 1) "7"
 2) "8"
 3) "9"
 4) "10"
 5) "11"
 6) "12"
 7) "13"
 8) "14"
 9) "15"
10) "16"
于 2019-09-03T17:32:03.763 回答
5

只是一种选择。根据官方文档LPUSH它在推送操作后返回列表的长度。您可以设置阈值长度,例如k(在您的情况下 k > 10)并LTRIM在返回的长度大于时调用k。示例伪代码如下:

len = LPUSH mylist xxx 
if len > k:   
  LTRIM mylist 0 9
LRANGE mylist 0 9

它比随机方法更可控。更大的k触发器更少LTRIM,但内存成本更高。您可以k根据要调用的频率进行调整,LTRIM因为调用额外的命令更昂贵。

于 2018-11-28T07:02:46.823 回答