Redis 能够说是 NoSQL (非关系型数据库)中较为流行的一种数据库,虽然相较于 MongoDB , Redis 的检索算法不够全面,可是它的性能更好,对数据持久化的处理也较优。html
因此在创建数据库时,也常常会用到 Redis ,并且通常用它和其余数据库相互组合使用。相较于 SQL , Redis 能够很好地处理缓存类的部分,而且更易实现分布式,从而提高服务器的访问效率。python
Redis 的服务器文件咱们须要到它的官网上去下载:Redis.io 。redis
下载完成后,咱们解压文件,而后打开控制台,切换到解压后的目录下,而后输入 make
指令,通过一段时间的安装后, Redis 就安装成功了。算法
安装好了服务器以后,咱们须要安装 python 的 redis 第三方模块,来实现对 Redis 链接的支持。数据库
$ pip install redis
首先咱们先以普通模式运行 Redis 数据库,打开终端,能够看到一个 Redis 的图标。编程
$ redis-server
在调试完成后,咱们应该使用 conf 配置文件打开 Redis 服务器,否则会有安全性隐患。缓存
在 python 中,咱们能够经过定义一个 Redis 对象来实现对 Redis 数据库的链接。这里咱们先使用 IDLE 的交互式编程模式来完成。安全
>>> import redis >>> database = redis.Redis()
只须要一个简单的函数,咱们就能链接咱们的服务器了。bash
其中, Redis
这个函数其实还有可选参数:服务器
host 设置 Redis 服务器的 IP 位置,默认为 localhost
port 设置 Redis 服务器的端口,默认为 6379
db 设置使用的数据库标号,默认为 db=0
password 设置 Redis 服务器的密码,若是没有设置密码就不用填
Redis 的操做很是简单,最基础的只有两个函数, set()
和 get()
。
redis.set(key, value) 将 key 对应的值设置为 value ,若是设置成功就返回 True
redis.get(key) 返回 key 对应的值,若是 key 不存在,则返回 None
让咱们先来试一试这两个函数:
>>> database.set('username', 'cometeme') True >>> database.get('username') b'cometeme'
能够看到,虽然的确成功返回了咱们存入的信息,可是前面多了一个 b'
,这表明的是这是 byte 形式的值。那么怎么样才能还原成正常的数据呢?
其实只须要加个 decode
函数就能够恢复为正常的数据。
>>> database.get('username').decode() 'cometeme'
假如你存了许多键值对,想要查看全部设置过的键值对,那么你就可使用 redis.keys()
这个函数来返回全部键。
>>> database.keys() [b'passwd', b'username']
这样返回的又都是带 b'
的数据了,若是想要将它所有复原的话,咱们可使用 for
循环来完成解码,这样就解决问题。,可是每一次使用这些功能时,都须要设置这么多的步骤。其实咱们能够本身作一个模块,从而可以在其余程序中更简单地完成这些操做。
为了方便以后的使用,咱们能够将一些 Redis 数据库的操做写成一个模块,这样能够便于以后调用。咱们能够新建一个叫 redisOperation.py 的文件,而且定义一个类。
import redis class redisOperation(): def __init__(self, host='localhost', port=6379, db=0,password=""): self.database = redis.Redis(host=host, port=port, db=db, password=password) print("Successfully connect to Redis Server.") def setData(self, key, value): self.database.set(key, value) def getData(self, key): data = self.database.get(key) if data is None: return None else: return data.decode() def getKeys(self): byteKeys = self.database.keys() rawKeys = [] for key in byteKeys: rawKeys.append(key.decode()) return rawKeys
首先在初始化的位置,咱们设定了默认参数,这样能够以最简单的方式来测试一个服务器。 setData()
函数没有任何改变,可是 getData()
和 getKeys()
函数都加入了解码的过程,这样只须要调用这个函数就能够直接返回原始值,减小了重复的工做。
接下来咱们就可使用本身写的模块了:
from redisOperation import redisOperation r = redisOperation() r.setData('username', 'cometeme') print(r.getData('username'))
可是,在有一类状况下,单纯使用 decode()
会出现问题:当你存入的数据不是字符串类型,可是使用 decode()
以后返回的是一个字符串。若是你想要使用它,你就必须知道当初存进去的是什么类型,再决定是否须要使用 eval()
函数,这无疑增长了非文本类型的存储(特别是文本与非文本类型混合存储)时的解码难度。
>>> r.setData('username', [10,20,90,(30,10,29)]) >>> r.getData('username') '[10, 20, 90, (30, 10, 29)]'
其实问题在于,咱们存入一个值,而取出时为 byte 类型。这意味着咱们存入时会先将信息变为 byte 类型,就是这一步致使以后咱们没法区分数据类型。那怎样才能让咱们的数据“原样进,原样出”呢?等等,是否是想到了咱们以前介绍的 pickle 模块?[python] pickle 模块
其实要使用 pickle 模块完成数据的存储,只须要简单的更改上面的代码。在介绍 pickle 模块时,我提到了有两个不经常使用的函数: dumps()
和 loads()
,这两个就是用来生成与还原二进制流的。虽然我说他们不经常使用,可是在这里他们就派上了用场。咱们只须要在存入时经过 dumps()
将任意的 python 变量转化为二进制流,而在取出时用 loads()
将其完整的取出,那就能够实现任意类型的 python 变量存储。
更新后的代码以下,其实只改动了很小一部分。
import redis import pickle class redisOperation(): def __init__(self, host='localhost', port=6379, db=0, password=""): self.database = redis.Redis( host=host, port=port, db=db, password=password) print("Successfully connect to Redis Server.") def setData(self, key, value): self.database.set(key, pickle.dumps(value)) def getData(self, key): data = self.database.get(key) if data is None: return None else: return pickle.loads(data) def getKeys(self): byteKeys = self.database.keys() rawKeys = [] for key in byteKeys: rawKeys.append(key.decode()) return rawKeys
这样就能够完美地实如今 Redis 数据库中进行各类数据类型的存储了。
>>> r.setData('username', [10,20,90,(30,10,29)]) >>> r.getData('username') [10, 20, 90, (30, 10, 29)]
其实若是平时设置 key 时使用字符串,那么在存入时咱们的 key 就不须要用 pickle 模块来编码,这样也能够增长效率。不过若是你想要将 key 值设置成更多的变量类型,那么就能够在存储 key 时增长 dumps() 函数
如此咱们就介绍完了 python 与 redis 的链接与使用,相信在看完了篇文章后,你可以更彻底地了解 Redis 这一个数据模块,而且可以在以后的项目里更好地使用它。