用 Go 和 Redis 构建一个简单的任务管理系统

server/2024/10/9 1:17:38/

用 Go 和 Redis 构建一个简单的任务管理系统

在这篇博客中,我们将使用 Go 语言结合 Gin 框架和 Redis,一步步创建一个简单的任务管理系统。本系统可用于执行关键的 CRUD(创建、读取、更新、删除)操作,我们特别关注如何通过 Redis 作为数据存储实现这些功能。

介绍

任务管理系统的特点在于能够让用户轻松地创建、查看和删除任务。现代的应用程序需要快速的数据写入和读取,而 Redis 提供了这样的能力,因此非常适合我们的需求。

项目初始化

1. 创建项目目录并初始化 Go 模块

首先,开始创建项目目录,并在我们的新目录中初始化 Go 模块:

mkdir task-manager
cd task-manager
go mod init task-manager

此操作将创建一个 go.mod 文件,用于管理我们的项目依赖。

安装依赖项

下面我们来安装必要的依赖库——Gin 用于处理 HTTP 请求,Go-Redis 用于连接和操作 Redis:

go get -u github.com/gin-gonic/gin
go get -u github.com/go-redis/redis/v8

这些库将为我们后续的开发提供强大的功能支持。

配置 Redis 连接

在项目根目录下创建 main.go 文件,用于初始化 Redis 连接和启动服务器:

package mainimport ("task-manager/controllers""github.com/gin-gonic/gin""github.com/go-redis/redis/v8"
)var rdb *redis.Clientfunc initRedis() {rdb = redis.NewClient(&redis.Options{Addr: "localhost:6379", // 设置 Redis 地址})
}func main() {initRedis()r := gin.Default()// 设置路由r.POST("/tasks", controllers.CreateTask)r.GET("/tasks", controllers.GetTasks)r.DELETE("/tasks/:id", controllers.DeleteTask)r.Run(":8080")
}

代码解释

Redis 客户端初始化:我们使用 go-redis 客户端连接到本地 Redis 服务器。
Gin 路由设置:通过 Gin,我们将不同的 HTTP 路径绑定到相应的处理函数。

实现控制器逻辑

在项目的根目录下创建一个 controllers 目录,并创建 task.go 文件:

package controllersimport ("context""net/http""task-manager/models""github.com/gin-gonic/gin""strconv"
)var ctx = context.Background()func CreateTask(c *gin.Context) {var task models.Taskif err := c.ShouldBindJSON(&task); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}task.ID = models.GenerateID()models.Rdb.Set(ctx, strconv.Itoa(task.ID), task.Title, 0)c.JSON(http.StatusOK, gin.H{"message": "Task created successfully", "id": task.ID})
}func GetTasks(c *gin.Context) {keys, _ := models.Rdb.Keys(ctx, "*").Result()var tasks []models.Taskfor _, key := range keys {title, _ := models.Rdb.Get(ctx, key).Result()id, _ := strconv.Atoi(key)tasks = append(tasks, models.Task{ID: id, Title: title})}c.JSON(http.StatusOK, tasks)
}func DeleteTask(c *gin.Context) {id := c.Param("id")models.Rdb.Del(ctx, id)c.JSON(http.StatusOK, gin.H{"message": "Task deleted successfully"})
}

代码解释

创建任务: 从请求中绑定任务数据后,在 Redis 中以键值对的形式存储。
获取所有任务: 遍历 Redis 中的所有键,获取并返回所有任务。
删除任务: 根据任务 ID 在 Redis 中删除相应的记录。

定义任务模型

models 目录下创建 task.go 文件来定义任务的数据模型:

package modelsimport ("github.com/go-redis/redis/v8"
)type Task struct {ID    int    `json:"id"`Title string `json:"title" binding:"required"`
}var Rdb *redis.Clientfunc SetRedisClient(client *redis.Client) {Rdb = client
}func GenerateID() int {return int(Rdb.Incr(ctx, "task_id_counter").Val())
}

代码解释

Task 结构体:定义了任务的基本信息,包括 ID 和标题。
ID 生成: 使用 Redis 的自增功能自动为每个任务生成唯一 ID。

使用 Postman 进行测试

1. 创建任务 (POST /tasks)

步骤:

1.打开 Postman,创建一个新的请求。
2.设置请求方法为 POST,请求 URL 为 http://localhost:8080/tasks
3.在请求的 Body 部分,选择 rawJSON 格式。
4.输入任务数据,例如:

{"title": "Buy groceries"
}

点击 Send

期望响应:
服务器返回 200 OK,并带有任务创建成功的消息和新任务的 ID:

{"message": "Task created successfully","id": 1
}

2. 获取任务列表 (GET /tasks)

步骤

1.在 Postman 中创建一个新的请求。
2.设置请求方法为 GET,请求 URL 为 http://localhost:8080/tasks
3.点击 Send

期望响应

服务器返回 200 OK,并返回所有任务的列表:

[{"id": 1,"title": "Buy groceries"}// 可以有更多任务
]

3. 删除任务 (DELETE /tasks/:id)

步骤:
1.在 Postman 中创建一个新的请求。
2.设置请求方法为 DELETE,将请求 URL 设置为 http://localhost:8080/tasks/1,其中 1 替换为您想要删除的任务的 ID。
3.点击 Send.

期望响应:
服务器返回 200 OK,并带有任务删除成功的消息:

{"message": "Task deleted successfully"
}

其他注意事项

数据格式:确保在发送请求时,Body 的 JSON 格式数据正确,避免请求因格式问题而失败。
错误处理:测试用例应包括错误处理,例如尝试获取或删除不存在的任务以查看系统的错误响应。
Redis 可视化工具:可以使用 Redis 可视化工具(如 RedisInsight)查看任务在 Redis 中的存储情况。

通过这些步骤,您可以用 Postman 充分验证任务管理系统的功能,并确保系统正确地处理数据。您还可以进一步扩展功能,例如添加更新任务的能力或用户身份验证机制,加强系统的实用性。


http://www.ppmy.cn/server/127773.html

相关文章

Apache POI 2024/10/2

导入Apache POI的maven坐标 通过POI向Excel文件写入文件内容 package com.sky.test;import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook;import java.io.File; import java.…

Qt day1登录界面设计

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this);this->setWindowIcon(QIcon("D:/icon_图标/icon_6j5ninlne8f/xiaoxi.png"));this->setWindowT…

如何使用ssm实现基于SSM的宠物服务平台的设计与实现+vue

TOC ssm779基于SSM的宠物服务平台的设计与实现vue 绪论 1.1 研究背景 当前社会各行业领域竞争压力非常大,随着当前时代的信息化,科学化发展,让社会各行业领域都争相使用新的信息技术,对行业内的各种相关数据进行科学化&#x…

鸿蒙开发(NEXT/API 12)【硬件(传感器开发)】传感器服务

使用场景 Sensor Service Kit(传感器服务)使应用程序能够从传感器获取原始数据,并提供振感控制能力。 Sensor(传感器)模块是应用访问底层硬件传感器的一种设备抽象概念。开发者可根据传感器提供的相关接口订阅传感器…

[Redis][集群][下]详细讲解

目录 1.集群搭建(基于 Docker)2.主节点宕机1.宕机后会发生什么?2.处理流程1.故障判定2.故障迁移 3.集群扩容0.前言1.把新的主节点加入到集群2.重新分配slots3.给新的主节点添加从节点 1.集群搭建(基于 Docker) 拓扑结构如下: 创建目录和配置&#xff1…

基于python+flask+mysql的音频信息隐藏系统

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…

前缀和(6)_和可被k整除的子数组_蓝桥杯

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 前缀和(6)_和可被k整除的子数组 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌 目录 …

WPF入门教学二十二 多线程与异步编程

在WPF(Windows Presentation Foundation)中,多线程和异步编程是非常重要的概念,因为它们可以帮助你创建响应性更好的应用程序。WPF的UI线程负责处理所有的用户界面操作,如果你的代码在UI线程上执行耗时操作&#xff0c…