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

本文深入浅出地介绍了Redis中的五种主要数据结构:String、Hash、List、Set和Sorted Set的特点及应用场景,帮助读者快速掌握Redis的核心功能。

作者好牛逼,我不懂的他全都懂。

Redis: Zero to Master in 30 minutes - Part 1


再说一次,老子觉得你如果是真的程序员,30分钟就能精通 Redis。这充分证明了 Redis 有多牛逼并且是多显而易见的简单。不过话说回来,以你的水平,你真觉得你真的能在30分钟内精通 Redis?额呵呵呵呵呵呵~~

不服你来试试看啊。在这章我们来讲讲什么是 Redis。下一章我们做一个简单的例子。嘛,剩下的时间,一边玩去。

Redis 简介

Redis 通常被描述为一个"键值存储引擎",没错,就是这样,啊,不过超难理解对不对。好吧,我觉得把它看成一个数据结构引擎看起来比较通俗易懂。怎么说呢,Redis 支持五种不同的元素,只要你收集到这五种不同的元素,就什么都不会发生: strings, hashes, lists, sets 和 ordered sets。每一种数据结构有它的特点和支持的指令。不管哪种类型,都是用 Key 访问 Value。而 Key 是以 byte array 形式保存因此可以很复杂,不过以你的水平,我觉得你大多数情况下会用 string 保存,额呵呵呵呵呵呵~。

来看看每种类型:

Strings:

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 是序列化的用户对象。

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 吧。

转载于:https://my.oschina.net/ilivebox/blog/280193

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值