我使用了redis列表,并将新的项目推送到列表中,问题是我只需要列表中最近的10个项目。我使用lpush向列表中添加项目,使用lrange获取最近的10个项目。在一定数量的项目之后,有什么办法可以删除项目吗?我将以可能有1,000个项目的列表结束,这可能会导致延迟的性能问题。谢谢大家!
lpush
lrange
ql3eal8s1#
在每个lpush之后,调用ltrim将列表修剪为10个元素参见http://redis.io/commands/ltrim
ltrim
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操作,使你的推送保持快速。
nle07wnf3#
下面的代码,
在交易中。
MULTI LPUSH list "item1" LTRIM list 0 9 LRANGE list 0 9 EXEC
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"
5ssjco0h5#
这只是一个替代方法,根据LPUSH的official doc,它返回推送操作后的列表长度,你可以设置一个阈值长度,比如k(这里k〉10),当返回的长度大于k时调用LTRIM,伪代码示例如下:
LPUSH
k
LTRIM
len = LPUSH mylist xxx if len > k: LTRIM mylist 0 9 LRANGE mylist 0 9
这比随机方法更容易控制,k越大,触发的LTRIM越少,但内存开销越大,可以根据调用LTRIM的频率调整k,因为调用额外的命令开销更大。
ejk8hzay6#
在LPUSH <list-name> <item>之后调用LTRIM <list-name> -1 -10是最简单的答案,许多人已经讨论过这个问题。您必须在事务中执行这两个操作,或者必须使用Lua脚本来确保操作是原子的。
LPUSH <list-name> <item>
LTRIM <list-name> -1 -10
6条答案
按热度按时间ql3eal8s1#
在每个
lpush
之后,调用ltrim
将列表修剪为10个元素参见http://redis.io/commands/ltrim
bjp0bcyl2#
您可以在任何LPUSH之后间歇性地使用LTRIM,无需在每次LPUSH之后调用LTRIM,因为这会增加应用的整体延迟(尽管redis确实很快,但您可以保存大量LPUSH操作)
以下是在大约每隔5个LPUSH时实现LTRIM的伪代码:
虽然你的列表有时可能会增长到几个元素超过10个元素,但它肯定会以固定的间隔被截断。这种方法适合于大多数实际用途,并节省了大量的LTRIM操作,使你的推送保持快速。
nle07wnf3#
下面的代码,
在交易中。
gstyhher4#
从来没有人提到过关于只存储最近10个项目的真正解决方案。
让我们创建一个包含15个项目的示例列表(这里只有数字):
现在指示从列表末尾的偏移:
显示列表
现在您可以添加新项目并运行修剪:
5ssjco0h5#
这只是一个替代方法,根据
LPUSH
的official doc,它返回推送操作后的列表长度,你可以设置一个阈值长度,比如k
(这里k〉10),当返回的长度大于k
时调用LTRIM
,伪代码示例如下:这比随机方法更容易控制,
k
越大,触发的LTRIM
越少,但内存开销越大,可以根据调用LTRIM
的频率调整k
,因为调用额外的命令开销更大。ejk8hzay6#
在
LPUSH <list-name> <item>
之后调用LTRIM <list-name> -1 -10
是最简单的答案,许多人已经讨论过这个问题。您必须在事务中执行这两个操作,或者必须使用Lua脚本来确保操作是原子的。