Redis入门指引

LuaAgosto 7年前
   <h2>概述</h2>    <p>本文算是一篇翻译,原文是 Try Redis 中提供的英文指引。Try Redis提供了一个控制台作为客户端,你可以在这里输入redis的指令来学习redis。这是一个非常棒的做法。</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/8d267ca02cf8d891f02879ea341286c2.png"></p>    <p style="text-align:center">Try Redis</p>    <p>关于Redis说点什么,目前我们公司的项目使用Redis作为数据缓存,缓存的目标主要是那些需要经常访问的数据,或计算复杂而耗时的数据。缓存的效果就是减少了数据库读的次数,减少了复杂数据的计算次数,从而提高了服务器的性能。</p>    <p>好了,下面开始Try Redis的指引内容。</p>    <h2>Try Redis指引</h2>    <h2>说明</h2>    <p>TRY REDIS是Redis数据库的一个范例。这里提供了服务器和客户端让你学习Redis。</p>    <p>在这里你可以输入tutorial获取简要的教程,输入help获取支持的命令列表。输入redis命令来和后台的数据库进行交互,用来实践。</p>    <h2>数据类型:string</h2>    <h3>SET & GET</h3>    <p>Redis是一个基于key-value存储的服务器,经常被看作一个NoSQL数据库。Key-value存储的本质,是可以提供存储一些数据的能力。这些数据被称为value,放到key里面。存储的value可以被检索出来,检索的唯一途径是提供存储时使用的key。我们可以使用SET命令,将value "fido"存储到key "server:name"里面。</p>    <pre>  <code class="language-groovy">SET server:name "fido"</code></pre>    <p>Redis会把我们的数据存储起来,之后我们问"key server:name里存储的value是什么?",Redis会回答"fido"。</p>    <pre>  <code class="language-groovy">GET server:name => "fido"</code></pre>    <p>提示:箭头(=>)之后的问题,是命令的输出结果。</p>    <h3>常用的命令</h3>    <p>其他常用的命令有:</p>    <ul>     <li>DEL:删除指定的key,和相关的value</li>     <li>SETNX:SET-if-not-exists,仅当这个key不存在的时候,设置这个key。SET命令有可能是新增一个key-value,也有可能是修改一个已有的key。而SETNX命令保证只会新增,不会去覆盖已有的值。</li>     <li>INCR:指定一个key,这个key里面存储的是一个数字,对这个数字进行原子递增。如果指定的key原本不存在,当作0处理。</li>    </ul>    <pre>  <code class="language-groovy">SET connections 10  INCR connections => 11  INCR connections => 12  DEL connections  INCR connections => 1</code></pre>    <h3>原子操作</h3>    <p>INCR命令有些特殊,为什么我们要提供这个命令呢?我们似乎可以用一小段代码来实现这个功能:</p>    <pre>  <code class="language-groovy">x = GET count  x = x + 1  SET count x</code></pre>    <p>如果只有一个客户端使用这个key,那是没有问题的。但是如果两个客户端同时访问这个key,可能会发生下面的情况:</p>    <pre>  <code class="language-groovy">1. Client A 读取count,结果为10  2. Client B 读取count,结果为10  3. Client A 递增,设置count为11  4. Client B 递增,设置count为11</code></pre>    <p>我们想把这个值变成12,结果却是11。出现这个问题是因为这种递增的方式不是原子操作。INCR命令提供了原子操作性质的递增功能,可以避免这种情况。Redis针对不同的数据类型,提供了很多的原子命令。</p>    <h3>有效期</h3>    <p>你可以告诉Redis,一个key只存在一段时间。这个功能由EXPIRE和TTL实现。</p>    <pre>  <code class="language-groovy">SET resource:lock "Redis Demo"  EXPIRE resource:lock 120</code></pre>    <p>这将导致key resource:lock在120秒后被删除。你可以使用TTL命令查看一个key的剩余存活时间,它返回一个秒数。</p>    <pre>  <code class="language-groovy">TTL resource:lock => 113 // 离被删除时间还有113秒  TTL resource:lock => -2   // 已经被删除</code></pre>    <p>TTL返回-2,表示这个key已经不存在了。如果返回-1,表示这个key永远不会到期。如果设置一个key,它的TTL将被重置。</p>    <pre>  <code class="language-groovy">SET resource:lock "Redis Demo 1"  EXPIRE resource:lock 120  TTL resource:lock => 119  SET resource:lock "Redis Demo 2"  TTL resource:lock => -1</code></pre>    <h2>数据类型:list</h2>    <p>Redis还提供了集合复杂的数据结构,第一个我们要研究的是一个list。一个list就是一组有序的值。list特有的命令中,最重要的几个是RPUSH、LPUSH、LLEN、LRANGE、LPOP、RPOP。</p>    <p>RPUSH在list的尾部放一个新的value。</p>    <pre>  <code class="language-groovy">RPUSH friends "Alice"  RPUSH friends "Bob"</code></pre>    <p>LPUSH在list的头部放一个新的value。</p>    <pre>  <code class="language-groovy">LPUSH friends "Sam"</code></pre>    <p>LRANGE返回list的一个子集,它的第一个参数是第一个元素的索引,第二个参数是最后一个元素的索引。负数表示从尾部开始的索引,比如-1表示最后一个。list的第一个元素的索引用0表示,所以0 -1将返回list所有的元素。</p>    <pre>  <code class="language-groovy">LRANGE friends 0 -1 => 1) "Sam" 2) "Alice 3) "Bob"  LRANGE friends 0 1 => 1) "Sam" 2) "Alice"  LRANGE friends 1 2 => 1) "Alice" 2) "Bob"</code></pre>    <p>LLEN返回list的当前长度.</p>    <pre>  <code class="language-groovy">LLEN friends => 3</code></pre>    <p>LPOP移除list的第一个元素并返回它。</p>    <pre>  <code class="language-groovy">LPOP friends => "Sam"</code></pre>    <p>RPOP移除list的最后一个元素并返回它。</p>    <pre>  <code class="language-groovy">RPOP friends => "Bob"</code></pre>    <p>现在,list中只有一个元素了。</p>    <pre>  <code class="language-groovy">LLEN friends => 1  LRANGE friends 0 -1 => 1) "Alice"</code></pre>    <h2>数据类型:set</h2>    <p>下一个我们要研究的是set。set和list很像,唯一不同的两点:set是无序的,而且每一个元素只能出现一次。相关的重要命令有SADD、SREM、SISMEMBER、SMEMBERS和SUNION。</p>    <p>SADD添加指定的vlue到这个set。</p>    <pre>  <code class="language-groovy">SADD superpowers "flight"  SADD superpowers "x-ray vision"  SADD superpowers "reflexes"</code></pre>    <p>SREM从set中移除指定的value。</p>    <pre>  <code class="language-groovy">SREM superpowers "reflexes"</code></pre>    <p>SISMEMBER测试一个指定的value是否在set里。如果存在,返回1;否则返回0。</p>    <pre>  <code class="language-groovy">SISMEMBER superpowers "flight" => 1  SISMEMBER superpowers "reflexes" => 0</code></pre>    <p>SMEMBERS返回set中的所有的成员。</p>    <pre>  <code class="language-groovy">SMEMBERS superpowers => 1) "flight" 2) "x-rey vision"</code></pre>    <p>SUNION联合2或多个set,返回他们的并集。</p>    <pre>  <code class="language-groovy">SADD birdpowers "pecking"  SADD birdpowers "flight"  SUNION superpowers birdpowers => 1) "pecking" 2) "x-ray vision" 3) "flight"</code></pre>    <h2>数据类型:sorted set</h2>    <p>set是一个非常方便的数据类型,但是因为是无序的,所以有些情况下并不合适。所以Redis在1.2推出了sorted set。</p>    <p>sorted set和set很像,不同的是它为每一个value关联了一个score,这个score用来排序。</p>    <pre>  <code class="language-groovy">ZADD hackers 1940 "Alian Kay"  ZADD hackers 1906 "Grace Hopper"  ZADD hackers 1953 "Richard Stallman"  ZADD hackers 1965 "Yukihiro Matsumoto"  ZADD hackers 1916 "Claude Shannon"  ZADD hackers 1969 "Linus Torvalds"  ZADD hackers 1957 "Sophie Wilson"  ZADD hackers 1912 "Alan Turing"</code></pre>    <p>在上面的例子中,score是出生的年份,value是姓名。</p>    <pre>  <code class="language-groovy">ZRANGE hackers 2 4 => 1) "Claude Shannon" 2) "Alan Kay" 3) "Richard Stallman"</code></pre>    <h2>数据类型:hash</h2>    <p>接下来介绍hash类型。</p>    <p>hash是一个映射结构,从字符串类型的域到字符串类型的value。所以很适合用来表示对象(比如用户对象,含有一些域,像姓名、年龄等等):</p>    <pre>  <code class="language-groovy">HSET user:1000 name "John Smith"  HSET user:1000 email "join.smith@example.com"  HSET user:1000 password "s3cret"</code></pre>    <p>获取数据使用HGETALL命令:</p>    <pre>  <code class="language-groovy">HGETALL user:1000</code></pre>    <p>可以同时设置多个域:</p>    <pre>  <code class="language-groovy">HMSET user:1001 name "Mary Jones" password "hidden" email "mjones@example.com"</code></pre>    <p>可以只读取一个域:</p>    <pre>  <code class="language-groovy">HGET user:1001 name => "Mary Jones"</code></pre>    <p>存储在hash的域里的数字,也可以以原子的方式进行递增。</p>    <pre>  <code class="language-groovy">HSET user:1000 visits 10  HINCRBY user:1000 visits 1 => 11  HINCRBY user:1000 visits 10 => 21  HDEL user:1000 visits  HINCRBY user:1000 visits 1 => 1</code></pre>    <p><a href="/misc/goto?guid=4959735180611646147" rel="nofollow,noindex">这里</a> 有hash支持的所有命令。</p>    <h2>继续</h2>    <p>Try Redis的用户指南已经讲完了,你可以尽情的使用这里提供的控制台。</p>    <p>通过下面的链接,继续学习Redis相关的知识:</p>    <p> </p>    <p>来自:http://www.jianshu.com/p/8ab0a498005c</p>    <p> </p>