基于nodejs的web服务器,连接使用redis

151 阅读4分钟

前言

Redis(Remote Dictionary Server)是一个开源的内存数据库,它提供了键值对的存储和操作功能。它主要用于缓存、会话管理、消息队列、发布/订阅等场景。Redis的特点包括高性能、支持多种数据结构(如字符串、哈希、列表、集合、有序集合等)、持久化、集群支持等。

相关文章

基于nodejs使用express 创建web服务器
基于nodejs的web服务器,连接使用数据库
基于nodejs的web服务器,实现用户登陆注册等接口功能

Github代码仓库地址

一、安装redis服务

1、下载安装redis

1、下载redis包 redis官方没有支持Windows的包,我们可以在以下Github上下载Windows包,注意直接下载.zip包就好 GitHub地址:github.com/tporadowski… image.png 2、安装redis 下载完成后将压缩包解压到你电脑中软件安装的目录即可,注意:路径上的文件夹名尽量不要带空格,不然可能会有异常。 我的解压地址:D:\Redis-x64-5.0.14.1,直接放在了D盘下面 解压后进入文件夹可以看到以下文件,此时已经安装成功 image.png 3、启动redis服务 在当前文件夹中直接双击上图中的redis-server.exe即可启动redis服务,启动后出现下面终端即为启动成功,启动成功后不可关闭该终端,关闭后则无法连接。为了避免每次到redis文件目录中找到redis-server.exe去启动服务,我们可以创建一个redis-server.exe的快捷方式,放在桌面,即可快速启动。 image.png

2、下载安装redis可视化软件

当我们启动redis服务之后实际上已经可以在nodejs中连接redis并使用了,为了方便观察数据的变化,我们再安装一个可视化工具辅助开发。我目前使用的是Another redis Desktop Manager,免费软件并且支持中文挺好用。下载.exe可执行文件,无脑安装即可。 GitHub地址:github.com/qishibo/Ano… image.png 安装完成后,双击打开,点击新建连接(New Connection)如果你没改变redis服务的运行端口(6379),什么都不需要动,点击确定即可。

二、项目中安装使用redis

1、安装redis包

我没有指定版本,直接默认安装最新版本

npm i redis

2、连接redis服务器

在项目中我们单独创建一个文件redis.js,进行模块化处理

// 导入redis
const redis = require('redis')
// 创建redisClient对象
const redisClient = redis.createClient()
// 连接redis
redisClient.connect()

// Redis 客户端监听连接事件
redisClient.on('connect', () => {
    console.log('Connected to Redis server')
})

// Redis 客户端监听错误事件
redisClient.on('error', (error) => {
    console.error('Redis error:', error)
})

3、常用方法介绍

1、redisClient.set(key,value) 设置值
2、redisClient.expire(key,timeout) 设置过期时间
3、redisClient.get(key) 获取值
4、redisClient.ttl(key) 获取过期时间
5、redisClient.del(key) 删除值
6、redisClient.select(index) 设置使用数据库(注意:redis默认有16个数据库,索引值0-15,默认使用DB0,我们可以调用该方法切换数据库,一旦切换之后,后续全都使用切换后的数据库,若需要再使用默认数据库,需要调用redisClient.select(0)重新设置)

4、使用promise封装常用方法

1、redisClient.set(key,value) 设置值

const redisSet = (key, value) => {
    return new Promise((resolve, reject) => {
        if (key === undefined || !key) {
            reject("key不能为空或undefined")
            return
        } else if (typeof key !== 'string') {
            reject("key必须为字符串")
            return
        } else if (value === undefined || !value || typeof value === 'boolean') {
            reject("value不能为空、undefined或布尔值")
            return
        } else if (typeof value === "object") {
            value = JSON.stringify(value)
        }
        try {
            redisClient.set(key, value).then((replay) => {
                if (replay === 'OK') {
                    resolve(true)
                } else {
                    resolve(false)
                }
            }).catch((error) => {
                reject(error)
            })
        } catch (error) {
            reject(error)
        }
    })
}

2、redisClient.expire(key,timeout) 设置过期时间

// 设置过期时间
const redisSetTimeout = (key, timeout) => {
    return new Promise((resolve, reject) => {
        if (key === undefined || !key) {
            reject("key不能为空或undefined")
            return
        } else if (typeof key !== 'string') {
            reject("key必须为字符串")
            return
        } else if (key === undefined || !key) {
            reject("timeout不能为空、undefined或0")
            return
        } else if (typeof timeout !== 'number' || timeout <= 0) {
            reject("timeout必须为大于零的数字")
            return
        }
        try {
            redisClient.expire(key, Math.ceil(timeout)).then((replay) => {
                resolve(replay)
            }).catch((error) => {
                reject(error)
            })
        } catch (error) {
            reject(error)
        }
    })
}

3、redisClient.get(key) 获取值

// 获取值
const redisGet = (key) => {
    return new Promise((resolve, reject) => {
        if (key === undefined || !key) {
            reject("key不能为空或undefined")
            return
        } else if (typeof key !== 'string') {
            reject("key必须为字符串")
            return
        }
        try {
            redisClient.get(key).then((value) => {
                // 利用 JSON.parse(string) 报错返回正确的数据格式
                try {
                    resolve(JSON.parse(value))
                } catch (error) {
                    resolve(value)
                }
            }).catch((error) => {
                reject(error)
            })
        } catch (error) {
            reject(error)
        }
    })
}

4、redisClient.ttl(key) 获取过期时间

// 获取过期时间
const redisGetTimeout = (key) => {
    return new Promise((resolve, reject) => {
        if (key === undefined || !key) {
            reject("key不能为空或undefined")
            return
        } else if (typeof key !== 'string') {
            reject("key必须为字符串")
            return
        }
        try {
            redisClient.ttl(key).then((timeout) => {
                resolve(timeout)
            }).catch((error) => {
                reject(error)
            })
        } catch (error) {
            reject(error)
        }
    })
}

5、redisClient.del(key) 删除值

// 删除值
const redisDelete = (key) => {
    return new Promise((resolve, reject) => {
        if (key === undefined || !key) {
            reject("key不能为空或undefined")
            return
        } else if (typeof key !== 'string') {
            reject("key必须为字符串")
            return
        }
        try {
            redisClient.del(key).then((replay) => {
                if (replay) {
                    resolve(true)
                } else {
                    resolve(false)
                }
            }).catch((error) => {
                reject(error)
            })
        } catch (error) {
            reject(error)
        }
    })
}

6、redisClient.select(index) 设置当前数据库

// 设置指定数据库,传入索引值,0-15
const redisSetDb = (index) => {
    return new Promise((resolve, reject) => {
        if (index < 0 || index > 15) {
            reject("请输入正确数据库索引值0-15")
            return
        }
        try {
            redisClient.select(index).then((replay) => {
                resolve(true)
            }).catch((error) => {
                reject(error)
            })
        } catch (error) {
            reject(error)
        }
    })
}

7、redisClient.select(0) 恢复默认数据库

// 恢复默认数据库
const redisResetDb = () => {
    return new Promise((resolve, reject) => {
        try {
            redisClient.select(0).then((replay) => {
                resolve(true)
            }).catch((error) => {
                reject(error)
            })
        } catch (error) {
            reject(error)
        }
    })
}

8、统一导出所有方法

module.exports = {
    redisSet,
    redisSetTimeout,
    redisGet,
    redisGetTimeout,
    redisDelete,
    redisSetDb,
    redisResetDb
}