当前位置: 首页 > 面试题库 >

Redis Pop列表项,按项数

夏英发
2023-03-14
问题内容

我有一个分布式系统,在一个地方,我在Redis列表中插入大约10000个项目,然后调用我的多个应用程序钩子来处理项目。我需要的是具有一些项目的ListLeftPop类型的方法。它应该从redis列表中删除项目并返回到我的调用应用程序。

我正在使用Stackexchange.Resis.extension

我目前用于获取(不弹出)的方法是

 public static List<T> GetListItemRange<T>(string key, int start, int chunksize) where T : class
        {
            List<T> obj = default(List<T>);
            try
            {
                if (Muxer != null && Muxer.IsConnected && Muxer.GetDatabase() != null)
                {
                    var cacheClient = new StackExchangeRedisCacheClient(Muxer, new NewtonsoftSerializer());
                    var redisValues = cacheClient.Database.ListRange(key, start, (start + chunksize - 1));
                    if (redisValues.Length > 0)
                    {
                        obj = Array.ConvertAll(redisValues, value => JsonConvert.DeserializeObject<T>(value)).ToList();
                    }
                }
            }
            catch (Exception ex)
            {
                Logger.Fatal(ex.Message, ex);
            }
            return obj;
        }

对于流行音乐,我有一个摘录

 var cacheClient = new StackExchangeRedisCacheClient(Muxer, new NewtonsoftSerializer());
                    var redisValues = cacheClient.ListGetFromRight<T>(key);

但这仅适用于单个项目


问题答案:

我假设您正在一个 队列中 ,在此 队列中 ,您可以在一个位置插入1000个项目,然后 按插入顺序在 多个位置检索它们。

您无法通过单个命令来实现,但是可以通过2个命令来实现。您可以编写一个lua脚本使它们原子化。

兰奇:http:
//redis.io/commands/lrange

Lrange list -100 -1

这将在列表中列出您的前100个元素。这里的偏移量是-100。请注意,这将以插入时的相反顺序返回项目。因此,您需要反转循环以确保队列机制。

Ltrim:http:
//redis.io/commands/ltrim

ltrim list 0 -101

这将修剪列表中的前100个元素。这里101是n + 1,所以它必须是101。这里offset是101

将它们写在lua块中将确保您的原子性。

让我举一个简单的例子。

您在一个地方插入100个元素。

lpush html" target="_blank">list 1 2 3 .. 100

您有多个客户端,每个客户端都试图访问此lua块。假设您的n值为5。第一个客户端进入并获取插入的前5个元素。

127.0.0.1:6379> lrange list -5 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"

您将它们保留在lua对象中并删除它们。

127.0.0.1:6379> LTRIM list 0 -6
OK

将它们返回到您的代码,现在您想要的结果是1 2 3 4 5,但是您得到的是5 4 3 21。因此,您需要反转循环并执行操作。

当下一个客户端进入时,它将获得下一组值。

127.0.0.1:6379> lrange list -5 -1
1) "10"
2) "9"
3) "8"
4) "7"
5) "6"

这样您就可以实现您的要求。希望这可以帮助。

编辑:

Lua脚本:

local result = redis.call('lrange', 'list','-5','-1')
redis.call('ltrim','list','0','-6')
return result


 类似资料:
  • 本文向大家介绍sharepoint项目。更新列表项,包括了sharepoint项目。更新列表项的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 项目列表中,设有官方示例和我的项目两个标签页。选择任意官方示例,即可在编辑窗口中,相应地打开一个 .js 文件。您可以方便快捷地将官方示例代码复制到您的项目中直接使用,下图所示为官方示例的标签页。 新建文件 在我的标签页中,点击创建的项目右侧的新建文件按钮,输入文件名称和文件扩展名,例如,我的文件1.js,按 Enter 键即可新建文件。 上传文件 点击上传文件按钮,在弹出的窗口中选择本地文件,点

  • type String(可选) - 以下之一: task - 启动具有特定参数的应用程序的任务。 separator - 用来分隔标准 Tasks类别中的项目。 file - 使用创建常用列表的应用程序打开的文件链接,为了这个工作应用程序必须注册为文件类型的处理程序(尽管它不必是默认处理程序) 。 path String(可选) - 要打开的文件的路径, type是 file时才应该设置。 pro

  • 核心功能(Core functionality) 输入(input -i/--input) String 这个包的入口点 (例如:你的 main.js 或者 app.js 或者 index.js) 文件(file -o/--output.file) String 要写入的文件。也可用于生成 sourcemaps,如果适用 格式(format -f/--output.format) String 生

  • 我想在div中包装每三个 元素,我做到了。现在,我想计算一下包装的div中是否有少于3个 ,如果少于3,则追加 ,这是我到目前为止的代码,我不知道为什么它不起作用: 我想要的只是添加 来填充剩余的空间,如果孩子的数量少于三个。

  • 目前为止我们做了很多的设置和架构工作,但是本课中我们开始制作骨架部分。我们将加入创建checklist,查看checklist以及给他们添加项(同时也提供编辑项和列表的操作)的途径。这将是一个大动作,建议你先准备点咖啡。 checklist 第一件要做的事情是添加创建和展示checklist所需的所有东西。意思是添加到类定义,修改之前创建的模板来展示真实的清单数据。 先从设置类定义开始。 > 修改