限制redis中的列表长度

dzm*_*dzm 21 database redis

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

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

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

谢谢!

Sri*_*nan 42

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

http://redis.io/commands/ltrim


Dhr*_*hak 20

您可以在任何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
Run Code Online (Sandbox Code Playgroud)

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

  • 当一条建议直接来自某人的生产经验时,你几乎闻到了;) (3认同)
  • @DhruvPathak如果使用支持流水线的语言/库,则无需编写脚本来节省往返时间。 (2认同)

ovu*_*tin 9

以下代码,

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

交易中.

MULTI
LPUSH list "item1"
LTRIM list 0 9
LRANGE list 0 9
EXEC
Run Code Online (Sandbox Code Playgroud)

  • @PaulT.Rawkeen为什么?它可以使用Reids内置命令(包装在事务中)来实现,我没有看到使其成为lua脚本的理由. (3认同)

wei*_* tu 9

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

len = LPUSH mylist xxx 
if len > k:   
  LTRIM mylist 0 9
LRANGE mylist 0 9
Run Code Online (Sandbox Code Playgroud)

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


bey*_*ski 5

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

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

RPUSH list 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
Run Code Online (Sandbox Code Playgroud)

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

LTRIM list -10 -1
Run Code Online (Sandbox Code Playgroud)

显示列表

LRANGE list 0 -1

 1) "6"
 2) "7"
 3) "8"
 4) "9"
 5) "10"
 6) "11"
 7) "12"
 8) "13"
 9) "14"
10) "15"
Run Code Online (Sandbox Code Playgroud)

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

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"
Run Code Online (Sandbox Code Playgroud)