StackExchange.Redis 官方文档(五) Keys, Values and Channels
原文:StackExchange.Redis 官方文档(五) Keys, Values and Channels
Keys, Values and Channels
在使用redis的过程中,要注意到 key 和 everthing 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的类型.他会把在string 和 byte[]类型之间进行隐式的转换,从而允许使用字符串和二进制数据作为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中各自将会变成
KEYSandARGV) - 返回的格式没有预先定义的,不同的脚本可能有不同的格式
因此,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中用到的数据类型都是用来区分 从key 到 value 而精挑细选出来的。但是,实际情况中你并不会直接接触这些类型。
StackExchange.Redis 官方文档(五) Keys, Values and Channels的更多相关文章
- StackExchange.Redis 官方文档
原文:StackExchange.Redis 官方文档 时隔多年的翻译终于完成了第六个,也是很重要的的官方文档,是介绍有关链接管理,管道流水线和多路复用的 官方地址在这里:官方文档 下面做个汇总: S ...
- StackExchange.Redis 官方文档(六) PipelinesMultiplexers
原文:StackExchange.Redis 官方文档(六) PipelinesMultiplexers 流水线和复用 糟糕的时间浪费.现代的计算机以惊人的速度产生大量的数据,而且高速网络通道(通常在 ...
- StackExchange.Redis 官方文档(四) KeysScan
KEYS, SCAN, FLUSHDB 方法在哪? 经常有人问这些问题: 好像并没有看到 Keys(...) 或者 Scan(...)方法?那我要怎么查询数据库里面存有哪些key? 或者 好像没有Fl ...
- StackExchange.Redis 官方文档(一) Basics
基本使用方法: StackExchange.Redis的核心是 StackExchange.Redis 命名空间的 ConnectionMultiplexer 类;它隐藏了多服务器的实现细节.Conn ...
- StackExchange.Redis 官方文档(三) Events
事件 ConnectionMultiplexer类型提供了很多可以用来了解表面状态下正在发生着什么的事件.这对日志是很有用的. ConfigurationChanged - ConnectionMul ...
- StackExchange.Redis 官方文档(二) Configuration
配置 有多种方式可以配置redis,StackExchange.Redis提供了一个丰富的配置模型,在执行Connect (or ConnectAsync) 时被调用: var conn = Conn ...
- Redis官方文档》持久化
原文链接 译者:Alexandar Mahone 这篇文章从技术层面描述了Redis持久化,建议所有读者阅读.如果希望更多了解Redis持久化和持久性保障,建议阅读Redis持久化揭秘. Redis ...
- Redis官方文档资源
官方文档: 如果要深入研究时,官方提供的文档是最权威的. 英文: https://redis.io/documentation 中文: http://www.redis.cn/documentatio ...
- 《Redis官方文档》用Redis构建分布式锁
用Redis构建分布式锁 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章描述如何用Redis实现一个分布式锁管理器,但是这些库实现的方式差别很大,而且很多简 ...
随机推荐
- ASP.NET中的几种弹出框提示
B/S不像C/S那样一个MessageBox就可以弹出提示框,不过可以通过js的“Alert”来弹出消息,或者通过一些变种的js方法.下面我给大家介绍几种,希望大家喜欢. 四种弹出框代码: prote ...
- iOS8 对开发人员来说意味着什么?
今天凌晨.Apple WWDC2014 iOS8 正式推出. 或许,对于广大iOS用户来说,iOS8的创新并非特别多. 但对于开发人员来说,影响却将会是无比巨大的! 正如Apple官网上的广告:Hug ...
- Resize图片
在网站上传图片的时候,提示图片太大了. 有5种方式来调整图片大小 http://www.wikihow.com/Resize-a-JPEG picresize.com 这个网站比较靠谱:使用Windo ...
- Js经典实例收集
跨浏览器添加事件 //跨浏览器添加事件 function addEvent(obj,type,fn){ if(obj.addEventListener){ obj.addEventListener(t ...
- BZOJ 2037 区间DP
跟POJ 3042是一个类型的http://blog.csdn.net/qq_31785871/article/details/52954924 思路: 先排个序 (把初始位置也插进去) f[i][j ...
- 分享一段css代码学到的js知识
[].forEach.call($$('*'),function(val){ val.style.outline = '1px solid #'+(~~(Math.random()*(1<< ...
- 使用Java语言开发微信公众平台(六)——获取access_token
在前四期的文章中,我们分别学习了“环境搭建与开发接入”.“文本消息的接收与响应”.“被关注回复与关键词回复”.“图文消息的发送与响应”等环节.那么,从本篇博文开始,我们将进去更高级的 ...
- js中对数组的操作-------Day49
今天碰到了一个问题:easyui的使用中,datagrid表格的高度怎样改变(设定成一个固定的高度),看了半天文档,也从网上查了些.还楞是没弄出来,有点小郁闷.这easyui在某些情况情况下确实好用了 ...
- 如果笔记本的 WIN7 运行很卡,请尝试运行这些批处理
如果笔记本的 WIN7 运行很卡,请尝试运行这些批处理 WIN7是不是很卡?关掉下列服务吧 @echo off rem AppXSvc 为部署应用商店应用程序提供基础结构支持 rem BITS 微软的 ...
- 76.CGI编码
CGI编码 "%D6%DC%C8%F0%B8%A3"; 转换到字符串中: //CGI编码转到char类型的tmpstr中中 char* change(char *str) { // ...