如何使用 stackexchange.redis 从多个键中获取所有哈希元素
2017-5-23 11:50:41
收藏:0
阅读:57
评论:1
我正在评估 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 脚本方法对性能进行基准测试,但我肯定做错了些什么。
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?
- addEventListener 返回 nil Lua
- Lua中获取用户配置主目录的跨平台方法
与其关注问题标题(主要是因为我不确定您能否获得您想要的性能提升),我建议另一种方法,重点关注您后来添加到问题中的目标:
考虑到您对基于时间范围的兴趣,您可能会发现排序集更好。
排序集由元素组成,其中每个元素具有分数(双倍精度浮点数)和值(任何字符串,例如 JSON、使用 protobuf 序列化的对象)。
因此,您可以针对每只股票创建一个集合,并向集合中添加元素,其中分数是交易时间(以毫秒为单位),值是描述您的交易的一些字符串。例如,
然后,要查询给定时间范围内的所有交易,
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;