ServiceStack.Redis:缺少 PopRight / PopLeft,而是奇怪命名的方法?

ServiceStack.Redis: PopRight / PopLeft missing, instead weirdly named methods?

我正在测试 ServiceStack.Redis 库,起初不明白为什么我无法确定我是向左弹出还是向右弹出。一开始只看到

redis.BlockingPopItemFromList("list1", null);

但想知道,向左或向右弹出的选择在哪里?然后我发现:

redis.BlockingRemoveStartFromList("list1", null);

还有

redis.BlockingDequeueItemFromList("list1", null);

好像是:

所以,三个不同的方法,三个不同的名称,其中两个做同样的事情。

此外,还有这些方法:

但是没有BlockingRemoveEndFromList。我猜是 BlockingPopx...

为什么不将其称为 PopLeft 和 PopRight,或者一种方法 Pop,其参数说明从何处弹出?

API 具有描述性含义,以提高不熟悉 redis keycode commands.

的开发人员在正常代码库中的可读性

但是如果你想知道每个 API 所做的操作,只需搜索 github.com/ServiceStack/ServiceStack.Redis source code to see what Redis command they call. Or if you're just interested in the List APIs a lot of them are defined in RedisClient_List.cs.

你很少会想要使用调用 redis blocking commandsBlocking* API 除非那是你想要阻塞线程的特定行为,直到一个元素已添加到列表中。

其他的API都是正常的操作,看你想怎么对待列表数据结构了。 IMO API 名称对它们的行为非常具有描述性,例如如果你想把它当作一个列表,那就是:

将项目添加到列表

  • PrependItemToList - 添加到列表开头 (LPUSH)
  • AddItemToList - 将项目添加到列表末尾 (RPUSH)

添加项目范围

  • PrependRangeToList - 将元素范围添加到列表的开头 (LPUSH[])
  • AddRangeToList - 将一系列元素添加到列表末尾 (RPUSH[])

从列表中删除项目

  • RemoveStartFromList - 从列表开头删除一个项目 (LPOP)
  • RemoveEndFromList - 从列表末尾删除一个项目 (RPOP)

如果您喜欢在代码库中使用不同的命名法,则上述命令也有别名,例如如果您想将列表视为不同的数据结构,例如队列或堆栈,您会改用成对的 APIs 用于处理它们,即:

  • EnqueueItemOnList - 将项目加入队列 (LPUSH)
  • DequeueItemFromList - 将项目从队列中取出 (RPOP)

或者,如果您想将列表视为堆栈:

  • PushItemToList - 推送一个项目 (RPUSH)
  • PopItemFromList - 弹出一个项目 (RPOP)

如果您想使用自己的命名法,则只需将自己的扩展方法添加到 Redis 客户端接口即可,例如:

public static class MyRedisApis
{
    public static string PopLeft(this IRedisClient client, string listId) =>
        client.RemoveStartFromList(listId);

    public static string PopRight(this IRedisClient client, string listId) =>
        client.RemoveEndFromList(listId);
}

现在您可以在您的代码库中使用您自己命名的 API:

var item = redis.PopLeft(myList);

需要时,您可以将 Redis 客户端转换为 IRedisNativeClient 并访问与 redis-server 上相同的命令名称,但需要将原始 byte[] 类型转换为 UTF- 8 string 在适当的地方。