文章来源:linux性能优化实战
redis 是最常用的键值存储系统之一 , 常用作数据库、高速缓存和消息队列代理等 。Redis 基于内存来存储数据 , 不过 , 为了保证在服务器异常时数据不丢失 , 很多情况下 , 我们要为它配置持久化 , 而这就可能会引发磁盘 I/O 的性能问题 。
今天 , 我就带你一起来分析一个利用 Redis 作为缓存的案例 。
这同样是一个基于 Python Flask 的应用程序 , 它提供了一个 查询缓存的接口 , 但接口的响应时间比较长 , 并不能满足线上系统的要求 。
非常感谢携程系统研发部资深后端工程师董国星 , 帮助提供了今天的案例 。
案例准备本次案例还是基于 Ubuntu 18.04 , 同样适用于其他的 Linux 系统 。我使用的案例环境如下所示:
机器配置:2 CPU , 8GB 内存
预先安装 Docker、sysstat 、git、make 等工具 , 如 apt install docker.io sysstat
今天的案例由 Python 应用 +Redis 两部分组成 。其中 , Python 应用是一个基于 Flask 的应用 , 它会利用 Redis , 来管理应用程序的缓存 , 并对外提供三个 HTTP 接口:
/:返回 hello redis;
/init/:插入指定数量的缓存数据 , 如果不指定数量 , 默认的是 5000 条;
缓存的键格式为 uuid:
缓存的值为 good、bad 或 normal 三者之一
/get_cache/<type_name>:查询指定值的缓存数据 , 并返回处理时间 。其中 , type_name 参数只支持 good, bad 和 normal(也就是找出具有相同 value 的 key 列表) 。
由于应用比较多 , 为了方便你运行 , 我把它们打包成了两个 Docker 镜像 , 并推送到了 Github 上 。这样你就只需要运行几条命令 , 就可以启动了 。
今天的案例需要两台虚拟机 , 其中一台用作案例分析的目标机器 , 运行 Flask 应用 , 它的 IP 地址是 192.168.0.10;而另一台作为客户端 , 请求缓存查询接口 。我画了一张图来表示它们的关系 。
文章插图
接下来 , 打开两个终端 , 分别 SSH 登录到这两台虚拟机中 , 并在第一台虚拟机中安装上述工具 。
跟以前一样 , 案例中所有命令都默认以 root 用户运行 , 如果你是用普通用户身份登陆系统 , 请运行 sudo su root 命令切换到 root 用户 。
到这里 , 准备工作就完成了 。接下来 , 我们正式进入操作环节 。
案例分析首先 , 我们在第一个终端中 , 执行下面的命令 , 运行本次案例要分析的目标应用 。正常情况下 , 你应该可以看到下面的输出:
$ docker runec41cb9e4dd5cb7079e1d9f72b7cee7de67278dbd3bd0956b4c0846bff211803
然后 , 再运行 docker ps 命令 , 确认两个容器都处于运行(Up)状态:
$ docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES2c54eb252d05 feisky/redis-App "python /app.py" 48 seconds ago Up 47 seconds appec41cb9e4dd5 feisky/redis-server "docker-entrypoint.s…" 49 seconds ago Up 48 seconds 6379/tcp, 0.0.0.0:10000->80/tcp redis
比如 , 我们切换到第二个终端 , 使用 curl 工具 , 访问应用首页 。如果你看到 hello redis 的输出 , 说明应用正常启动:接下来 , 继续在终端二中 , 执行下面的 curl 命令 , 来调用应用的 /init 接口 , 初始化 Redis 缓存 , 并且插入 5000 条缓存信息 。这个过程比较慢 , 比如我的机器就花了十几分钟时间 。耐心等一会儿后 , 你会看到下面这行输出:
推荐阅读
- 响应速度与智能化如何平衡,携程酒店搜索实践
- 使用Redis轻松实现秒杀系统
- 慢性咽喉炎的症状
- mongodb,redis,hbase,三者都是nosql数据库,他们的最大区别和不同定位是什么?
- Redis、传统数据库、HBase以及Hive的区别
- 聊聊Mysql索引和redis跳表
- Redis:缓存被我写满了,该怎么办?
- 肾结石严重吗?专业人士来回答!
- 老人心肌梗塞严重吗
- ios15.1更新后电池,苹果11升级ios14.4.1耗电严重-