使用RedisJSON克隆HackerNews

Hacker News(有时缩写为HN)是一个专注于计算机科学和创业精神的社交新闻网站。这是一个HackerNews克隆,构建于React、NextJS作为前端,NodeJS、ExpressJS和Redis作为后端。该应用程序使用RedisJSON模块存储数据,使用RedisSearch模块进行搜索。

黑客新闻

步骤1。安装先决条件

安装以下软件包

  • NPM v7.8.0
  • 节点v15.10.0

步骤2.创建Redis企业云数万博体育彩据库

点击这个链接要创建具有2个数据库万博体育彩的Redis Enterprise Cloud帐户,一个数据库启用RedisJSON模块,另一个数据库启用RedisSearch模块。请注意,在免费订阅下,只能启用一个模块。如果要创建2个数据库,则可能需要创建2个不同的订阅。

保存数据库端点URL和密码以供将来参考

第三步。克隆存储库

吉特 克隆https://github.com/redis-developer/redis-hacker-news-demo
cd redis黑客新闻演示

步骤4.设置环境变量

.env副本。示例到.env并提供如下所示的值:

MAILGUN_API_KEY 你的价值在这里
搜索\u REDIS\u服务器\u URL 复述:/ /复述- xxxxx.c10.us -东- 1 - 2. - ec2.cloud.redislabs.com: 10292
SEARCH_REDIS_PASSWORD ABCDXYZbPXHWsC
JSON\u REDIS\u服务器\u URL 复述:/ /复述- xxxxx.c14.us -东- 1 - 2. - ec2.cloud.redislabs.com: 14054
JSON_REDIS_密码 ABCDXYZA3tzw2XYMPi2P8UPm19D
对数级 1
USE_REDIS 1
重新索引
制作网站网址

步骤5.运行开发人员环境

npm 安装
npm 运行开发

第六步。将黑客新闻API拉入种子数据库

使用美国石油学会,它提取最新的黑客新闻数据。接下来,你需要从黑客新闻中挖掘头条新闻。首先创建一个moderator:password123

节点./backend/scripts/seed.js

步骤7。访问HackerNews URL

打开https://localhost:3001,您应该能够访问HackerNews登录屏幕如下所示:

黑客新闻

工作原理

通过屏幕

报名

注册屏幕

  • 确保用户(其中用户名为andy1)不存在。

    FT.SEARCH idx:用户@用户名: “andy1” 无含量限制 0 1 SORTBY _id DESC
  • 获取并增加用户集合中的下一个id。

    获取用户:id指示器// 63
    增量用户:id指示器// 64 将是下一个用户id, 63 是当前用户吗 id
  • 创建用户:63哈希和json。(json also collects authToken and password hash etc)

HSET用户:63用户名andy1 email已创建 1615569194 因果报应 0 关于showDead isModerator shadowBanned 禁止 _身份证 63
JSON.SET用户:63
“{”用户名“:”andy1“,”密码“:” 2a美元 $10 $ZY8TSCSKE8MFDX5CCWMCE5S1U7PJBPI7CFAQQ7BO1PO1ORDEQJXQHE ”、“authToken”:“AAV07FIwTiEkNrPj0x1yj6BPJQSGIPzV0sICw2u0”、“authTokenExpiration”:1647105194,“电子邮件”:“”、“创建”:1615569194,“业力”:0,”showDead”:假的,”isModerator”:假的,”shadowBanned”:假的,“禁止”:假的,“_id”:63}’

登录

登录屏幕

  • 找到用户

    FT.SEARCH idx:用户@用户名: “andy1” 无含量限制 0 1 SORTBY _id DESC
  • 确保密码正确

    JSON.MGET用户:63
  • 比较密码和新密码哈希,如果成功,则创建cookie

项目列表页

最新的屏幕

  • 检查用户是否已切换特定项的隐藏属性。

    FT.SEARCH idx: user-hidden @用户名: “andy1” 无含量限制 0 10000 SORTBY _id DESC
    / /结果- 0 “项目:4”
  • 如果它不为空

    FT.SEARCH idx:项目 - @身份证: “项目:4” )) @死亡: “假” 无含量限制 0 30 SORTBY _id ASC
  • 如果它是空数组

    FT.SEARCH idx:项目 @死亡: “假” 无含量限制 0 30 SORTBY _id ASC
    / /结果- 3. “项目:1” “项目:2” “项目:3”
  • 从JSON获取所有项目

    JSON.MGET项:1我tem:2 item:3
    / /结果- “id” “bkWCjcyJu5WT” “由” “托德萨切多蒂” “标题” “总饼干
    保护” “类型” “新闻” “url” “https://blog.mozilla.org/security/2021/02/23/total-cookie-
    保护/” “域” “mozilla.org” “点” :1, “得分” : 1514, “评论计数” :0, “创建” : 1614089461, “死了” :错, “_id” :3
  • 收到最近一周内寄出的物品

    FT.SEARCH idx:项目 @创建: 1615652598 +inf @死亡: “假” 无含量限制 0 0 SORTBY _id DESC
    / /结果- 13 “项目:19” “单品:17” “单品:16” “单品:15” “单品:14” “单品:13” “项目:12” “单品:11” “单品:8” “项目:5” “项目:4” “项目:3” “项目:1”

注意1615652598是比当前时间戳早1周的时间戳

JSON.MGET项:19 item:17 item:16 item:15 item:14 item:13 item:12 item:11 item:8 item:5 item:4 item:3 item:1
//结果-所选项目的JSON

项目详细信息

项目详细信息屏幕

  • 首先获取item对象

    JSON.MGET项:1
  • 查找item:1的根注释

    FT.SEARCH idx:评论 @parentItemId: “kDiN0RhTivmJ” @isParent: “对” @死亡: “假” 无含量限制 0 30 SORTBY points ASC
    / /结果- 3. “评论:1” “备注:2” “评论:12”
  • 得到那些评论

    JSON.MGET注释:1注释:2注释:12
    //一个注释示例结果- “id” “jnGWS8TTOecC” “由” “普罗西林” “parentItemId” “kDiN0RhTivmJ” “parentItemTitle” “框架
    笔记本电脑” “我的父母” :没错, “parentCommentId” "" “孩子” 13,17 ,20 “文本” “我没有看到任何关于固件和驱动程序在这方面所做努力的提及。
    固件和驱动程序总是比预期的更难处理。Fairphone公司对升级困难感到惊讶
    在没有BSP厂商支持的情况下给android打补丁,导致更新延迟数月,支持寿命缩短数年
    为他们早期的模型做计划。我从他们的kickstarter网站上购买了Purism Librem 13笔记本电脑,他们对固件和
    司机们,也很难跟上。为第一个模型选择的触控板花费了比预期更长的时间来获得上游linux
    支持,而且从来都不是很好(事实证明,不可能可靠地自动检测到它们的变体)。他们终于雇用了一个有经验的人
    在初始设备交付数月后,有足够的技能完成coreboot端口,并为初始设备交付了抛光的coreboot固件
    笔记本电脑在kickstarter推出几年后。

    那么,我们为什么要对该框架将提供的固件和驱动程序充满信心呢

    :)" “点” :1, “创建” : 1614274058, “死了” :错, “_id” :12
  • 使用每个注释的子注释,获取子注释

    FT.SEARCH idx:评论 @死亡: “假” @_身份证: "3" | "7" | "11" )) 无含量限制 0 10000 SORTBY _id DESC
  • 重复此操作,直到解决所有注释

提交

提交的屏幕

  • 获取下一个项目的id并增加它

    获取项目:id-indicator
    / /结果- 4
    设置项目:id指示器 5
  • 创建散列和JSON索引

    HSET项目:4 id Firebase的趋势 类型 询问url域文本Firebase性能监视是 服务 这有助于你
    了解你的iOS、Android和web应用的性能特征。点 1 分数 0 创建 1615571392 _身份证 4
JSON.SET项:4 “{”id:“iBi8sU4HRcZ2”,“by:“andy1”,“title:“Firebase趋势”,“type:“ask”,“url:”“domain:”“text:”“Firebase性能”
监控是一项帮助您深入了解iOS、Android和web的性能特征的服务
应用。”、“点”:1、“分数”:0,”commentCount”:0,“创建”:1615571392,“死”:假的,“_id”:4}

更新配置文件

屏幕更新配置文件

  • 获取用户
FT.SEARCH idx:用户 @用户名: “andy1” 无含量限制 0 1 SORTBY _id DESC
JSON.MGET用户:63
  • 更新新用户
HSET用户:63用户名andy1 email已创建 1615569194 因果报应 1 我是一个软件工程师。万博电竞客服showDead isModerator shadowBanned
禁止 _身份证 63
JSON.SET用户:63
“{”用户名“:”andy1“,”密码“:” 2a美元 $10 $ZY8TSCSKE8MFDX5CCWMCE5S1U7PJBPI7CFAQQ7BO1PO1ORDEQJXQHE “,”authToken“:”KJWPLN1IDYQRMP5QEY5HR3VHOPFTKRC8NPXXOJU“,”authTokenExpiration“:”1647106257,“电子邮件“:”创建“:”1615569194,“karma“:”1,“关于“:”我是一个软件万博电竞客服
工程师。”、“showDead”:假的,“isModerator”:假的,”shadowBanned”:假的,“禁止”:假的,“_id”:63}’

审核日志屏幕

审核日志

  • 查找所有审核日志
FT.SEARCH idx: moderator -log * NOCONTENT LIMIT 0 0 SORTBY _id DESC
/ /结果- 1 “审核日志:1”
  • 获取审核日志
JSON.MGET审核日志:1

搜索

搜索屏幕

  • 获取包含“fa”的项目
FT.SEARCH idx:项目 @标题:足总* - @身份证: “aaaaaaaaa” )) @死亡: “假” 无含量限制 0 30 排序分数ASC
/ /结果- 2 “项目:18” “单品:16”
  • 通过json获取这些项目
JSON.MGET项目:18项目:16

示例命令

有两种类型的字段,索引字段和非索引字段。

  1. 索引字段将使用HSET/HGET存储在散列中。
  2. 非索引字段将存储在JSON中。
  • 创建重新搜索索引

创建schema时,应该创建索引。

FT.CREATE idx:上的用户 搞砸 前缀 1 “用户:” 架构用户名文本可排序电子邮件文本可排序karma数字可排序
  • 下降再搜索指数

如果架构已更改,则应删除/更新索引

FT.DROPINDEX idx:用户
  • 得到RediSearch信息

验证字段索引是否正确。如果没有,它将更新索引字段或删除/重新创建。

FT.INFO idx:用户
  • 创建一个新用户

它将需要新的哈希和新的JSON记录

安迪HSET用户:用户名 “安迪” 电子邮件 "andy@gmail.com" 因果报应 0
JSON.SET用户:andy '{" password": "hashed_password", "settings": "{ \" showDead \" : true}"}'
  • 更新用户

    HSET用户:1个用户名 “newusername”
    JSON.SET用户:andyusername “newusername”
  • 查找用户名为“andy”的用户

  1. 首先找到用户的散列

    FT.SEARCH idx:用户“@用户名:{安迪}”
  2. 获取JSON对象以获取相关的JSON对象

    JSON.GET用户:andy
  • 查找id为andy1或andy2的用户

    FT.SEARCH idx:用户 @ id:(“andy1”|“andy2”)”
  • 查找id不是andy1或andy2的用户

    FT.SEARCH idx:用户 “(@id:(“andy1”|“andy2”)”
  • 查找id为andy1或用户名为andy的用户

    FT.SEARCH idx:用户 ”(@ id:“andy1”)|(@用户名:“安迪”)”
  • 查找id为andy1,用户名为andy的用户

    FT.SEARCH idx:用户 ”(@ id:“andy1”)(@用户名:“安迪”)”
  • 根据用户名查找前10个用户订单

    FT.SEARCH idx:用户 '*' 限度 0 10 SORTBY用户名ASC
  • 查找下10个用户

    FT.SEARCH idx:用户 '*' 限度 10 20 SORTBY用户名ASC
  • 从多个键获取

    JSON.MGET idx:用户 “andy1” “andy2” “andy3”

工具书类

Baidu