我们为每个位置指定了一个ID和一个类别,稍后我们将使用该类别按类型搜索位置。“位置”字段以经度、纬度格式存储坐标……这与通常的经度、纬度格式相反。稍后,我们将在查看“重新搜索”模块时,了解如何使用它执行地理空间搜索。

对于每一个位置,我们也存储已经由所有用户的记录有签总数,星星的总数,那些签了位置,每签的位置的平均星级。

我们希望为每个位置维护的第二种数据类型是我们所说的“位置细节”。它们采用更结构化的JSON文档的形式,其中包含嵌套的对象和数组。下面是138号地点Stacey's Country bakery的例子:

{
“id” 138
“小时” [
{ “日” “周一” “小时” “以8:7” }
{ “日” “星期二” “小时” “9-7” }
{ “日” “星期三” “小时” “-” }
{ “日” “星期四” “小时” 6尺6寸的大“交手” }
{ “日” “星期五” “小时” “朝九晚五” }
{ “日” “星期六” “小时” “8” }
{ “日” “星期天” “小时” “7” }
]
“社交” [
{ “instagram” “staceyscountrybakehouse”
“Facebook” “staceyscountrybakehouse”
“推特” “staceyscountrybakehouse”
}
]
“网站” “www.staceyscountrybakehouse.com”
“描述” “Lorem ipsum……”
“电话” "(316) 157-8620"
}

我们希望构建一个API,它允许我们检索所有或部分额外的细节,并保持文档的整体结构完整。为此,我们将需要RedisJSON模块,我们将在后面看到。

签到
{
“标识” 789
“位置ID” 171
“starRating” 5.
}

在这里,我们看到用户789访问了位置171(“Hair by Parvinder”),并对该服务印象深刻。

我们需要一种存储签入足够长的时间来处理它们的方法,但不是永久的。我们还需要将时间戳与每个时间戳关联起来,因为在处理数据时将需要时间戳。

Redis提供了一种非常适合这种情况的流数据类型——使用Redis流,我们可以存储名称/值对的映射,并让Redis服务器为我们标记它们的时间戳。流也非常适合于我们想要对这些数据进行的异步处理。当用户将新签入发布到我们的API时,我们希望存储该数据并尽快向用户响应我们已收到的数据。稍后,我们可以让系统的一个或多个其他部分对其进行进一步处理。这样的处理可能包括更新用户的签入总数和最后一次在字段中看到的次数,或者计算一个位置的新平均星级。

应用程序体系结构

还有一个数据加载器组件,我们将使用一些初始示例数据加载到系统中。

步骤1。克隆存储库
吉特 克隆https://github.com/redislabs-training/node-js-crash-course.git
光盘 node-js-crash-course
npm 安装

第二步。运行Redis容器
$ docker-compose up -d
创建网络 “node-js-crash-course_default” 使用默认驱动程序
创建rediscrashcourse .。 完成
$搬运工 ps

docker ps命令的输出应该显示一个正在运行的容器,使用“redislabs/redismod”图像。这个容器运行Redis6,其中包含RedSearch、RedisJSON和RedisBloom模块。

第3步:加载示例数据的Redis
$ npm 运行负载
> 节点src /跑龙套dataloader.js— “全部”
加载用户数据 .。
用户数据加载 0. 错误。
加载位置数据 .。
位置数据加载 0. 错误。
加载位置的细节 .。
位置细节数据加载 0. 错误。
数据加载中签流条目 .。
加载 5000 签入流条目。
建立消费者团体 .。
消费者团体创建的。
删除任何现有索引,创建新索引 .。
创建索引。
删除任何以前布隆过滤器,创造新的布隆过滤器 .。
布隆过滤器创建。

在另一个终端窗口中,运行Docker容器中的redis cli可执行文件。然后,输入Redis cli提示符处显示的Redis命令,以验证数据是否已成功加载:

$搬运工 exc. -它重新定义了课程redis cli
127.0 .0.1:637 9. > hgetall ncc:位置:106
1 “id”
2 “106”
3. “姓名”
4. “万岁珍珠奶茶”
5. “类别”
6. “咖啡店”
7. “位置”
8. “-122.268645,37.764288”
9. “numCheckins”
10 “886”
11 “numStars”
12 "1073"
13 “averageStars”
14 “1”
127.0 .0.1:637 9. > hgetall ncc:用户:12
1 “id”
2 “12”
3. “名”
4. “Franziska”
5. “姓”
6. “Sieben”
7. “电子邮件”
8. “franziska.sieben@example.com”
9. “密码”
10 2 b美元 $ 05 uV38PUcdFD3Gm6ElMlBkE美元 .lzZutqWVE6R6ro48GsEjcmnioaZZ55C”
11 “numCheckins”
12 “8945”
13 “lastCheckin”
14 “1490641385511”
15 “lastSeenAt”
16 “22”
127.0 .0.1:637 9. > xlen ncc:签入
整数 5000

第4步:启动和配置RedisInsight

现在你应该可以浏览你的Redis实例了。如果你需要更多关于如何从RedisInsight连接到Redis的指导,请查看Justin的视频,但要确保使用127.0.0.1作为主机,6379作为端口,并在配置数据库时留下用户名和密码字段空白。

第5步。启动应用程序
“应用” {
“港口” 8081
}

像这样启动服务器:

$ npm 运行开发
> ./node_modules/nodemon/bin/nodemon.js
[ 诺德蒙 ] 2.0 .7.
[ 诺德蒙 ] 在任何时候重新启动,进入 ` rs `
[ 诺德蒙 ] 看路 S. : * . *
[ 诺德蒙 ] 看扩展:js,乔丹,json
[ 诺德蒙 ] 开始 ` 节点src/server.js `
警告:未设置环境变量天气API密钥 !!
info:监听端口的应用程序 8081

这将使用nodemon启动应用程序,nodemon监视源代码中的更改,并在检测到更改时重新启动服务器。在下一个模块中,您将进行一些代码更改,这将非常有用。

忽略关于WEATHER_API_KEY- 我们将在后面的练习中,当我们看看使用Redis的作为缓存解决这个问题。

要验证服务器是否正确运行并连接到Redis,请将浏览器指向:

HTTP://本地主机:8081 / API /位置/ 200

你应该看到的位置200的摘要信息,卡蒂亚的厨房:

{
“id” “200”
“姓名” “卡蒂亚的厨房”
“类别” “餐馆”
“位置” “-122.2349598、37.7356811”
“numCheckins” “359”
“numStars” “1021”
“averageStars” “3”
}

太棒了!现在你可以开始工作了。让我们进入下一个模块,看看我们如何在应用程序中使用Redis哈希。您还可以编写一些代码!

第六步。停止redis cli、redis容器和应用程序
127.0 .0.1:637 9. > 辞职
$

要停止Redis服务器,请确保您在node-js-crash-course将应用程序repo签出到的文件夹,然后:

$docker下线
停止rediscrashcourse .。 完成
删除rediscrashcourse .。 完成
删除网络node-js-crash-course_default

Redis将数据保存到“redisdata”文件夹中。如果你想删除它,就删除它:

$ rm -rf redisdata

要停止应用程序的每个组件,请在组件运行的终端窗口中按Ctrl+C。例如,要停止API服务器:

$ npm 运行开发
> ./node_modules/nodemon/bin/nodemon.js
[ 诺德蒙 ] 2.0 .7.
[ 诺德蒙 ] 在任何时候重新启动,进入 ` rs `
[ 诺德蒙 ] 看路 S. : * . *
[ 诺德蒙 ] 看扩展:js,乔丹,json
[ 诺德蒙 ] 开始 ` 节点src/server.js `
info:监听端口的应用程序 8081
^C
node-js-crash-course美元

我们使用Redis的内置Hash数据类型来表示我们的用户和位置实体。哈希非常适合这一点,但它们受到限制,因为它们只能包含平面名称/值对。对于我们的位置,我们希望以更结构化的方式存储额外的细节。

下面是一个我们想要存储的关于位置的额外数据的例子:

{
“id” 121
“小时” [
{ “日” “周一” “小时” “6” }
{ “日” “星期二” “小时” “6” }
{ “日” “星期三” “小时” “7 - 8” }
{ “日” “星期四” “小时” “6 - 9” }
{ “日” “星期五” “小时” “8 - 5” }
{ “日” “星期六” “小时” “因” }
{ “日” “星期天” “小时” "6-4" }
]
“社交” [
{
“instagram” “theginclub”
“Facebook” “theginclub”
“推特” “theginclub”
}
]
“网站” “www.theginclub.com”
“描述” “Lorem ipsum…”
“电话” “(318)251 - 0608”
}

我们可以把该数据存储为一个字符串Redis的JSON序列化,但随后我们的应用程序将不得不检索和每次想读一些数据时分析整个文档。我们不得不这样做太更新。此外,使用这种方法,更新操作不是原子和第二客户端可以更新存储在给定键的同时,我们在各自的应用程序代码进行更改它的JSON。然后,当我们序列化了我们对JSON回Redis的字符串的版本,其他客户端的改变会丢失。

RedisJSON增加了一个新的JSON数据类型的Redis,以及用于Redis的服务器上的JSON文档中选择和更新各个元素原子的查询语法。这使得我们的应用程序代码更简单,更高效,更可靠。

步骤7。最后的练习
//练习:确定一天的营业时间。
路由器 得到
' /位置/:locationId /小时/天的
[
参数 “locationId” 出现 { 最小值 1 }
参数 “天” 出现 { 最小值 0. 马克斯 6. }
apiErrorReporter
]
异步的 res. => {
/*eslint禁用无未使用的变量*/
常量 { locationId 白天 } = PARAMS ;
/ * eslint-enable * /
常量 locationDetailsKey = 复述, getKeyName 'locationdetails' locationId ;
// TODO:获取某一天的开放时间
// JSON存储在locationDetailsKey持有的键。
//你需要提供正确的JSON路径到小时
//数组并返回保存在指定位置的元素
//日期变量。确保RedisJSON只返回当天
/ /请求!
常量 jsonPath = “待办事项” ;
/ * eslint启用无未使用 - 瓦尔* /
常量 hoursForDay = JSON 解析 等待 redisClient 调用 'JSON.GET' locationDetailsKey jsonPath ;
/*eslint禁用*/
//如果响应为空,则返回空对象。
res. 状态 200 杰森 hoursForDay || { } ;
}
;

您需要更新代码以提供正确的JSON路径,用JSON路径表达式替换“TODO”值。

查看按键存储的JSONNCC:locationdetails:121中,我们看到的开放时间被存储作为对象的一个​​字段的阵列命名小时,其中0天是星期一和6日是星期日:

RedisInsight中的位置详细信息“S.rc=

所以,你需要一个JSON路径查询从得到正确的元素小时阵列根据存储在该变量中的值白天

如果你正在使用redis-cli,你可以使用以下命令查看JSON文档的结构:

json.get NCC:locationdetails:121

确保只有一天中请求查询返回,这样你就不必写Node.js的代码过滤从Redis的返回值。使用RedisJSON路径语法页以帮助您制定正确的查询。

要测试代码,请使用以下命令启动服务器:

$ npm 运行开发

回想一下,这将允许您在不重新启动服务器的情况下编辑代码并尝试更改。

如果您的代码中有正确的JSON路径,请访问http://localhost:80801/api/location/121/hours/2应该返回:

{
“日” “星期三”
“小时” “7 - 8”
}

外部资源示例社交网络GitHub存储库
  • RedisJSON
  • 如何存储和检索嵌套的JSON文档
  • 使用NodeJS导入JSON数据到Redis
  • 学习更多关于RedisJSON在快速入门教程中。
  • Baidu