StackExchange.Redis 官方文档(五) Keys, Values and Channels
原文: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 而精挑细选出来的。但是,实际情况中你并不会直接接触这些类型。

posted on 2019-02-19 11:47 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/10400103.html

StackExchange.Redis 官方文档(五) Keys, Values and Channels相关推荐

  1. StackExchange.Redis官方文档(四)【键、值以及通道】

    键.值以及通道 在对待Redis时候,键和其他的事物之间有个相当重要的区别.键是在数据库中一段数据的唯一标识(可能String,List,Hash或者其他的Redis数据类型).键是没有任何实质意义, ...

  2. StackExchange.Redis 官方文档(二) Configuration

    配置 有多种方式可以配置redis,StackExchange.Redis提供了一个丰富的配置模型,在执行Connect (or ConnectAsync) 时被调用: var conn = Conn ...

  3. StackExchange.Redis 官方文档(六) PipelinesMultiplexers

    流水线和复用 糟糕的时间浪费.现代的计算机以惊人的速度产生大量的数据,而且高速网络通道(通常在重要的服务器之间同时存在多个链路)提供了很高的带宽,但是计算机花费了大量的时间在 等待数据 上面,这也是造 ...

  4. StackExchange.Redis官方文档(一)【基本用法】

    基本用法 ConnectionMultiplexer 类是StackExchange.Redis的中枢对象,它在StackExchange.Redis名称空间中: 这个对象封装了很多基础服务对象的详细 ...

  5. 《Redis官方文档》用Redis构建分布式锁

    <Redis官方文档>用Redis构建分布式锁 用Redis构建分布式锁 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现 ...

  6. Redis官方文档(入门必备)

    函数大全 中文文档 官方文档

  7. redis官方文档中文版_Partitioning : 怎么样将你的数据分布在多个redis instance上?

    本文转载自[url]http://skynetdoc.com/?p=119[/url] 本人顺便修正了一些文字上的复制粘贴小错误,以及更新了一些文字以和英文版保持一致. Partitioning 能够 ...

  8. 《Redis官方文档》用Redis构建分布式锁(悲观锁)

    2019独角兽企业重金招聘Python工程师标准>>> **用Redis构建分布式锁 ** 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章 ...

  9. 《Redis官方文档》 FAQ

    参考:http://ifeve.com/redis-faq/ 为什么Redis与其他的k-v存储相比不一样 有两个主要的原因 redis在键-值数据库中是一个不同的发展方向,值可以包含更复杂的数据类型 ...

最新文章

  1. 记录安装oracle的那些事(二)之双系统安装
  2. 工厂方法模式与IoC/DI
  3. ios视图frame和bounds的对比
  4. window环境变量
  5. com.alibaba.fastjson.JSONException: not close json text, token : :
  6. Eclipse 里一个 SAP Hybris Commerce 的开发插件
  7. 入门机器学习,这一步必不可少!
  8. python日历模块_Python日历模块| setfirstweekday()方法与示例
  9. wp8安装SSL证书
  10. BUAA_OO_博客作业3——规格
  11. 【Research Paper】
  12. android打开xlsx文件,如何在Android中打开.xlsx文件?
  13. 软件工程——数据字典
  14. win7下获取进程CPU,内存,IO等信息
  15. 创建maven项目时添加自定义property属性
  16. 千叶加密php,哪位大侠可以透漏一下千叶素是什么?
  17. 恋爱法则在学英语背单词中的应用
  18. 基于Python的蒙特卡罗方法估计Pi值的实现
  19. PJ331 PJ501超小型封装PFM DC/DC升压稳压器
  20. 简化 java.lang.Long 类的源码

热门文章

  1. linux 运行python 看不到异常信息_Linux异常解决:/usr/bin/env python\r no such file or directory...
  2. Mybatis Plus条件查询
  3. 电脑中毒了怎么办 电脑中病毒的解决方法
  4. 准备进入股市炒股,资金10万,各位能否给点建议?
  5. 卫生间装修有哪些技巧?
  6. 经历过贫穷,才知道做穷人意味着什么
  7. 个人品牌遇到危机怎么办?
  8. 有运气的赚钱,不如有成长的失败
  9. 做互联网项目一定要做可循环,可积累的事情
  10. 响应函数sys_xxx