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

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

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

介绍

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

项目初始化

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

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

go 复制代码
mkdir task-manager
cd task-manager
go mod init task-manager

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

安装依赖项

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

go 复制代码
go get -u github.com/gin-gonic/gin
go get -u github.com/go-redis/redis/v8

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

配置 Redis 连接

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

go 复制代码
package main

import (
    "task-manager/controllers"
    "github.com/gin-gonic/gin"
    "github.com/go-redis/redis/v8"
)

var rdb *redis.Client

func 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 文件:

go 复制代码
package controllers

import (
    "context"
    "net/http"
    "task-manager/models"
    "github.com/gin-gonic/gin"
    "strconv"
)

var ctx = context.Background()

func CreateTask(c *gin.Context) {
    var task models.Task
    if 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.Task
    for _, 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 文件来定义任务的数据模型:

go 复制代码
package models

import (
    "github.com/go-redis/redis/v8"
)

type Task struct {
    ID    int    `json:"id"`
    Title string `json:"title" binding:"required"`
}

var Rdb *redis.Client

func 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 部分,选择 raw 和 JSON 格式。

4.输入任务数据,例如:

go 复制代码
{
  "title": "Buy groceries"
}

点击 Send。

期望响应:

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

go 复制代码
{
  "message": "Task created successfully",
  "id": 1
}

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

步骤

1.在 Postman 中创建一个新的请求。

2.设置请求方法为 GET,请求 URL 为 http://localhost:8080/tasks。

3.点击 Send。

期望响应

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

go 复制代码
[
  {
    "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,并带有任务删除成功的消息:

go 复制代码
{
  "message": "Task deleted successfully"
}

其他注意事项

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

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

相关推荐
Re.不晚16 分钟前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
老秦包你会18 分钟前
Qt第三课 ----------容器类控件
开发语言·qt
凤枭香21 分钟前
Python OpenCV 傅里叶变换
开发语言·图像处理·python·opencv
ULTRA??25 分钟前
C加加中的结构化绑定(解包,折叠展开)
开发语言·c++
王佑辉29 分钟前
【redis】redis缓存和数据库保证一致性的方案
redis·面试
远望清一色41 分钟前
基于MATLAB的实现垃圾分类Matlab源码
开发语言·matlab
confiself1 小时前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言
XiaoLeisj1 小时前
【JavaEE初阶 — 多线程】Thread类的方法&线程生命周期
java·开发语言·java-ee
杜杜的man1 小时前
【go从零单排】go中的结构体struct和method
开发语言·后端·golang
幼儿园老大*1 小时前
走进 Go 语言基础语法
开发语言·后端·学习·golang·go