redis 限制列表长度(红色)

z2acfund  于 2023-02-28  发布在  Redis
关注(0)|答案(6)|浏览(179)

我使用了redis列表,并将新的项目推送到列表中,问题是我只需要列表中最近的10个项目。
我使用lpush向列表中添加项目,使用lrange获取最近的10个项目。
在一定数量的项目之后,有什么办法可以删除项目吗?我将以可能有1,000个项目的列表结束,这可能会导致延迟的性能问题。
谢谢大家!

ql3eal8s

ql3eal8s1#

在每个lpush之后,调用ltrim将列表修剪为10个元素
参见http://redis.io/commands/ltrim

bjp0bcyl

bjp0bcyl2#

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

nle07wnf

nle07wnf3#

下面的代码,

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

交易中。

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

gstyhher4#

从来没有人提到过关于只存储最近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"
5ssjco0h

5ssjco0h5#

这只是一个替代方法,根据LPUSHofficial doc,它返回推送操作后的列表长度,你可以设置一个阈值长度,比如k(这里k〉10),当返回的长度大于k时调用LTRIM,伪代码示例如下:

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

这比随机方法更容易控制,k越大,触发的LTRIM越少,但内存开销越大,可以根据调用LTRIM的频率调整k,因为调用额外的命令开销更大。

ejk8hzay

ejk8hzay6#

LPUSH <list-name> <item>之后调用LTRIM <list-name> -1 -10是最简单的答案,许多人已经讨论过这个问题。
您必须在事务中执行这两个操作,或者必须使用Lua脚本来确保操作是原子的。

相关问题