做者好牛逼,我不懂的他全都懂。程序员
Redis: Zero to Master in 30 minutes - Part 1redis
再说一次,老子以为你若是是真的程序员,30分钟就能精通 Redis。这充分证实了 Redis 有多牛逼而且是多显而易见的简单。不过话说回来,以你的水平,你真以为你真的能在30分钟内精通 Redis?额呵呵呵呵呵呵~~json
不服你来试试看啊。在这章咱们来说讲什么是 Redis。下一章咱们作一个简单的例子。嘛,剩下的时间,一边玩去。数组
Redis 简介数据结构
Redis 一般被描述为一个"键值存储引擎",没错,就是这样,啊,不过超难理解对不对。好吧,我以为把它当作一个数据结构引擎看起来比较通俗易懂。怎么说呢,Redis 支持五种不一样的元素,只要你收集到这五种不一样的元素,就什么都不会发生: strings, hashes, lists, sets 和 ordered sets。每一种数据结构有它的特色和支持的指令。无论哪一种类型,都是用 Key 访问 Value。而 Key 是以 byte array 形式保存所以能够很复杂,不过以你的水平,我以为你大多数状况下会用 string 保存,额呵呵呵呵呵呵~。app
来看看每种类型:网站
Strings:.net
Strings 是五元素中最简单的,同时也最没名堂的,嗯,好比你说"String",人家都不知道你想说啥。或者你能够说"Single"或者"Simple",更容易让人理解。提到 Redis ,或者说键值对的时候,一般会想到 String 结构(记住哦,只是五分之一而已)。就像 Key,一个 String 的 Value 也能够是任何的字节数组。你能够用来存增加的Integer计数器,或者实际的字符串,或者序列化的对象(blob)。全部的这些都很常见,最多见的字符串操做是 GET 和 SET。调试
<!-- lang: js --> SET pages:about "about us" GET pages:about about us
固然你还能够拿它作不少事情,由于还有许多其余的命令(好比 INCR 或者 GETRANGE),并且咱们不单能够把一个数字存成字符串,好比,咱们还能够拿 String 结构来存用户,Key 是用户的 Email,而 Value 是序列化的用户对象。code
Hashes
Hash 结构,就像你想的那样(一个 hash/dictionary)。处理的时候不是直接操做 Key (好比说 String 结构),而是 Key 的字段。所以咱们不单是get/set一个哈希值,而是get/set一个哈希字段:
<!-- lang: js --> HSET goku power 9001 HGET goku power 9001
和 Redis 其余部分同样,字段和值的最终形态是字节数组,所以也能够是任何东西。字段,好比说 Key, 通常来讲是字符串。我以为你如今脑子里面必定想,我操,和字符串有啥区别。想得好!好比说,下面这两个有啥区别?(用 json 来表示一个复杂的值,你能够把它序列化成一个字节数组的。)
<!-- lang: js --> SET users:goku {race: 'sayan', power: 9001} HSET users:goku race sayan HSET users:goku power 9001
嗯,区别在于你接下来准备怎么玩它。若是你须要对单个字段进行控制,而且你不但愿把整个对象都弄到你应用里面,用哈希,要否则用字符串也挺好。
Lists
Lists 让你把一组值关联到一个 Key 上。实际上,你能够(或者说应该)把他们想成动态的数组。你能够插(insert),添(append),弹(pop),推(push),掐(trim),以及嗯,之类的手段玩它。 Redis 不支持二级索引。因此你能够访问数组的 Key,填补这一空白(固然这也不是惟一用途)。
<!-- lang: js --> length = redis.lpush('users:newest', 'user:goku') if length > 100 #trim is to we only keep 100 "newest" users redis.rpop('users:newest') end
上面的代码在列表中维护了一个最新注册用户的引用。在这里咱们实时维护列表的长度,能够把它仍到后台去。怎么作呢?:
<!-- lang: js --> # get the 10 newest users keys = redis.lrange('users:newest', 0, 10) #multi get the actual 10 user objects redis.mget(*keys)
传统上,开发者应该避免这样的屡次查询。可是 Redis, 这很常见,超快(由于全部的东西都在内存)。
Sets
Set 和 List 差很少,不过 Set 就是Set(不容许有重复值)。你能够比较两个Set,经过用 SDIFF,或者组合,经过用 SUNION/ SUNIONSTORE (若是你想把结果保存在另一个 Set 而不是直接返回的话),等等。Set 一样能够用在跟踪朋友圈和标签上:
<!-- lang: js --> SADD friends:leto ghanima SADD friends:leto duncan SADD friends:paul duncan SADD friends:paul gurney SINTER friends:leto friends:paul 1) "duncan"
Sorted Sets
一般咱们不说一种数据结构比另一种数据结构牛逼。由于原本就是独立解决需求的。不过 Soted Set 真的好牛逼。一个 Sorted Set 和 Set 很像,可是它的值和排序权重关联。也就是说,当你往 Sorted Set 里面追加一个值的时候,你能够指定一个权重,这决定你插到哪里。好比说前面的例子,咱们能够给数据加上一个权重:
<!-- lang: js --> ZADD friends:leto 1000 ghanima ZADD friends:leto 994 duncan ZADD friends:leto 2 farad'n ZRANGEBYSCORE friends:leto 500 1000 1) "duncan" 2) "ghanima"
上面这个例子拿到了权重在 500-1000 的朋友数据。
Sorted set 固然不只仅用在朋友圈,权重属性能够被用在时间序列(好比说用从1970年到如今的毫秒作权重),或者,好比说我,我用玩家的游戏得分来排序他们。
Redis 查询
在 Redis 中,只能用它的 key 来查询数据。及时你用了 Hash, 咱们也不能说: 嘿,把那个 race 字段等于 sayan 的 keys 给我。咱们看看 List,咱们是怎样建立咱们的二级索引的。管理你的二级索引会超痛苦,有时候还很难扩展。不过,这里有两件事应该记住。首先,不论是简单仍是复杂的场景,你都应该在敲定以前,先把玩把玩,没啥大不了的,花不了几分钟。第二,don't get hung up with hitting Redis multiple times.
除了五种结构, Redis 还有便利全部 Key的命令(所谓的 key-commands)。好比说 DEL,EXISTS 和 RENAME。也许最经常使用的是 KEYS 命令,会给你返回 keys。好比说, mogade.com 把平常的排行榜以keys来存储,看起来像这样: ranks:daily:GAME_ID:20110830。若是我但愿把八月份的数据全删了,那么我会:
<!-- lang: js --> keys = redis.keys("ranks:daily:*:201108*") redis.del(*keys)
注意: keys 命令会遍历你全部的 keys 来查找匹配值。这会很是慢。文档建议你只在调试或者开发的时候用它。
补充
Redis 很是容易安装和维护,数据在硬盘上以单文件形式保存,你要备份的时候就拷贝多一份就能够了。只要一个简单的配置文件就能驱动它。
你的全部数据应该适合放到内存中。它支持虚拟内存,不过看起来(做者)失败了。它过期了,也许在将来会被从功能里面移除。
Redis 支持 master-slave replication。但是它不支持自动失效备援,也不会作任何形式的分片。你须要本身去作这些事情,好比说用HAProxy。Redis Cluster 听说会对这些进行补充,咱们应该很快就会看到一个早期发行版。(若是你感兴趣,你能够从这里找到它)。
Redis 还有许多超赞的特性。好比说它支持事务,有好多命令,不少管理功能,Key 能够自动实现,以及订阅发布 API,等等。以我这种挑剔的眼光来开,我也对 Redis 文档和参考文档佩服得五体投地。
何时用 Redis
Redis 比其余不少存储解决方案都要专业。复杂的系统中正确的打开方式是按功能特性来划分,不须要看考虑整个系统。它要求把全部的东西都扔内存里面,多少让你以为不太爽。可是,当你给合适的功能赋予合适的模型的时候,绝对爽死。Redis超快而API简单到死。我已经把几百行的查询代码转成了只要几个参数的方法了。
最后,再说一次,Redis 简单到爆,你面对一个问题的时候,超容易判断,是否是适合用 Redis。有时候适用有时候又不适用。
结论
把 Redis 单纯看做一个键值存储是不对的,它比这牛逼多了。也就是说,你应该用不一样的方式来考虑你的数据模型。有时候它不起做用,可是一旦用起来了...好爽。(你觉得你是段誉的六脉神剑么)。