zoukankan      html  css  js  c++  java
  • StackExchange.Redis 官方文档(五) Keys, Values and Channels

    Keys, Values and Channels

    在使用redis的过程中,要注意到 keyeverthing else 有很大不同.一个key是在同一个数据库当中一个数据片段(可能是String、List、Hash,或者其他的redis数据类型)所特有的名称。key并不会被执行。进一步来说,在使用集群或者其他的分片系统时,key定义了哪一个节点存储了这个数据。所以key对于 routing command 是很重要的

    而 value 有很大的不同:value是key对应的存储的数据 - 也许是一个独立的数据(像 String 数据),也许是多个value组成的一个群体。value不会影响routing command(注意:除了 SORT 命令,并且指定了 BY or GET 参数,其中的逻辑很难去解释).相对应的是 value 经常被redis作为操作的目标来解释执行:

    • incr (和其他几个相似的命令) 将 String 类型的 value 作为数据类型来执行
    • 排序(使用数据 或者 unicode的排序规则)
    • 其他

    关键点是api需要理解什么是key和什么是value。这在 StackExchange.Redis Api 中得到充分的表现,但是好消息是在大部分情况下你根本不需要知道它是什么。

    在使用 pub/sub时,我们会使用到 channels:channel不会影响routing command (所以它们并不是key),但是和通常value也有很大的不同,所有它们被单独进行处理。

    Keys

    StackExchange.Redis 使用RedisKey代表key的类型.他会把在stringbyte[]类型之间进行隐式的转换,从而允许使用字符串和二进制数据作为key,避免复杂化。举个例子来说,StringIncrement方法使用RedisKey作为第一个参数,但是你根本不需要知道它是需要什么类型的,例:

    string key = ...
    db.StringIncrement(key);
    

    or

    byte[] key = ...
    db.StringIncrement(key);
    

    同时,它会在某些操作返回的key作为 RedisKey

    string someKey = db.KeyRandom();
    

    Values

    StackExchange.Redis 使用RedisValue类型作为值的类型.正如RedisKey,这些转换都是在隐式进行的,所以在大部分时间,你都不会看到这个数据类型,例:

    db.StringSet("mykey", "myvalue");
    

    除了字符串和二进制的数据,value支持.net中大部分的原始数据类型 Int32, Int64, Double or Boolean:

    db.StringSet("mykey", 123); // this is still a RedisKey and RedisValue
    ...
    int i = (int)db.StringGet("mykey");
    

    注意:从原始数据类型到RedisValue类型是隐式的,但是从RedisValue转换到原始数据类型是显示的:这是以为数据在没有合适的值的时候转换会失败。

    注意:在操作数值类型时,redis会把不存在的key的值作为0处理;为了保持一致性,nil返回值将会认为0值:

    db.KeyDelete("abc");
    int i = (int)db.StringGet("abc"); // this is ZERO
    

    如果你要检测nil的情况,你可以使用下面的方法:

    db.KeyDelete("abc");
    var value = db.StringGet("abc");
    bool isNil = value.IsNull; // this is true
    

    或者更简单点,使用Nullable<T>

    db.KeyDelete("abc");
    var value = (int?)db.StringGet("abc"); // behaves as you would expect
    

    Hashes

    field的名称不是key,数据类型可以是字符串或者是二进制;所以,在api中它们被当作value来处理。

    Channels

    pub/sub的频道名称是 RedisChannel类型

    Scripting

    Lua scripting in redis 有两个显著的特点:

    • 输入必须将key和value分开 (在script中各自将会变成 KEYS and ARGV)
    • 返回的格式没有预先定义的,不同的脚本可能有不同的格式

    因此,ScriptEvaluate方法接受两个分开的参数数组: RedisKey[]RedisValue[](两个都是可选的,如果省略将会认为空),这可能是少数几种需要指定RedisKey或者RedisValue类型的情况之一:

    var result = db.ScriptEvaluate(TransferScript,
        new RedisKey[] { from, to }, new RedisValue[] { quantity });
    

    (TransferScript是包含Lua加班呢的string,这里将不做展示)

    返回类型RedisResult(对于脚本所特有的:通常api将会尽可能直接和清楚的表示返回结果)。之前,RedisResult提供了一系列的转换操作-比RedisValue更多:

    string[] items = db.ScriptEvaluate(...);
    

    总结

    api中用到的数据类型都是用来区分 从keyvalue 而精挑细选出来的。但是,实际情况中你并不会直接接触这些类型。

  • 相关阅读:
    Silverlight之各种线程的操作
    MVVM之Event and Command
    Silverlight之DescriptionViewer
    MVVM之Validation
    蚁群算法(C语言实现)
    最小生成树的prim算法
    关于HashMap、LinkedHashMap与TreeMap
    Slope One :简单高效的协同过滤算法(Collaborative Filtering)——转
    java中使用匿名类重写
    Session学习:防止用户重复提交表单(单态设计模式原子设计模式+MD5技术&Base64算法)
  • 原文地址:https://www.cnblogs.com/ArvinZhao/p/6108267.html
Copyright © 2011-2022 走看看