什么在一年内产生 3 亿吨固体废物? 美国消费者。 在这其中,只有一半直接进入垃圾填埋场储存。 当一个填埋场超负荷时,它会被封闭以防止泄漏。 同时,在地表深处,垃圾继续分解,产生许多有毒副产品,例如渗滤液,这是一种受污染的水。 还会产生一氧化碳,导致我们空气中的二氧化碳水平升高。
同样令人痛心的是, *50%* 的垃圾填埋场垃圾是可以堆肥、可重复使用和可回收的。 意识到这是完全可以避免的,Rajesh Ramamurthy 创建了一个卓越的应用程序 GreenEarth,它可以减少浪费并促进地球更环保。 该应用程序创建了一个平台,让世界各地的人们可以找到利用常见家庭垃圾的项目,将它们重新用于有用的物品或创意艺术项目。
Redis 用于从云数据库检索用户信息,并以超高的效率存储各个用户属性。 这对于 Greener Earth 的功能至关重要,因为需要快速执行数据处理才能最大限度地提高用户体验。
让我们来看看 Rajesh 是如何将这个创新的应用程序变为现实的。 但在我们深入研究之前,我们想指出,在 Redis Launchpad 上,我们还有 29 个令人兴奋的应用程序正在改善日常生活。 因此,请务必在阅读此帖子后浏览一下。
一个应用程序。 一个社区和一个平台,供人们帮助拯救地球。 此应用程序将具有环保意识的人与利用家居用品的项目联系起来。 例如,如果用户想要利用他们的空罐头,Green Earth 将他们与演示如何使用这些物品来创建有用的家居用品的项目联系起来。
下面我们将向您展示如何按时间顺序逐步构建此应用程序。 我们还将重点介绍您需要的组件及其功能。
brew install npm
创建您的免费 Redis Enterprise Cloud 帐户。 点击“开始”后,您将收到一封电子邮件,其中包含激活您的帐户并完成注册过程的链接。
点击此链接 在 Redis Enterprise Cloud 数据库下启用 RedisJSON 模块。
git clone https://github.com/redis-developer/greenearth
将目录更改为 greenearth 目录并安装所需的依赖项
npm install
要连接到启用 RedisJSON 的 Redis Enterprise Cloud 数据库,您需要在 index.js 中编辑以下代码。
const client = redis.createClient({
port : // database port,
host : // database url,
password : // database password
});
您还需要运行 npm start 以启动 http://localhost:3000 上的本地服务器。
npm start
下面是需要设置的许多功能,应用程序才能正常工作。 让我们来看看需要做什么。
用户
创建用户帐户。
SADD – 将用户名添加到全局用户集
HMSET – 创建包含哈希密码、描述和个人资料图片等信息的用户对象
允许用户登录到现有帐户。
async function login(name, password) {
if (client.sismember(['users', name])) {
const hash = crypto.createHash('sha256');
hash.update(password);
var pwdhash = hash.digest('hex');
const hget = promisify(client.hget).bind(client);
var pwd = await hget([name, 'pwd']);
if (pwdhash === pwd) {
console.log("Successful sign-in");
var token = uuidv4();
const hset = promisify(client.hset).bind(client);
await hset(['active', token, name]);
return token;
} else {
console.log("Incorrect password");
return null;
}
} else {
console.log("Account does not exist");
return null;
}
}
SISMEMBER – 检查输入的用户名是否是有效的成员
HGET – 通过检索注册的密码并进行比较来验证输入的密码
HSET – 将用户名与生成的会话令牌添加到活跃用户组
注销登录的帐户。
async function logout(token) {
var name = await authUser(token);
console.log(token);
console.log(name);
if (name == null) {
console.log("Not signed in");
} else {
const hdel = promisify(client.hdel).bind(client);
await hdel(['active', token]);
console.log("Successful logout");
}
}
HGET – 从提供的会话令牌检索用户
HDEL – 从活跃用户组中删除用户和会话令牌
检索指定用户的信息(用户名、描述、个人资料图片)。
app.get('/userInfo', async (req, res) => {
var name = req.query.name;
const hmget = promisify(client.hmget).bind(client);
var user = await hmget(name, 'id', 'description', 'image');
res.send([name, ...user]);
})
HMGET – 从提供的属性检索用户数据
设置指定用户的特定属性(描述、个人资料图片)。
async function setField(token, field, value) {
var name = await authUser(token);
const hmset = promisify(client.hmset).bind(client);
await hmset(name, field, value);
}
HMSET – 使用提供的数据设置用户属性
从提供的用户信息添加帖子。
app.get('/allPosts', async (req, res) => {
var name = req.query.name;
const hget = promisify(client.hget).bind(client);
const lr = promisify(client.lrange).bind(client);
const hgetall = promisify(client.hgetall).bind(client);
const json_get = promisify(client.json_get).bind(client);
var id = await hget([name, 'id']);
var posts = await json_get(id);
posts = JSON.parse(posts);
var newposts = {"posts": []};
if (posts != null) {
for (var i = 0; i < posts.length; i++) {
var p = posts[i];
if (p["visibility"] === "on") {
newposts["posts"].push(p);
}
}
}
console.log(newposts);
res.send(newposts);
})
HGET – 检索用户帖子列表 ID
JSON.SET – 从提供的信息创建一个帖子并将其添加到用户帖子列表中
JSON.GET – 检索用户帖子列表
编辑用户创建的现有帖子。
async function editPost(token, pid, title, description, image, recipe, steps, visibility) {
var name = await authUser(token);
const hget = promisify(client.hget).bind(client);
const json_get = promisify(client.json_get).bind(client);
const json_set = promisify(client.json_set).bind(client);
var id = await hget([name, 'id']);
var posts = await json_get(id, ".");
var globalPosts = await json_get('globalPosts', ".");
posts = JSON.parse(posts);
globalPosts = JSON.parse(globalPosts);
console.log(posts);
const newpost = {
pid: pid,
title: title,
description: description,
author: "",
image: image,
recipe: recipe,
steps: steps,
comments: [],
visibility: visibility
}
var vis;
if (posts != null) {
for (var i = 0; i < posts.length; i++) {
if (posts[i]["pid"] === pid) {
vis = posts[i]["visibility"];
newpost.author = posts[i]["author"];
newpost.comments = posts[i]["comments"];
posts[i] = newpost;
break;
}
}
}
if (vis === "on") {
if (globalPosts != null) {
for (var i = 0; i < globalPosts.length; i++) {
if (globalPosts[i]["pid"] === pid) {
globalPosts[i] = newpost;
if (visibility === "off") {
globalPosts.splice(i, 1);
} else if (visibility === "on") {
globalPosts[i] = newpost;
}
break;
}
}
}
} else {
if (visibility === "on") {
globalPosts.push(newpost);
}
}
await json_set(id, '.', JSON.stringify(posts));
await json_set('globalPosts', '.', JSON.stringify(globalPosts));
console.log("Post edited");
}
HGET – 检索用户帖子列表 ID
JSON.SET – 根据用户帖子列表中提供的信息,将现有帖子替换为新帖子
JSON.GET – 检索用户帖子列表
删除用户创建的现有帖子。
async function deletePost(token, pid) {
var name = await authUser(token);
const hget = promisify(client.hget).bind(client);
var id = await hget([name, 'id']);
const json_get = promisify(client.json_get).bind(client);
const json_set = promisify(client.json_set).bind(client);
var posts = await json_get(id, ".");
posts = JSON.parse(posts);
console.log(posts);
if (posts == null) {
posts = [];
}
var vis;
for (var i = 0; i < posts.length; i++) {
if (posts[i]["pid"] == pid) {
vis = posts[i]["visibility"];
posts.splice(i, 1);
break;
}
}
await json_set(id, '.', JSON.stringify(posts));
if (vis === "on") {
var posts = await json_get('globalPosts', ".");
posts = JSON.parse(posts);
if (posts == null) {
posts = [];
}
for (var i = 0; i < posts.length; i++) {
if (posts[i]["pid"] == pid) {
posts.splice(i, 1);
break;
}
}
await json_set('globalPosts', '.', JSON.stringify(posts));
}
}
HGET – 检索用户帖子列表 ID
JSON.SET – 删除帖子并将其添加到用户帖子列表中
JSON.GET – 检索用户帖子列表
检索指定帖子的信息(标题、描述、图像、材料、说明、评论)。
app.get('/postInfo', async (req, res) => {
var pid = req.query.pid;
var post = await findPostByID(pid);
res.send(post);
})
JSON.GET – 从用户帖子列表中检索帖子
检索所有全局帖子或特定用户创建的帖子。
app.get('/allPosts', async (req, res) => {
var name = req.query.name;
const hget = promisify(client.hget).bind(client);
const lr = promisify(client.lrange).bind(client);
const hgetall = promisify(client.hgetall).bind(client);
const json_get = promisify(client.json_get).bind(client);
var id = await hget([name, 'id']);
var posts = await json_get(id);
posts = JSON.parse(posts);
var newposts = {"posts": []};
if (posts != null) {
for (var i = 0; i < posts.length; i++) {
var p = posts[i];
if (p["visibility"] === "on") {
newposts["posts"].push(p);
}
}
}
console.log(newposts);
res.send(newposts);
})
JSON.GET – 检索用户或全局帖子列表
检索用户创建的所有草稿。
app.get('/allDrafts', async (req, res) => {
var name = req.query.name;
const hget = promisify(client.hget).bind(client);
const lr = promisify(client.lrange).bind(client);
const hgetall = promisify(client.hgetall).bind(client);
const json_get = promisify(client.json_get).bind(client);
var id = await hget([name, 'id']);
var posts = await json_get(id);
posts = JSON.parse(posts);
var newposts = {"posts": []};
if (posts != null) {
for (var i = 0; i < posts.length; i++) {
var p = posts[i];
if (p["visibility"] === "off") {
newposts["posts"].push(p);
}
}
}
console.log(newposts);
res.send(newposts);
})
JSON.GET – 检索用户草稿列表
允许用户评论帖子。
HGET – 检索帖子评论列表 ID
JSON.SET – 创建评论并将其添加到帖子评论列表中
JSON.GET – 检索帖子评论列表
网站上的任何人都可以搜索他们拥有的材料或他们感兴趣的项目。 首先,只需访问 Green Earth 主页。
点击页面顶部的“帖子”选项卡。 这将带您到搜索栏,您可以在其中输入您想要回收的家居用品。 因此,例如,如果您有很多想要重新利用的罐头,只需输入“罐头”或该关键字的变体(请参见下面的图像)。
一旦您输入了这些,将会显示需要您的家居用品的项目列表。 点击其中一个结果会将您带到该帖子的项目页面。
在这里,您将发现您需要了解的有关该项目的所有信息,从用户评论到所需材料,再到您需要遵循的说明(请参见下文)。
点击页面顶部的“注册”选项卡。 在这里,您可以为您的帐户创建一个用户名和密码。
创建帐户并登录后,下一步是更新您的个人资料。 您可以通过点击导航栏顶部的用户名并选择“个人资料”来执行此操作。
然后您将被定向到您的个人资料页面,该页面将为空(请参见下文)。
从这里,您可以更新个人资料的每个部分,包括您的个人资料照片和个人简介。
设置个人资料后,您就可以在帖子上发表评论。 要执行此操作,首先找到您要评论的帖子(请参见“如何找到一个项目”部分)。 每个帖子中的评论部分都可以在项目页面的底部找到(请参见下面的示例)。
要创建帖子,您首先需要转到您的个人资料仪表板。 点击个人资料右上角的“+”符号(请参见下文)。
然后您将被定向到“创建帖子页面”。 从这里,您将看到许多需要填写的不同字段,从项目名称到说明,再到将这个项目变为现实所需的材料。
在每个部分中添加您的项目详细信息,如下所示。
完成每个部分后,您可以选择删除、保存或发布此帖子,这些选项位于页面底部。
您的所有草稿和帖子都将显示在您的个人资料仪表板中。
要编辑其中一个,首先,点击您要编辑的帖子或草稿。 接下来,点击页面左下角的编辑按钮。 或者,您可以通过点击它旁边的垃圾桶图标来删除该帖子。
气候变化是每个人关注的问题,促使人们采取更绿色的生活方式。 但为了使绿色倡议取得成果,在线平台需要高效,并由能够以高速传输数据的数据库提供支持。
这是因为任何延迟都会妨碍用户体验,并将人们从这些平台上赶走。 然而,借助 Redis,GreenEarth 能够以这样的速度运行,使其应用程序中的所有组件都能够更加互连。
感谢 Redis,从云数据库检索用户信息以及存储单个用户属性变得轻而易举。 从头到尾,一切都以超高的效率进行。
Rajesh 是技术领域的著名问题解决者,为客户提供解决复杂问题的简单方案。
请务必查看他的 GitHub 页面,了解他参与的其他项目。
如果您想了解有关此应用程序如何部署的更多信息,请务必观看 Rajesh 的 YouTube 视频。
我们还在Redis Launchpad 上为您准备了各种不同的应用程序,供您查看,全球的程序员都在利用 Redis 的强大功能来改变日常生活。看看吧。从中获得灵感。一起加入乐趣。