Redis 数据类型及抽象

论坛 期权论坛     
选择匿名的用户   2021-5-30 03:15   423   0
<div class="content" id="articleContent">
<div class="ad-wrap">
</div>
<p>原文同步至<a href="http://waylau.com/redis-data-type/">http://waylau.com/redis-data-type/</a><br> (若打不开,请翻墙,或者使用https访问)</p>
<p>Redis 不仅仅是简单的 key value 存储,实际上它还是一个 data strutures server(据数结构服务器),用以支持不同的数值类型。在 key value 中,value 不仅仅局限于 string 类型,它可以是更复杂的数据结构:</p>
<ul><li>二进制安全的 string;</li><li>List:一个链表,链表中的元素按照插入顺序排列;</li><li>Set:string 集合,集合中元素是唯一,没有排序</li><li>Sorted set: 和 Set 类似,但是每一个 string 元素关联一个浮点数值。这个数值被称为 Score。元素总是通过他们的 Score 进行排序,所以不像 Set,它可以获取一段范围的元素(例如,获取前10个,或者后10个)。</li><li>Hash:Hash 就是由关联值的字段构成的 Map。字段和值都是 string。这个与 Ruby 或 Python 的 hash 很类似。</li><li>Bit array(或者简单称为 Bitmap):像位数值一样通过特别的命令处理字符串:你可以设置和清除单独的 bit,统计所有 bit 集合中为1的数量,查找第一个设置或者没有设置的 bit 等等。</li><li>HyperLogLogs:这是一个概率统计用的数据结构,可以被用来估计一个集合的基数。</li></ul>
<p>对于所有的例子,我们都使用 redis-cli 工具来演示。这是一个简单但是非常有用的命令行工具,可以用来发送命令给 Redis Server。</p>
<h3>1. Redis key</h3>
<p>Redis key 是二进制安全的。这意味着你可以使用任何二进制序列作为key, 如从一个像&#34;foo&#34;的字符串到一个 JPEG 文件的内容。空字符串也是一个有效的 key。</p>
<p>关于 key 的一些其它规则:</p>
<ul><li>不建议使用非常长的 Key。这不仅仅是考虑内存方面问题, 而且在数据集中查找 key 可能需要和多个 key 进行比较。如果当前的任务需要使用一个很大值,将它进行 hash 是一个不错的方案(例如,使用SHA1),尤其是从内存和带宽的角度考虑。</li><li>非常短的 key 往往也不是一个好主意。如果你可以将 key 写成“user:1000:followers”,就不要使用“u1000flw”。因为,首先前者更加具有可读性,其次增加的空间相比 key 对象本身和值对象占用的空间是很小的。当然,短 key 显然会消耗更少的内存,你需要找到一个适当的平衡。</li><li>努力坚持使用模式。例如像“user:1000”这样的“object-type:id”模式是一个好主意。点和连接线通常被用在多个单词的字段,例如“comment:1234:reply.to”或者“comment:1234:reply-to”。</li><li>允许 key 最大的大小是512MB。</li></ul>
<h3>2. Redis String</h3>
<p>Redis String 类型是关联到 Redis key 最简单的值类型。它是Memcached 中唯一数据类型,所以对于 Redis 新手来说,使用它也是非常自然的。</p>
<p>因为 Redis key 是 String, 所以当我们使用 String 类型作为 value 时, 其实就是将一个 String 映射到另一个 String。String 数据类型对于大量的用例是非常有用的,如缓存 HTML 片段或者页面。</p>
<p>让我们一起使用 redis-cli 来操作下 String 类型:</p>
<pre class="blockcode"><code>&gt; set mykey somevalue
OK
&gt; get mykey
&#34;somevalue&#34;
</code></pre>
<p>使用 SET 和 GET 命令可以设置和获取 String 值。注意 SET 会替换已经存入到 key 中的任何值,即使这个 key 存在的不是 String 值。所以SET 执行一次分配。</p>
<p>值可以是任何类型的 String(包括二进制数据), 例如你可以存一个jpeg 图片到一个 key 中。但值不能超过512MB大小。</p>
<p>SET 命令有一些有趣的选项,这些选项可以通过额外的参数来设置。例如,</p>
<ul><li>NX——只在 key 不存在的情况下执行</li><li>XX——只在 key 存在的情况下执行</li></ul>
<p>下面是操作示例:</p>
<pre class="blockcode"><code>&gt; set mykey somevalue
OK
&gt; get mykey
&#34;somevalue&#34;
</code></pre>
<p>String 是 Redis 的基础值,你可以对它们进行一些有意思的操作。例如,进行原子递增:</p>
<pre class="blockcode"><code>&gt; set counter 100
OK
&gt; incr counter
(integer) 101
&gt; incr counter
(integer) 102
&gt; incrby counter 50
(integer) 152
</code></pre>
<p>INCR 命令将 String 值解析为 Integer,然后将它递增1,最后将新值作为返回值。这里也有一些类似的命令,如 INCRBY、DECR 和 DCRBY。在内部它们是相同的命令,并且执行方式的差别非常微小。</p>
<p>INCR 命令是原子操作意味着什么?这表示即使多个客户端对同一个 key 发送 INCR 命令也不会导致
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP