限制redis中的列表长度

时间:2012-08-21 17:27:55

标签: database redis

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

我正在使用lpush将项目添加到列表中,并使用lrange来获取最新的项目。

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

谢谢!

5 个答案:

答案 0 :(得分:37)

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

请参阅http://redis.io/commands/ltrim

答案 1 :(得分:18)

您可以在任何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操作,从而保持您的快速推送。

答案 2 :(得分:8)

以下代码,

  • 将项目推送到列表
  • 将尺寸固定为10,
  • 并返回最近的10个元素

交易中

MULTI
LPUSH list "item1"
LTRIM list 0 9
LRANGE list 0 9
EXEC

答案 3 :(得分:1)

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

k

它比随机方法更具可控性。 len = LPUSH mylist xxx if len > k: LTRIM mylist 0 9 LRANGE mylist 0 9 越大,触发的k越少,但内存成本更高。您可以根据要调用LTRIM的频率来调整k,因为调用额外的命令会更加昂贵。

答案 4 :(得分:0)

没有人给出仅存储最近的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"