首页

13.3 使用Redis的注意事项

关灯 护眼    字体:

上一章 目录 下一章




13.3.1  “多Redis实例”与“单Redis实例多数据库”的差异


在某些项目中,Redis  会不可避免地产生非常多的  Key。如果多个不同的项目共用同一个Redis,那么它们的Key就会混在一起,这样不方便管理。

有一个集群系统需要更新版本,而新版本又涉及  Redis  键值的修改,如果新旧版本使用同一个Redis,则必须进行冷部署。因为,热部署会导致一旦一部分新的版本运行起来了,它们对Redis的修改可能会导致正在运行的老版本程序报错。

要解决这个问题,直观想到的办法是:多用几台服务器,每台服务器上面只部署一个Redis。那么如果只有一个服务器怎么办呢?

1.在一台服务器上运行Redis的多个实例

由于Redis服务的启动命令为:

redis-server  配置文件路径

所以,只要有多个配置文件,每个配置文件里面保证端口号、日志路径、pid文件路径、数据文件路径不同,就可以通过多次运行此命令来启动多个Redis实例。

例如,在默认的Redis配置文件中,对端口号、日志路径、pid文件路径、数据文件路径的配置信息为:

port  6379

pidfile  /usr/local/var/run/redis.pid

logfile  /var/log/redis/redis.log

dir  /var/lib/redis

现在,重命名配置文件为redis_1.conf,并将内容修改为以下:

port  6379

pidfile  /usr/local/var/run/redis_1.pid

logfile  /var/log/redis/redis_1.log

dir  /var/lib/redis_1

保存以后,复制这个配置文件生成redis_2.conf,并修改里面的信息为:

port  6378

pidfile  /usr/local/var/run/redis_2.pid

logfile  /var/log/redis/redis_2.log

dir  /var/lib/redis_2

如要启动两个Redis实例,则可以分别运行两条命令:

redis-server  redis_1.conf

redis-server  redis_2.conf

这种方法创建出来的两个Redis实例,一个使用6379端口,另一个使用6378端口。两个实例完全隔离,互不影响。但弊端是过程繁琐。

2.使用Redis自带的16个数据库

一个Redis实例,实际上自带了16个命名空间互相隔离的数据库。在默认情况下,用命令行进入  Redis  交互环境的命令为“redis-cli”,运行以后执行“keys  *”命令可以看到当前有很多的Key,如图13-7所示。

图13-7  Redis中已经有很多Key了

退出交互模式,稍微修改一下命令(见下方)再次运行。效果如图13-8所示。

redis-cli  –n  2

图13-8  修改命令以后进入Redis交互模式

从图13-8可以看出,现在进入的这个交互模式就像是一个全新的Redis,其中什么数据都没有。

Redis的一个实例自带了16个数据库,编号为0~15。在终端里可以使用以下命令进入不同的数据库。如果省略“-n”参数,表示使用“0”号数据库。

redis-cli  –n  数据库编号

在Python中,可以使用“db”参数进入不同的数据库,见下方代码:

import  redis

client  =  redis.Redis(db=2)  #  进入编号为“2”的数据库,省略“db”参数表示使用“0”号数据库

默认数据库的数量是16,可以通过修改Redis的配置文件来增加可用的数据库的个数。

3.单实例多数据库的弊端

由于Redis是单线程的数据库,所以,一个实例里的多个数据库的Key可以同名,且互不冲突。但是,一旦其中一个数据库卡住(例如对几百万个Key执行“keys  *”命令),那么其他数据库也不能正常使用。一旦对某一个数据库进行了一个比较耗时的操作,那么对其他数据库的操作都会受到影响。一个Redis实例的所有数据库都只能共享CPU的一个核。

而如果通过多个配置文件启动多个  Redis  实例,则不会存在这种问题,即使一个实例卡死了,其他的实例仍能正常工作。



13.3.2  尽可能为每个Key设置过期时间


Redis中可能会有几百万个Key,而如果不手动清理这些Key,日积月累它们就会拖慢Redis的运行效率并且占用大量内存空间。所以,尽可能为每个Key设置合理的过期时间,这样即使忘记清理,到时间以后Redis也会自动把它删除,从而有效释放内存空间。

字符串有一个ex参数,表示过期时间。而对于其他数据结构,可以使用expire方法来设置过期时间:

import  redis

client  =  redis.Redis()

client.hset('test',  'field',  123)

client.expire(test,  100)  #  第2个参数表示过期时间,单位为秒



本章小结


本章是本书的最后一章。读者在使用MongoDB与Redis做开发时,需要考虑代码的层次和逻辑,并且在开发的过程中注意代码编写规范。

MongoDB和Redis在开发过程中的可能会有一些陷阱。读者应该多以官方文档为依据,在遇到问题时,可查询官方文档看是否有提到相关的情况。

上一章 目录 下一章