@coldxiangyu
        
        2017-06-29T08:30:22.000000Z
        字数 1026
        阅读 1291
    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客户端测试:
127.0.0.1:6379> lpush nums 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> lpop nums
"6"
127.0.0.1:6379> rpop nums
"1"
127.0.0.1:6379> lpop nums
"5"
127.0.0.1:6379> rpop nums
"2"
127.0.0.1:6379> lpop nums
"4"
127.0.0.1:6379> rpop nums
"3"
127.0.0.1:6379> lpop nums
(nil)
127.0.0.1:6379>
从数据结构方面分析:
lpush nums 1 2 3 4 5 6
lpop nums
"6"
rpop nums
"1"
| lpop | rpop | ||||
|---|---|---|---|---|---|
| 6 | 5 | 4 | 3 | 2 | 1 | 
关于redis的C实现我偷了个懒,网上扒了个图下来:

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)的,这个效率就不用我说了。