技术开发 频道

NoSQL数据库:Redis数据结构解析

  有序集合

  集合是使用频率很高的数据类型,但是…对许多问题来说他们也有点儿太不讲顺序了;)因此Redis1.2引入了有序集合。他和集合非常相似,也是二进制安全的字符串集合,但是这次带有关联的score,以及一个类似LRANGE的操作可以返回有序元素,此操作只能作用于有序集合,它就是,ZRANGE 命令。

  基本上有序集合从某种程度上说是SQL世界的索引在Redis中的等价物。例如在上面提到的reddit.com例子中,并没有提到如何根据用户投票和时间因素将新闻组合生成首页。我们将看到有序集合如何解决这个问题,但最好先从更简单的事情开始,阐明这个高级数据类型是如何工作的。让我们添加几个黑客,并将他们的生日作为“score”。

  $ redis-cli zadd hackers 1940 "Alan Kay"
  (
integer) 1
  $ redis
-cli zadd hackers 1953 "Richard Stallman"
  (
integer) 1
  $ redis
-cli zadd hackers 1965 "Yukihiro Matsumoto"
  (
integer) 1
  $ redis
-cli zadd hackers 1916 "Claude Shannon"
  (
integer) 1
  $ redis
-cli zadd hackers 1969 "Linus Torvalds"
  (
integer) 1
  $ redis
-cli zadd hackers 1912 "Alan Turing"
  (
integer) 1

  对有序集合来说,按生日排序返回这些黑客易如反掌,因为他们已经是有序的。有序集合是通过一个dual-ported 数据结构实现的,它包含一个精简的有序列表和一个hash table,因此添加一个元素的时间复杂度是O(log(N))。这还行,但当我们需要访问有序的元素时,Redis不必再做任何事情,它已经是有序的了:

  $ redis-cli zrange hackers 0 -1
  
1. Alan Turing
  
2. Claude Shannon
  
3. Alan Kay
  
4. Richard Stallman
  
5. Yukihiro Matsumoto
  
6. Linus Torvalds

  你知道Linus比Yukihiro年轻吗

  无论如何,我想反向对这些元素排序,这次就用 ZREVRANGE 代替 ZRANGE 吧:

  $ redis-cli zrevrange hackers 0 -1
  
1. Linus Torvalds
  
2. Yukihiro Matsumoto
  
3. Richard Stallman
  
4. Alan Kay
  
5. Claude Shannon
  
6. Alan Turing

  一个非常重要的小贴士,ZSets只是有一个“默认的”顺序,但你仍然可以用 SORT 命令对有序集合做不同的排序(但这次服务器要耗费CPU了)。要想得到多种排序,一种可选方案是同时将每个元素加入多个有序集合。

0
相关文章