用 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 充分验证任务管理系统的功能,并确保系统正确地处理数据。您还可以进一步扩展功能,例如添加更新任务的能力或用户身份验证机制,加强系统的实用性。

相关推荐
2301_32241428041 小时前
基于SpringBoot+Vue的休闲零食超市管理系统的设计与实现59004-计算机毕设 原创(免费领源码+部署教程+开发环境)
java·vue.js·spring boot·redis·mysql·决策树·推荐算法
懂点Tech3 小时前
ctfshow MISC入门图片篇(信息附加):misc41解题思路
开发语言·python
catchadmin4 小时前
PHP 8.7 协程新提案 让跨协程代码共享请求身份
开发语言·php
念何架构之路4 小时前
go-grpc设计思想
开发语言·后端·golang
Web极客码4 小时前
我用 Claude 分析 Redis 哨兵日志,实现跨机房数据不一致自动对齐
数据库·redis·php
酷炫码神5 小时前
Day 10|Pinia 状态管理:把散落在各组件的数据,收进一个全局仓库
android·开发语言·javascript
microrain5 小时前
SagooIoT 的缓存换后端只改一行配置,文件后端连 Redis 都不需要
物联网·缓存·golang·sagooiot
Elastic 中国社区官方博客5 小时前
我们如何通过 70 多个拉取请求,将 OpenTelemetry Java agent 迁移到 invokedynamic
java·大数据·开发语言·elasticsearch·搜索引擎·全文检索·es
tyn1886 小时前
记录本地安装nacos服务的方法及异常
java·开发语言
步行cgn6 小时前
Spring MVC 视图机制的核心接口与类
java·开发语言·后端·spring·mvc