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

相关推荐
人道领域8 分钟前
【LeetCode刷题日记】225.用队列实现栈--三招实现栈操作(多种思维)
java·开发语言·算法·leetcode·面试
Mr_pyx9 分钟前
【告别for循环】Java Stream 流式编程精通:从入门到源码级的性能优化
java·开发语言·性能优化
:12110 分钟前
java基础--数组
java·开发语言
爱上好庆祝12 分钟前
学习js第一天(出发新世界)
开发语言·前端·javascript·css·学习·html·ecmascript
小短腿的代码世界14 分钟前
Qwt性能优化与源码级深度解析:工业级图表控件的极限性能调优
开发语言·qt·信息可视化·性能优化
lsx20240629 分钟前
jQuery UI 实例
开发语言
Agent手记35 分钟前
终端消费数据自动采集与分析智能体的搭建思路:2026全链路技术架构与实战解析
java·开发语言·人工智能·ai·架构
-凌凌漆-41 分钟前
【Qt】qt延时
开发语言·qt
空中海1 小时前
Redis 原理深度解析:持久化 × 主从复制 × Sentinel × Cluster × 性能排查全攻略
数据库·redis·sentinel
AI-小柒1 小时前
磅上线!DataEyes 聚合平台正式接入 GPT-Image-2,开启多模态 AI 生成全新纪元
大数据·开发语言·数据库·人工智能·gpt·php