Simple Python: How to use Redis in python

简介

Redis 基于内存,提供了极其丰富的数据结构,速度快,效率高,在很多场景用起来得心应手。

APIS

1.连接redis

import redis
pool = redis.ConnectionPool(host='localhost', port=6379)
r = redis.Redis(connection_pool=pool)

2.String
最普通的key-value类型,说是String,其实是任意的byte[],比如图片,最大512M。 所有常用命令的复杂度都是O(1),普通的Get/Set方法,可以用来做Cache,存Session,为了简化架构甚至可以替换掉Memcached。

r.set('test', 'this is a string')
r.get('test')
>>> 'this is a string'

3.Hash
Key-HashMap结构,相比String类型将这整个对象持久化成JSON格式,Hash将对象的各个属性存入Map里,可以只读取/更新对象的某些属性。这样有些属性超长就让它一边呆着不动,另外不同的模块可以只更新自己关心的属性而不会互相并发覆盖冲突。
底层实现是hash table,一般操作复杂度是O(1),要同时操作多个field时就是O(N),N是field的数量。

r.hset(url, 'flag', 0)
r.hget(url, 'flag')
>>> 0

r.hmset(url, {
             'title': "a title",
             'stid': "a stid",
             'username': "a username",
             'flag': 0                                                                                                                                                                                       
         })
title, stid, username, flag = r.hmget('title', 'stid', 'username', 'flag')

4.List
List是一个双向链表,支持双向的Pop/Push,江湖规矩一般从左端Push,右端Pop——LPush/RPop,而且还有Blocking的版本BLPop/BRPop,客户端可以阻塞在那直到有消息到来,所有操作都是O(1)的好孩子,可以当Message Queue来用。当多个Client并发阻塞等待,有消息入列时谁先被阻塞谁先被服务。任务队列系统Resque是其典型应用。

r.lpush('qname', 'task')
r.rpop('qname')
>>> 'task'

5.Set
Set就是Set,可以将重复的元素随便放入而Set会自动去重,底层实现也是hash table。

r.sadd('setname', 'task1', 10)
r.score('setname', 'task1')
>>> 10    # if no 'task1' in 'setname', return none

r.sismember('setname', 'task1')   # return True or False

r.srem('setname', 'task1')
r.exprieat('setname', 60000)

6.Sorted Set
Sorted Set的实现是hash table(element->score, 用于实现ZScore及判断element是否在集合内),和skip list(score->element,按score排序)的混合体。 skip list有点像平衡二叉树那样,不同范围的score被分成一层一层,每层是一个按score排序的链表。

ZAdd/ZRem是O(log(N)),ZRangeByScore/ZRemRangeByScore是O(log(N)+M),N是Set大小,M是结果/操作元素的个数。可见,原本可能很大的N被很关键的Log了一下,1000万大小的Set,复杂度也只是几十不到。当然,如果一次命中很多元素M很大那谁也没办法了。