OOREDIS:一个 Pythonic 的 Redis 库

标签: ooredis pythonic redis | 发表时间:2011-08-07 00:33 | 作者:(author unknown) est
出处:http://simple-is-better.com/

用Redis的朋友们应该会发现,Redis的很多客户端都只是Redis命令的一个简单包装。 

举个例子,在Redis的Python客户端redis-py中,设置一个String键的方法如下: 

>>> from redis import Redis 
>>> r = Redis 
>>> r.set('key_name', 'value') 

而要取得一个列表的所有元素,则要使用lrange命令: 

>>> r.lrange('list', 0, -1) 

这种操作方式有几个问题: 

1.大量的Redis命令聚在一起,妨碍了对客户端对象的使用。 

2.每次操作都要将将key name和命令参数(比如lrange的0和-1)显式地传入方法当中,容易出错。 

3.命令之间没有限制,可以互相覆盖而没有错误提示。 

比如你可以用set命令覆盖一个Redis列表,Redis本身不会报错。 

4.客户端没有利用到语言提供的方便机制。 

比如r.lrange('list', 0, -1)在Python中就没有for item in list语句来得直观。 

5.Redis只储存字符串值,虽然可以储存整数或浮点数,但每次取出值都要显式类型转换,很不方便。 

--- 

为了解决以上问题,更好地使用Redis,我用Python写了一个Redis库,基于redis-py,名叫ooredis。 

ooredis有以下目标: 

1.以Key对象为单位操作Redis的数据结构 

在ooredis中,Redis的函数被按类型及作用归为了一个个Python类,每个ooredis类有不同的操作。 

比如在ooredis中,将Redis的Hash类函数包裹成了Dict类型,它可以以类似Python内置dict类型的方式,操纵Redis数据。 

又比如,Redis的List类函数,在ooredis中被包裹成了List类型,它可以以类似Python内置list类型的方式,操纵Redis数据。 

如果ooredis类尝试覆盖不同类型的数据,ooredis将抛出异常。 

这样就解决了包括命名空间污染、跨类型覆盖等问题。 

2.提供一组Pythonic的API 

刚才我们说“以类型Python内置的dict类型的方式来操纵Redis的Hash类型数据“,我们还没详细说明这是什么意思。 

比如说,在ooredis中,你可以通过传给Dict类一个key name,之后就可以操纵这个Dict对象,来完成Redis中的各种命令,像这样: >

>> form ooredis import * 
>>> project = Dict('ooredis-project') 
>>> project['name'] = 'ooredis' 
>>> project['version'] = 1.0 
>>> project['author'] = 'huangz' 

以上的语句就相当于执行Redis的命令: 

redis> HSET ooredis name ooredis 
redis> HSET ooredis version 1.0 
redis> HSET ooredis author huangz 

也可以用redis-py来完成上面的任务: 

>>> r.hset('ooredis-project', 'name', 'ooredis') 
>>> r.hset('ooredis-project', 'version', 1.0) 
>>> r.hset('ooredis-project', 'autohr', 'huangz) 

可以看到,使用Dict对象比单纯的Redis命令更直观。 

又比如在Dict对象中,你可以用Python内置类型set的全部命令:items、keys、values、pop,等等。 

>>> project.items() 
[('name', u'ooredis'), ('version', 1.0), ('author', u'huangz')] 
>>> 'version' in project 
True 
>>> project.pop('name') 
u'ooredis' 

不仅是Dict类,ooredis的所有类都大量使用了Python的魔法方法,致力于让Redis数据的操作更直观、清晰和Pythonic。 

3.提供方便的类型转换机制 

至于类型问题,ooredis通过使用传入TypeCase的方式,来对Redis数据进行类型转换。 

比如如果你需要一个只保存整数对象(int/long)类型的列表,只需要这样做就可: >

>> numbers = List('numbers', type_case=IntTypeCase) 

如果你需要一个只接受Json对象的字典对象,只需要使用以下语句: 

>>> json_only_dict = Dict('json_dict', type_case=JsonTypeCase) 

其中IntTypeCase和JsonTypeCase都是ooredis默认提供的TypeCase类之一,ooredis总共提供了以下常用TypeCase: 

GenericTypeCase,接受Python常量值,比如int,long,float,str和unicode。为了世界的和平与正义,传入的字符串值总被转换成unicode类型。 

IntTypeCase,接受int和long。 

FloatTypeCase,接受浮点数。 

StringTypeCase,接受str和unicode类型的值,而且总被转换成unicode。 

JsonTypeCase,接受所有可被转换成Json对象的值,比如Python的dict类型。 

SerializeTypeCase,使用Pickle的dumps和loads,可以对Python的class进行序列化。 

当然,除了以上的TypeCase之外,你也可以很方便地定义自己的TypeCase类,像如下代码: 

class MyTypeCase: 
    @staticmethod 
    def to_redis(value): 
        pass 
    @staticmethod 
    def to_python(value): 
        pass 

to_redis将值转换成Redis能接受的类型,to_python则将从Redis取出的数据转回原来的类型。 

--- 

好的,以上就是关于ooredis的基本介绍了,抱歉因为时间关系我不能写一篇更短的文章。 

如果你对ooredis有兴趣,可以访问以下地址,获得更多信息: 

ooredis的更详细介绍,幻灯: http://bit.ly/rbgn3Z 

ooredis的项目主页:https://github.com/huangz1990/ooredis

最后,祝情侣们七夕快乐,早生贵子。 

XD 

# 来源:V2EX › Redis


在微博上关注: 新浪, 腾讯   投稿

最新招聘

更多>>

相关 [ooredis pythonic redis] 推荐:

OOREDIS:一个 Pythonic 的 Redis 库

- est - python.cn(jobs, news)
用Redis的朋友们应该会发现,Redis的很多客户端都只是Redis命令的一个简单包装. 举个例子,在Redis的Python客户端redis-py中,设置一个String键的方法如下: . 而要取得一个列表的所有元素,则要使用lrange命令: . 1.大量的Redis命令聚在一起,妨碍了对客户端对象的使用.

Redis 负载监控——redis-monitor

- - ITeye资讯频道
redis-monitor是一个Web可视化的 redis 监控程序. 使用 Flask 来开发的,代码结构非常简单,适合移植到公司内网使用. redis 服务器信息,包括 redis 版本、上线时间、 os 系统信息等等. 实时的消息处理信息,例如处理 command 数量、连接总数量等. 内存占用、 cpu 消耗实时动态图表.

Redis 起步

- - 博客园_首页
Rdis和JQuery一样是纯粹为应用而产生的,这里记录的是在CentOS 5.7上学习入门文章:. Redis是一个key-value存储系统. 和Memcached类似,但是解决了断电后数据完全丢失的情况,而且她支持更多无化的value类型,除了和string外,还支持lists(链表)、sets(集合)和zsets(有序集合)几种数据类型.

redis 配置

- - 谁主沉浮
# 当配置中需要配置内存大小时,可以使用 1k, 5GB, 4M 等类似的格式,其转换方式如下(不区分大小写). # 内存配置大小写是一样的.比如 1gb 1Gb 1GB 1gB. # daemonize no 默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为yes. # 当redis在后台运行的时候,Redis默认会把pid文件放在/var/run/redis.pid,你可以配置到其他地址.

Cassandra代替Redis?

- - Tim[后端技术]
最近用Cassandra的又逐渐多了,除了之前的360案例,在月初的QCon Shanghai 2013 篱笆网也介绍了其使用案例. 而这篇 百万用户时尚分享网站feed系统扩展实践文章则提到了Fashiolista和Instagram从Redis迁移到Cassandra的案例. 考虑到到目前仍然有不少网友在讨论Redis的用法问题,Redis是一个数据库、内存、还是Key value store?以及Redis和memcache在实际场景的抉择问题,因此简单谈下相关区别.

redis 部署

- - CSDN博客云计算推荐文章
一、单机部署 tar xvf redis-2.6.16.tar.gz cd redis-2.6.16 make make PREFIX=/usr/local/redis install  #指定安装目录为/usr/local/redis,默认安装安装到/usr/local/bin. # chkconfig: 2345 80 10       #添加redhat系列操作系统平台,开机启动需求项(运行级别,开机时服务启动顺序、关机时服务关闭顺序) # description:  Starts, stops redis server.

nagios 监控redis

- - C1G军火库
下载check_redis.pl. OK: REDIS 2.6.12 on 192.168.0.130:6379 has 1 databases (db0) with 49801 keys, up 3 days 14 hours - connected_clients is 1, blocked_clients is 0 | connected_clients=1 blocked_clients=0.

转 redis vs memcached

- - 数据库 - ITeye博客
传统MySQL+ Memcached架构遇到的问题.   实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题:.   1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间.

Redis优化

- - 数据库 - ITeye博客
键名:尽量精简,但是也不能单纯为了节约空间而使用不易理解的键名. 键值:对于键值的数量固定的话可以使用0和1这样的数字来表示,(例如:male/female、right/wrong). 当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能,不过一般都要持久化比较安全,而且是快照和aof同时使用比较安全.

笔记--redis

- - 移动开发 - ITeye博客
接着准备面试内容,今天学习了下redis,继续我的笔记加深印象. 1.为什么要使用redis.  答:主要是 性能和 并发两个方面,另外redis也可以做分布式锁和消息队列等其他功能. 但是如果只是为了分布式锁这些其他功能,完全还有其他中间件(如zookpeer等)代替,并不是非要使用redis.