[关闭]
@coldxiangyu 2017-06-29T16:30:22.000000Z 字数 1026 阅读 1171

redis深入研究【list】

redis


redis命令参考手册:http://doc.redisfans.com/
可以看到redis提供的命令有很多,比较吸引人的大概就是redis关于list的应用了,因为可以作为队列使用,也比较适合银保通,还可以省去专门的MQ服务器,比如RabbitMQ、ActiveMQ等。
查看redis命令手册可以看到,redis关于List提供以下方法:
BLPOP、BRPOP、BRPOPLPUSH、LINDEX、LINSERT、LLEN、LPOP、LPUSH、LPUSHX、
LRANGE、LREM、LSET、LTRIM、RPOP、RPOPLPUSH、RPUSH、RPUSHX等。
其中作为队列使用,常用的无非就是LPUSH、LPOP、RPUSH、RPOP,单从命名大概可以看出,这个list作为队列可以左PUSH、POP,也可以右PUSH、POP,以下为本地redis客户端测试:

  1. 127.0.0.1:6379> lpush nums 1 2 3 4 5 6
  2. (integer) 6
  3. 127.0.0.1:6379> lpop nums
  4. "6"
  5. 127.0.0.1:6379> rpop nums
  6. "1"
  7. 127.0.0.1:6379> lpop nums
  8. "5"
  9. 127.0.0.1:6379> rpop nums
  10. "2"
  11. 127.0.0.1:6379> lpop nums
  12. "4"
  13. 127.0.0.1:6379> rpop nums
  14. "3"
  15. 127.0.0.1:6379> lpop nums
  16. (nil)
  17. 127.0.0.1:6379>

从数据结构方面分析:

  1. lpush nums 1 2 3 4 5 6
  2. lpop nums
  3. "6"
  4. rpop nums
  5. "1"
lpop rpop
6 5 4 3 2 1

关于redis的C实现我偷了个懒,网上扒了个图下来:

image_1bjpfhju4jn112qspd82nl1jpt9.png-137.4kB

  • listNode  很明显这是一个node节点,可以看出它有一个prev指针和一个next指针,分别指向节点的前驱和后继,然后还有一个void* 这个类型的value

  • list  这个list蛮有意思的一点就是,里面有一个head和tail节点,可想而知,tail存放的是list的尾节点,有了这个节点就说明什么呢?说明你删除尾节点的复杂度是O(1),同样有了这个head,你删除头节点同样也是O(1)。这就有了刚才说的LPush,LPop,RPush,RPop,是的吧,同时list里面还有一个len属性,是记录当前list的元素个数,这样的话,你统计list的个数也是O(1)的,这个效率就不用我说了。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注