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

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

Redis: Zero to Master in 30 minutes - Part 2github


Part 1介绍了 Redis, 主要集中介绍了五种数据结构,而且介绍了你能够怎样使用它们。这部分咱们能够开始用 Redis 作一个简单的应用,表示咱们已经在 30 分钟内精通了。(我根本还不知道是什么嘛,我精通拼写 Redis 了却是真的)redis

开始以前,你应该注意一下, Redis 的 API 和大多数的不同。不是一般的 CRUD 四天王,Redis 有一堆专用方法。到目前为止,咱们只看到了一小部分。咱们的应用也只会用到一小部分,一个通用的场景。一些你死也用不到的,或者你会我擦的方法,你要去查文档。精通 Redis 又不是让你把全部的方法都背下来(说的好!但是我仍是不懂啊...)。所谓的精通,(a) 理解五元素,(b)理解怎么查询数据模型,(c)结合 a 和 b来证实 Redis 的牛逼。数据库

好了,咱们要作的是这样的一个例子, jobs.openmymind.net。它上面的码农岗位是从随便从哪抓来的,而后显示他们。完整的代码在这里。我先认可,用关系型数据库或者文档型数据库会更直接。编程

保存岗位json

后台线程用来运行和获取各类的 json 和 RSS 服务,用来获取岗位。咱们的方法会处理每一个岗位的字符串值。 Key 的格式将会是 job:SOURCE:SOURCE_ID。好比,咱们给 github 一个 1, 而后 http://jobs.github.com/positions/73c9e09a-09b0-11e1-9819-355783013ce0 上的工做的 key 将是 job:1:73c9e09a-09b0-11e1-9819-355783013ce0。值就是这个 key 对应的工做的详细。数组

假设咱们把咱们的岗位解析成 hash,用 Redis 保存,看起来应该是这样:数据结构

<!-- lang: js -->
def save(job)
  key = "job:#{job[:source]}:#{job[:source_id]}"
  redis.set(key, job.to_json)
end

这里,咱们单纯的想按照时间逆序显示岗位。咱们不须要分页,咱们只须要显示最新的 X 个岗位。固然,咱们不能用上面的代码来完成,咱们须要 keys ,而后按照日期排序。咱们第一个尝试是简单的用一个列表,就像咱们在 Part 1 中看到的:编程语言

<!-- lang: js -->
def save(job)
  key = "job:#{job[:source]}:#{job[:source_id]}"
  redis.multi do  #begins a transaction
    redis.set(key, job.to_json)
    redis.lpush('jobs', key)
  end
end

嗯,这不是真的,由于咱们把岗位插到 Redis 的时间并不须要映射到这个岗位是何时建立的。这种方式会把岗位按照咱们处理它的时间排序,而不是岗位建立时间。解决方法是?用 Sorted set 取代 list:学习

<!-- lang: js -->
def save(job)
  key = "job:#{job[:source]}:#{job[:source_id]}"
  redis.multi do
    redis.set(key, job.to_json)
    redis.zadd('jobs', job[:created_at], key) # :created_at is already an integer (seconds since ..)
  end
end

嗯,若是咱们已经保存了岗位咋办?事实证实,毫无问题。咱们只要重设一下咱们的岗位字符串(其实是有变化的岗位详细内容),而后,咱们用这个 Set 的时候,能够从新把 Key 加到 Set 里面去。

嗯,稍后咱们再继续这个,总的来讲,这是个很好的开端。

列出岗位

咱们不单止保存每一个岗位,一样的咱们也排序岗位的 key。从这里面拿到岗位内容显示就不难了:

<!-- lang: js -->
def get_latest_jobs
  keys = redis.zrevrange('jobs', 0, 150)
  jobs = redis.mget(*keys)
  jobs.map do |j|
    job = JSON.parse(j)
    job['created_at'] = Time.at(job['created_at'])
    job
  end
end

把集合按照从小到大来排序。意思是说,越新的数据有越高的权重(从1970到今天的毫秒数比到1980的毫秒数多...)。若是咱们那前面的150条数据(用 zrange)咱们将会拿到最老的150个岗位。咱们但愿拿最近的最新的150个岗位,那些咱们有高权重的。所以咱们用 zrevrange(取反)。

咱们从 set 里面拿到的是一个 key 的数组。咱们用 mget 来获取实际的岗位值(要作反序列化)。若是你不懂 Ruby, 那个用在 mget 方法里面的 ***** 号其实是把数组转变为了参数(撸逼们常常这样干的)。(那不是指针符号么,这是取地址的意思吧)。

嗯,就是这样。

清理岗位

由于咱们只要显示最新的150个岗位,咱们不必保存一堆旧的。内存就是钱啊。咱们要作的就是把那些旧岗位从集合里面清除出去,删除 key。让咱们来看看怎么作的:

<!-- lang: js -->
redis.multi do
  keys = redis.zrange('jobs', 0, -300)
  redis.del(*keys)
  redis.zrem('jobs', *keys)
end

显而易见,这里是把 0 到 -300 的数据都清理掉。注意咱们在这里用的是 zrange 。意思是说,低权重优先(也就是刚才咱们存的老岗位)。好比说咱们有 500 个岗位,咱们将会把 1-200(即500-300)删除。由于咱们只显示 150 个岗位,咱们能够用 -150。 不过仍是保持一个缓冲,以防不测。

或者,咱们也能够用 EXPIRE 这个 key-command 来让 Redis 自动删除老岗位(好比说,十日前)。固然,须要对咱们的集合来处理,你不能处理单独的记录,记住,咱们应该有大局观。

Twitter Integration

Redis 有很是棒的发布订阅 API。而且它有很是赞的库,好比说 Resque 用来构建 Redis 的队列。咱们来作个很是基础的例子。

当咱们有一个新岗位的时候,咱们会把 key 加到 list 中。所以,保存一个岗位,应该看起来像这样:

<!-- lang: js -->
def save(job)
  key = "job:#{job[:source]}:#{job[:source_id]}"
  if !redis.exists(key)
    redis.rpush('jobs:new', key)
  end
  redis.multi do
    redis.set(key, job.to_json)
    redis.zadd('jobs', job[:created_at], key)
  end
end

而后咱们在后台能够这样 pop 他们:

<!-- lang: js -->
def get_new_job
  key = redis.lpop('jobs:new')
  key ? JSON.parse(redis.get(key)) : nil
end

嗯,不强壮,不过实现了需求。

以上

也许你还没以为你精通了 Redis(你特么逗我么?精通?!)。事实上,你还有许多须要学习的。但愿经过此次学习,你有足够好的基础去开始你本身的 Redis 之旅。

装 Redis 有几种方式。它能够在许多包管理上找到(好比说 brew),或者你能够下载源码。 Windows 用户能够经过这篇文章(我就是这样作的)。下载以后,你就能够经过 redis-server 来开启你的服务了。而后经过 redis-cli 启动客户端。你能够下载你所喜欢的编程语言的客户端

或者,你能够试试在线教程

最后,若是你对 Redis 模型讨论感兴趣,你可能对个人这两篇文章感兴趣:

若是你对更复杂的实际应用感兴趣的话,看这里: LamerNews


★差评!差评!我花了一下午都没精通!

相关文章
相关标签/搜索