我正在使用Redis列表,并将新项推送到列表中。问题是,我只需要在一个列表中保留最近的10个项目。
我使用lpush
添加项目到列表中,并使用lrange
获取最近的10个项目。
有没有办法在达到一定数量后删除列表中的项?因为我的列表可能会有成千上万个项目,并且这可能会导致性能问题和延迟。
谢谢!
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操作,从而保持推送速度快。
以下代码:
在交易中执行。
MULTI
LPUSH list "item1"
LTRIM list 0 9
LRANGE list 0 9
EXEC
关于仅存储最近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"
这只是一种替代方案。根据 LPUSH 的官方文档,它返回推送操作后列表的长度。您可以设置一个阈值长度,如k
(在您的情况下,k > 10),并在返回的长度大于k
时调用LTRIM
。示例伪代码如下:
len = LPUSH mylist xxx
if len > k:
LTRIM mylist 0 9
LRANGE mylist 0 9
相比于随机方法,它更加可控。更大的 k
会减少 LTRIM
的使用,但会增加内存开销。你可以根据你调用 LTRIM
的频率来调整 k
,因为调用额外命令的代价更高。
调用LTRIM <list-name> -1 -10
之后再执行LPUSH <list-name> <item>
是最简单的答案。很多人已经覆盖了这个问题。
你必须在一个事务中执行这两个操作,或者使用Lua脚本来确保操作是原子的。
LTRIM list -10 -1
。 - kuzey beytar