OOREDIS
OOREDIS
是什么:
一个Redis的Python库,基于redis-py。

目标:
 1. 以Key对象为单位操作Redis的数据结构
 2. 提供一组Pythonic的API
 3. 提供方便的类型转换机制
OOREDIS
是什么:
一个Redis的Python库,基于redis-py。

目标:
 1. 以Key对象为单位操作Redis的数据结构
 2. 提供一组Pythonic的API
 3. 提供方便的类型转换机制
REDIS
以函数为单位:

Keys: DEL, KEYS, TTL...
Strings: SET, GET, GETSET...
Hashs: HSET, HDEL, HGET...
Lists: LPUSH, RPUSH, LPOP, RPOP...
Set: SADD, SREM, SPOP...
Sorted Sets: ZADD, ZREM...
...
REDIS-PY
以客户端对象为单位:

   >>> from redis import Redis
   >>> r = Redis()
   >>> r.lpush('numbers', 'one')
   1L
   >>> dir(r)
   >>> [..., 'append', 'bgrewriteaof', 'bgsave',       'blpop',
'brpop', 'brpoplpush', 'config_get',          'config_set',
'connection_pool', 'dbsize', 'decr', ...]
OOREDIS
以Key对象为单位:

  根据其作用,Redis的函数在OOREDIS中被归为一个个
Python类。
REDIS函数->OOREDIS类

redis:               Key(ttl, expire, del, ...)
                      / / |  
         Hash    List SortedSet Set             String
           |      |         |          |          |
        HGET    LPUSH ZADD SADD                      SET
        HSET    RPUSH ZRANK SUNION GET
        HLEN    LRANGE ZREM SPOP                     SETNX
          ...    ...       ...        ...        ...
           |      |         |          |          |
ooreids: Dict    List SortedSet Set SingleValue,
                                           Counter
OOREDIS
以Key对象为单位:
  根据其作用,Redis的函数在OOREDIS中被归为一个个
python类。

 每个OOREDIS类以一个Key(或者说,key name,键名)作为
构造函数参数,生成相应的Key对象。
OOREDIS
例子:

 >>> greet = SingleValue('greeting')
 >>> greet.set('hello world')
 >>> greet.get()
 u'hello world'
OOREDIS
例子2:

 >>> project = Dict('ooredis-project')
 >>> project['name'] = 'ooredis'
 >>> project['language'] = 'Python'
 >>> project['author'] = 'huangz'
OOREDIS
是什么:
一个Redis的Python库,基于redis-py。

目标:
 1. 以Key对象为单位操作Redis的数据结构
 2. 提供一组Pythonic的API
  3. 提供方便的类型转换机制
Key
所有Key对象的基类,子类通过继承它以获得以下通用命
令:

 __init__(self,
         name,
         client=None,
         type_case=None)

 name, delete, exists, expire, expireat,
 persist, ttl, sort
Key
例子:
   >>> books = List('my_book_list')
   >>> dir(books)
   ['__abstractmethods__', ..., 'exists', 'expire', 'expireat',
'index', 'lpop', 'lpush', 'name', 'persist', ..., 'ttl']
   >>>
   >>> from ooredis.mix.key import Key
   >>> issubclass(List, Key)
   True
SingleValue
储存单个值的对象:

 set(value, preserve=False, expire=None)
 get()
 getset(value)
SingleValue
例子: 

 >>> phone = SingleValue('china_mobile')
 >>> phone.set(10086)
 >>> phone.get()
 10086
 >>> phone.getset(123123)
 10086
 >>> phone.get()
 123123
Counter
计数器对象,继承自SingleValue:

 incr(increment=1)
 +=

 decr(decrement=1)
 -=

 set, get, getset
Counter
例子:
 >>> counter = Counter('hit_count')
 >>> counter.incr()
 1
 >>> counter.incr(5)
 6
 >>> counter += 10086
 >>> counter.get()
 10092
 >>> counter.decr()
 10091
Dict
字典对象,提供O(1)复杂度的读/写操作:

 __setitem__, __getitem__, __delitem__,
 __iter__, __contains__, __len__

 incr(), decr()
 setdefault(), get()
 items(), keys(), values()
 iteritems(), iterkeys(), itervalues(),
 pop(), popitems(), clear(), update()
Dict
例子:
    >>> project = Dict('ooredis-project')
    >>> project['name'] = 'ooredis'
    >>> project['version'] = 1.0
    >>> project['language'] = 'Python'
    >>>
    >>> project.items()
    [('name', u'ooredis'), ('version', 1.0),
('language', u'Python')]
    >>> 'author' in project
    False
List
列表对象,提供slice,以及双向的push/pop等操作:

 __contains__, __getitem__, __delitem__,
 __setitem__, __iter__, __len__

 lpush, lpop, blpop,
 rpush, rpop, brpop,
 rpoplpush, brpoplpush

 remove, count, index
List
例子:
 >>> books = List('my_book_list')
 >>> books.rpush('on lisp')
 >>> books.rpush('pro python')
 >>> books.lpush('design patterns')
 >>>
 >>> [book.title() for book in books]
 [u'Design Patterns', u'On Lisp', u'Pro Python']
 >>> books.lpop()
 u'design patterns'
Set
集合对象,支持Key对象之间或Key对象和Python集合之间的
对象运算:

 isdisjoint, __le__, __lt__, __ge__, __gt__
 __or__, __ror__, __and__, __rand__,
 __sub__, __rsub__, __xor__, __rxor__

 __len__, __iter__, __contains__
 add, remove, pop, random, move
Set
例子:
 >>> jack = Set('jack_following')
 >>> jack.add('tom'); jack.add('peter')
 >>>
 >>> # Set object & Set object
 >>> jack & jack
 set([u'peter', u'tom'])
 >>>
 >>> # Set object | Python set
 >>> jack | {'tom', 'marry'}
 set(['marry', u'peter', u'tom'])
SortedSet
有序集合,常用于排名或频率统计:

 __len__, __contains__,
 __setitem__, __getitem__, __delitem__,

 remove, rank, score, incr, decr
SortedSet
例子:
   >>> fruit = SortedSet('fruit_price')
   >>> fruit['apple'] = 8.3
   >>> fruit['banana'] = 7.5
   >>> fruit['orange'] = 5
   >>>
   >>> fruit[0]
   {'score': 5.0, 'value': u'orange'}
   >>> list(reversed(fruit))[:2]
   [{'score': 8.3, 'value': u'apple'}, {'score': 7.5, 'value':
u'banana'}]
OOREDIS
是什么:
一个Redis的python库,基于redis-py。

目标:
 1. 以Key对象为单位操作Redis的数据结构
  2. 提供一组Pythonic的API
 3. 提供方便的类型转换机制
REDIS
Redis的数据都是以字符串格式保存的:

 redis> SET PI 3.1415926
 OK
 redis> GET PI
 "3.1415926"
REDIS-PY
每次都手动转型太不低碳了:

 >>> from redis import Redis
 >>> r = Redis()
 >>> r.set('PI', 3.1415926)
 True
 >>> r.get('PI')
 '3.1415926'
 >>> float(r.get('PI'))
 3.1415926
OOREDIS
在ooreids中,你可以通过给Key对象传入TypeCase类来控
制值的转型:

>>> from ooredis.type_case import FloatTypeCase
>>>
>>> f = Dict('floats', type_case=FloatTypeCase)
自带的TypeCase类

ooredis自带了一些常用的TypeCase类:

 GenericTypeCase # 接受int(long), float, 
               #    string, unicode

 IntTypeCase # int(long)
 FloatTypeCase # float
 StringTypeCase # sting, unicode都转化成unicode

 JsonTypeCase # Json
 SerializeTypeCase # Pickle
GenericTypeCase

GenericTypeCase是Key对象的默认type_case值:

>>> from ooredis import *
>>> jack = Dict('jack_profile')
>>> jack['name'] = 'Jack Loz'
>>> jack['age'] = 35
>>> jack
Dict Key 'jack_profile': {'age': 35, 'name': u'Jack Loz'}
IntTypeCase
>>> from ooredis.type_case import IntTypeCase
>>>
>>> nums = Set('nums', type_case=IntTypeCase)
>>> nums.add(10086)
>>> nums.add('2011')
>>> nums
Set Key 'nums': set([2011, 10086])
>>>
>>> nums.add('hello')
ValueError: invalid literal for int() with base 10: 'hello'
FloatTypeCase

>>> from ooredis.type_case import FloatTypeCase
>>>
>>> const = Dict('const',
                     type_case=FloatTypeCase)
>>>
>>> const['pi'] = 3.1415926
>>> const['e'] = 2.71828
>>> const
Dict Key 'const': {'pi': 3.1415926, 'e': 2.71828}
StringTypeCase

>>> from ooredis.type_case import 
                             StringTypeCase
>>> friends = Set('my_friend',
                    type_case=StringTypeCase)
>>> friends.add('jack')
>>> friends.add('marry')
>>> friends.add(unicode('harry'))
>>> friends
Set Key 'my_friend': set([u'marry', u'jack', u'harry'])
JsonTypeCase
>>> from ooredis.type_case import JsonTypeCase
>>> site = SingleValue('site',
                          type_case=JsonTypeCase)
>>> google = {'name': 'google',
                 'type': 'search engine',
                 'url': 'www.google.com'}
>>> site.set(google)
>>> site.get()
{u'url': u'www.google.com', u'type': u'search engine',
u'name': u'google'}
SerializeTypeCase

>>> from ooredis.type_case import 
                            SerializeTypeCase
>>> obj = SingleValue('book',
                    type_case=SerializeTypeCase)
>>> class Book:
...      name = 'Learning Android',
...
>>> obj.set(Book())
>>> book = obj.get()
>>> book.name
'Learning Android'
编写你自己的TypeCase类



TypeCase类的两个静态方法:to_redis和to_python

class NewTypeCase:
   @staticmethod
   def to_redis(value): pass
   # 将值/对象转为Redis能保存的值(字符串,整数,浮点)

 @staticmethod
 def to_python(value): pass
 # 将从Redis取出的字符串值转换回原来的值/对象
FloatTypeCase示例


class FloatTypeCase:
   """ 将python值转换为float类型。 """
   @staticmethod
   def to_redis(value):
      return float(value)

    @staticmethod
    def to_python(value):
       if value == None: # 某些方法会返回None
            return None
        return float(value)
OOREDIS
 需求, 使用, 文档...
需求
Python: 2.7
Redis: 2.2
redis-py: 2.4.9
下载OOREDIS

$ cd /tmp/
$ git clone git://github.com/huangz1990/ooredis.git
Cloning into ooredis...
...
Resolving deltas: 100% (34/34), done.
$ cd ooredis/
$ sudo mv ooredis/ /usr/lib/python2.7/site-packages/
$ python2
Python 2.7.2 (default, Jun 29 2011, 11:17:09)
[GCC 4.6.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from ooredis import *
使用OOREDIS

>>> from ooredis import *
>>> dir()
['Counter', 'Dict', 'List', 'Set', 'SingleValue', 'SortedSet',
'__builtins__', '__doc__', '__name__', '__package__',
'connect', 'get_client', 'type_case']
>>>
>>> connect(db=5) # 指定数据库
<redis.client.Redis object at 0xb73db1cc>
>>> ...
文档?!
目前还没有,遇上问题请dir和help.

>>> dir(Set)
['__and__', '__class__', ..., 'random', 'remove', 'ttl']
>>>
>>> help(Set.add)
add(self, element):
    将element加入到集合当中。
   
    如果element已经是集合的成员,不做动作。
    ...
项目地址
  https://github.com/huangz1990/ooredis




      联系方式
twitter: @huangz1990
gmail: huangz1990
豆瓣: http://www.douban.
com/people/i_m_huangz/
EOF

Ooredis