如何使用 stackexchange.redis 从多个键中获取所有哈希元素

我正在评估 redis,并尝试使用 lua 脚本在一次调用中从 redis 获取多个哈希键。

我似乎无法使其工作。 下面的代码将返回一个数组到我的 c# 代码,但我似乎无法访问哈希结果。 返回的 redisResult 是一个数组,每个数组元素都是一个空数组,我预计每个元素都是哈希值的数组。

        int key1 = 1;
        var sb = new StringBuilder();
        var compositeKeys = new List<RedisKey>();
        for (int key2 = 1; key2 < 1000; key2++)
        {
            compositeKeys.Add((RedisKey)GetRedisKey2(key1, key2));
        }

        sb.AppendLine("local collate = function(key)");
        sb.AppendLine("local raw_data = redis.call('HGETALL', key)");
        sb.AppendLine("local data = {}");
        sb.AppendLine("for idx = 1, #raw_data, 2 do");
        sb.AppendLine(" data[raw_data[idx]] = raw_data[idx + 1]");
        sb.AppendLine("end");
        sb.AppendLine("return data;");
        sb.AppendLine("end");

        sb.AppendLine("local data = {}");
        sb.AppendLine("for _, key in pairs(KEYS) do");
        sb.AppendLine("  data[_] = collate(key)");
        sb.AppendLine("end");

        sb.AppendLine("return data");

        var results = _redDb.ScriptEvaluate(sb.ToString(), compositeKeys.ToArray());

编辑:为了更好地解释我的意图: 这将用于查找股票市场数据,获取缓存中的数据有三个用例。

1.按股票代码和时间获取单个项目 2.获取单个股票的历史数据范围 3.获取从特定时间开始的一系列符号

每个数据点都有大约 30 个关于该时间股票的数据字段。 我将其使用组合了符号和时间的键进行存储,并在我的对象中使用哈希字段。 我在单个股票查找方面获得了很好的性能,但是在查找一系列值时遇到了麻烦。

我实现了此问题中描述的分段方法:StackExchange.Redis:多个哈希的批处理访问。 性能还不错,但不比我今天从 SQL Server 中获得的性能更好。 我想使用 LUA 脚本方法对性能进行基准测试,但我肯定做错了些什么。

点赞
用户1195908
用户1195908

与其关注问题标题(主要是因为我不确定您能否获得您想要的性能提升),我建议另一种方法,重点关注您后来添加到问题中的目标:

  1. 按股票代码和时间获取单个项目
  2. 获取单个符号的历史数据范围
  3. 获取特定时间段内的一系列符号

考虑到您对基于时间范围的兴趣,您可能会发现排序集更好。

排序集由元素组成,其中每个元素具有分数(双倍精度浮点数)和值(任何字符串,例如 JSON、使用 protobuf 序列化的对象)。

因此,您可以针对每只股票创建一个集合,并向集合中添加元素,其中分数是交易时间(以毫秒为单位),值是描述您的交易的一些字符串。例如,

ZADD stocks.GOOG 1459956490731 {LastTradePrice:743.16,SomeOtherUsefulInfo:123}

然后,要查询给定时间范围内的所有交易,

ZRANGE stocks.GOOG <start-time-in-ms> <end-time-in-ms> WITHSCORES

要获取特定时间的符号范围,您需要一个额外的集合,其中每个库存都添加一个元素,该库存应该被返回,例如。

ZADD stocks.active 1459956490731 GOOG
ZADD stocks.active 1459956490731 IBM
ZADD stocks.active 1459956490731 AAPL

希望这可以帮助您!

(*)例如,

var startOfTime = new DateTime(2016, 1, 1);
var tradeTime = DateTime.Now;
var ms = (tradeTime - startOfTime).TotalMilliseconds;
2016-04-06 15:48:24