Bluemix 支持访问优秀的数据库服务,无需执行任何安装或管理操作。对于存储计数器,我的许多选择包括多个关系数据库和 NoSQL 选项,比如 MongoDB、Cloudant 和 Redis。
“Redis 服务的生命周期与应用程序的生命周期独立,所以存储在服务中的数据会在应用程序重新启动后持久保存。”
这部分从一个新的 DevOps Services 项目入手,所以在继续我们的介绍之前,没有必要完成 和 中的练习。
示例应用程序将数据存储在一个由 Bluemix 管理的独立的 Redis 服务中。该服务的生命周期与应用程序的生命周期独立,所以存储在该服务中的数据会在应用程序重新启动后持久保存。
要访问 Bluemix 服务,需要在代码中执行大量设置。您将使用一个包含所有 Redis 服务设置的入门项目。新应用程序流类似于:
对您的要求
第 1 步:创建并部署您的 HTML 数据库应用程序的副本- 从 Web 浏览器登录到 。
- 在一个独立的浏览器选项卡中,登录到 。
- 单击本文上面的 获取代码(Get the code)按钮。
- 在 DevOps Services 中,单击 EDIT CODE 按钮,然后单击菜单上的 FORK 按钮来创建您自己的代码副本供您使用,并使用您选择的项目名称保存它。
- 快速看看相关的文件:
- 在 package.json 中,可以看到 Redis 的其他依赖关系: "redis":"*"。
- 在 manifest.yml 中,可以看到创建 Redis 服务的规范:
1
2
3
4
5
6
| services:
redis-5a659:
label: redis
provider: core
version: '2.6'
plan: 100
|
- 在 app.js 中,搜索 redis 以查看对 Redis 服务的接口执行的所有更改。
- 使用本文章系列的前 2 部分中使用的相同流程,手动部署该应用程序。
- 单击根文件夹页面的 Manual Deployment Information 区域中的 NodeJS_Simple_3 链接,以便在新的浏览器选项卡中打开该应用程序。

在运行的应用程序中,可以看到两个都以 1 开始的用户计数:Node.js 服务器中的用户计数(在 中配置)和一个存储在数据库中的新计数。 - 刷新该浏览器页面并在每次刷新后观看计数增量。现在(第一次部署后),服务器中的用户计数和数据库中的用户计数仍然相同。
第 2 步:观察重新启动后的数据库持久性- 返回到 DevOps Services 中的手动部署信息,突出显示您的部署,然后单击实心的黑色正方形来停止您的应用程序:
 - 再次突出显示您的部署,单击指向右侧的实心三角形来启动该应用程序:

- 浏览正在运行的应用程序。您可能注意到,Node.js 应用程序中的用户计数重置为 1,但在,在您停止并重新启动应用程序之前的页面上所显示的数字上,来自数据库的计数已开始递增。出现这种情况是因为,Redis 服务拥有独立于 Node.js 应用程序的生命周期。
第 3 步:在 Bluemix 上使用 Redis 服务使用 Bluemix 仪表板直接使用 Bluemix 服务:
- 在 DevOps Services 手动部署信息中突出显示您的部署,单击 Manage 链接。此操作会打开 Bluemix 仪表板,您可以在其中处理该应用程序和 Redis 服务:
 - 单击右上角附近的齿轮形状的按钮,然后单击 Delete App。
- 在 Are you sure... 对话框中,选择删除 Redis 服务 (redis-5a659) 的复选框并单击 OK。通过删除该服务和应用程序,可以删除跨应用程序重启而持久保存的数据库计数器。
- 返回到 DevOps Services 中的手动部署信息,使用云形状的按钮重新部署该应用程序。因为您删除了 Redis 服务,所以这次部署会创建该服务的一个新实例。
- 浏览正在运行的应用程序,您可以观察到,Redis 数据库中存储的用户计数也被重置为 1。
第 4 步:向数据库添加数据现在将会更新代码,将一个计数器存储在 Redis 服务中(该计数器将按 2 递增),然后在 HTML 页面上显示该计数器。因为对 Redis 服务的调用是异步的,所以必须在一个嵌套的结构中插入新调用,以确保正确的排序。(另一个选项是添加显式异步库 — 这个主题不属于本文的讨论范围。)
- 打开 app.js 并找到 client.incrby 行。此语句将会递增 Redis 中的 DBuserCountBy1 变量,在 replyBy1 变量中返回更新的值。
- 添加一行来将数据库变量 DBuserCount2 按 2 递增,返回值 replyBy2:
1
| client.incrby("DBuserCountBy2", 2, function (err, replyBy2);
|
要确保对 Redis 的调用是同步的,此语句必须嵌套在 DBuserCountBy1 的增量内: 1
2
| client.incrby("DBuserCountBy1", 1, function (err, replyBy1) {
client.incrby("DBuserCountBy2", 2, function (err, replyBy2) {
|
确保还添加了结束的 });。 - 更新 res.render 语句,以便传递从 Redis 函数调用的 replyBy2 变量中返回的 DBuserCountby2:
1
| res.render('index', {userCount: userCount, DBuserCountBy1: replyBy1, DBuserbytwo: replyBy2});
|
代码的 app.get 部分现在应该类似于: 1
2
3
4
5
6
7
8
9
| app.get('/', function(req, res) {
userCount = userCount + 1;
// Increment the value in the database and render the results
client.incrby("DBuserCountBy1", 1, function (err, replyBy1) {
client.incrby("DBuserCountBy2", 2, function (err, replyBy2) {
res.render('index', {userCount: userCount, DBuserCountBy1: replyBy1, DBuserbytwo: replyBy2});
});
});
});
|
- 更新 index.ejs HTML 页面已呈现到 DbuserCountBy2:
1
| <p>The stored user count by two in my redis database is <%= DBuserCountBy2 %></p>.
|
- 重新部署该应用程序,验证所有计数的行为是否符合预期。
|