Redis入门实践

Posted on 2016-11-03 in Coding

Redis(REmote DIctionaray Server)是key-value型内存数据库,值(value)可以是 符串(String), 哈希(Map), 列表(list), 集合(sets) 和有序集合(sorted sets)等类型,常用于热数据的缓存服务。常用的Python client是redis-py

相比于python直接对内存操作,redis可以多进程和分布式使用,所以有便利性。我初次使用的诉求是将需要频繁IO的数据放入redis中,便于python调用。

安装server和client

Windows下安装使用:下载地址:https://github.com/MSOpenTech/redis/releases,我使用64bit,安装到D://Redis目录(任意一篇参考教程)。启动redis服务(只要不关cmd窗口,后台就一直运行redis服务):

cmd> redis-server.exe redis.windows.conf

安装redis-py:

pip install redis

实验小例子:

random walk

在redis中读取pandas

这里不打算介绍redis使用基础,网上有诸多教程,直奔我的需求。可见,redis并不支持复杂的数据结构,如DataFrame,怎么办?

思路(stackoverflow上的redis-pickle方案):

from redis import StrictRedis
import cPickle as pickle

# StrictRedis类的子类,可以pickling和unpickling复杂对象,
# "pset"和"pget"方法代替StrictRedis类的"set"和"get"方法

class PickledRedis(StrictRedis):

    def pset(self, key, value, ex=None, px=None, nx=False, xx=False):
        value_pickled = pickle.dumps(value, 2)
        return self.set(key, value_pickled, ex=None, px=None, nx=False, xx=False)

    def pget(self, key):
        value_pickled = self.get(key)
        return pickle.loads(value_pickled)

另一种思路:参考timeseries2redis,可以将Tick或Bar数据在redis中读取,实现方法很有趣。

不过我在看其performance时发现并没有pd.read_csv快,pandas的csv读取底层是C实现的,可以达到几十ms量级,如果希望再快几倍,可以考虑用HDF5,pandas读写性能的比较:performance-considerations

思路三:pandas序列化方法msgpack:pd.read_msgpack()/to_msgpack()。虽然目前是实验性支持,但应该是最简洁的方法。在读取时其支持迭代化序列。

...
redis_db = redis.StrictRedis(host="localhost", port=6379, db=0)
data = data.to_msgpack(compress='zlib')
# 
redis_db.setex(key, data, expire_time)

cached_data = redis_db.get(key)
df = pd.read_msgpack(cached_data)