全部 android asp.net C/C++ cshap IOS Java javascript nodejs perl php python ruby web容器 其他 前端 数据库 第三方平台 混合式APP 网络 系统 默认分类

Redis学习笔记~关于空间换时间的查询案例

0 295

回到目录

空间与时间

空间换时间是在数据库中经常出现的术语,简单说就是把查询需要的条件进行索引的存储,然后查询时为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,解决这个问题,这类似于关系数据库里的全表扫描+索引技术!

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" alt="" />

实现程序:先通过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");
        }

通过这个实例让我们知道,做成一件事,可能一步不行,但多几步一定可以实现!

回到目录

热忱回答0

  • 加入年费大会员(20每年)
  • 热门标签

    猜你喜欢

    1. yii中调整ActiveForm表单样式
    2. lua元表以及元方法
    3. 机器学习中的贝叶斯方法---先验概率、似然函数、后验概率的理解及如何使用贝叶斯进行模型预测(1)
    4. OA办公自动化系统
    5. 行转列面试题 事例
    6. 支持向量机高斯核调参小结
    7. 威客网站哪个好啊?一品威客怎么样?
    8. GTD:让大脑用来思考,而不是用来记事!
    9. 三、SolrCloud的搭建
    10. angularjs中的页面访问权限设置

    衣食父母

    最近热帖

    1. 1分钟选好最合适你的JavaScript框架 3
    2. 关于前端的photoshop初探的学习笔记 3
    3. iOS用域名或主机名获取IP地址(包含C语言接口 和iOS原生) 9
    4. phpstorm激活码生成器地址 9
    5. Angular4 组件通讯方法大全 8
    6. SignalR在ASP.NET MVC中的应用 8
    7. 一份关于npm的新手指南 8
    8. 二叉树及二叉树的基本操作(基础面试题型) 9
    9. Kibana5 数据探索使用(Discover功能) 9
    10. Redis数据类型 10

    随机文章

    1. 基于python的性能负载测试Locus-2-快速入门
    2. 自己动手写RPC框架到dubbo的服务动态注册,服务路由,负载均衡功能实现
    3. java for循环 <数字金子塔>
    4. Android指纹识别深入浅出分析到实战(适配6.0以下系统解决方案)
    5. Zookeeper 分布式锁原理