Redis:30分钟从入门到精通 - 1P

做者好牛逼,我不懂的他全都懂。程序员

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)。全部的这些都很常见,最多见的字符串操做是 GETSET调试

<!-- 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 字段等于 sayankeys 给我。咱们看看 List,咱们是怎样建立咱们的二级索引的。管理你的二级索引会超痛苦,有时候还很难扩展。不过,这里有两件事应该记住。首先,不论是简单仍是复杂的场景,你都应该在敲定以前,先把玩把玩,没啥大不了的,花不了几分钟。第二,don't get hung up with hitting Redis multiple times.

除了五种结构, Redis 还有便利全部 Key的命令(所谓的 key-commands)。好比说 DELEXISTSRENAME。也许最经常使用的是 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 单纯看做一个键值存储是不对的,它比这牛逼多了。也就是说,你应该用不一样的方式来考虑你的数据模型。有时候它不起做用,可是一旦用起来了...好爽。(你觉得你是段誉的六脉神剑么)。

也许咱们应该去撒泡尿?看看 Redis 的网站?oh,开始 Part 2 吧。

相关文章
相关标签/搜索