乐读窝

左手MongoDB,右手Redis-13.3 使用Redis的注意事项

乐读窝 > 文学作品 > 左手MongoDB,右手Redis

13.3 使用Redis的注意事项

书籍名:《左手MongoDB,右手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在开发过程中的可能会有一些陷阱。读者应该多以官方文档为依据,在遇到问题时,可查询官方文档看是否有提到相关的情况。
上一章目录下一章
推荐书籍:情商(全六册)不可不知的心理学系列如何让你的睡眠更高效21个方法找回婴儿般好睡眠大佬腹黑还爱演妇产科男医生告诉你:让你含着眼泪微笑的酸甜孕事从小就是欧皇的我穿书了穿越之农家子的科举攻略穿越后所有看不起我的人都来宠我穿书后所有人都开始爱我诸天之掌控天庭凤凰台上忆吹箫腹黑萌宝闹翻天最强狂婿猛鬼收容系统异界之无耻师尊末日侵袭神算天师无敌僵尸王异常魔兽见闻录