Redis学习笔记~关于空间换时间的查询案例
空间与时间
空间换时间是在数据库中经常出现的术语,简单说就是把查询需要的条件进行索引的存储,然后查询时为O(1)的时间复杂度来快速获取数据,从而达到了使用空间存储来换快速的时间响应!对于redis这个k/v存储系统来说,复杂的查询不是它所建议的,它的优势在于通过key快速定位数据,它定位数据的速度与数据多少没有直接关系,无论是1万还是1亿数据,它定位的时间复杂度都是O(1),而在实际使用中,可能不简单使用key定位数据就够了,可能还需要数据里的某个属性去定位数据,这种情况第一感觉不能用redis,或者说,不能用k/v存储系统了,但这不是我们应该说的,我们要的是解决方案,换个角度去思考,我们是否可以把那个属性拿出来当新的key,把原来的key当作它的value呢,答案是肯定的,这就是用空间到换时间,只需要两个查询就可以搞定了!
上面是一个100万的hash集合,key是用户id,value是一个用户实体,我们通过RedisClient.RedisManager.Instance.GetDatabase().HashGet("VoteList", id)很方便的可以拿到对应的用户实体!
我希望通过用户名拿到用户实体?
这种需求,我们不要直接解决,如果直接解决,那唯一的办法就是遍历所有数据,然后一一对比,时间复杂度就是O(N),太可怕了!
通过添加新的k/v,解决这个问题,这类似于关系数据库里的全表扫描+索引技术!
实现程序:先通过userName找到UserId,再通过UserId找到用户实体!
[TestMethod] public void FindBigData() { Stopwatch sw = new Stopwatch(); sw.Start(); var name = RedisClient.RedisManager.Instance.GetDatabase().HashGet("VoteList_UserName", "zzl15");//找到用户ID if (name.HasValue) { var val = RedisClient.RedisManager.Instance.GetDatabase().HashGet("VoteList", name);//找到用户实体 Console.WriteLine("name={0},value={1}", name, val); } else { Console.WriteLine("没有发现这个Key"); } sw.Stop(); Console.WriteLine("查询需要的时间:" + sw.ElapsedMilliseconds + "ms"); }
通过这个实例让我们知道,做成一件事,可能一步不行,但多几步一定可以实现!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
2015-11-11 Lind.DDD敏捷领域驱动框架~Lind.DDD各层介绍
2014-11-11 第九回 Microsoft.Practices.Unity.Interception实现基于数据集的缓存(针对六,七,八讲的具体概念和配置的解说)
2013-11-11 我心中的核心组件(可插拔的AOP)~第五回 消息组件
2011-11-11 (SQL)比较一个集合是否在另一个集合里存在的方法
2011-11-11 LINQ TO SQL数据实体应该这样设计(解决多表关联问题)