基于nodejs的redis操作
驱动基于node-redis包,地址:https://github.com/NodeRedis/node-redis
安装:
npm install redis --save这玩意儿用起来,因为是在一个回调函数中,无法直接返回数据,所以稍微封装一下,命名:redis.js
const redis = require('redis')
class Redis {
/**
* 单列
*/
static getInstance() {
if (!Redis.instance) {
Redis.instance = new Redis();
}
return Redis.instance;
}
/**
* 构造函数,链接redis
*/
constructor(){
let options = {
host:'127.0.0.1',
port:'6379',
//connect_timeout:'1000', //毫秒
//db:'',
//password:''
}
//其他根据配置加载,用if判断,比如超时时间,db,密码等等
//options.password = ''
this.redisClient = redis.createClient(options)
//连接失败回调
this.redisClient.on("error", function(error) {
console.log(error)
})
}
/**
* 设置,如果key 相同,覆盖,成功返回true
* return bool
* @param {*} key
* @param {*} val
* @param {*} expire 过期时间 秒
*/
set(key, val, expire = '') {
let res
return new Promise((resolve, reject) => {
res = this.redisClient.set(key,val,function(err,result){
if (err) {
reject('redis_error')
return
}
if( expire == '' ){
resolve(res)
}
})
if(expire !='' ){ //设置过期时间
res = this.redisClient.expire(key,expire,function(err,result){
if (err) {
reject('redis_error')
return
}
resolve(res)
})
}
})
}
/**
* 设置过期时间,单位秒,1 设置成功 ; 0 设置无效
* @param {*} key
* @param {*} expire
*/
expire(key,expire) {
let res
return new Promise((resolve, reject) => {
res = this.redisClient.expire(key,expire,function(err,result){
if (err) {
reject('redis_error')
return
}
resolve(result)
})
})
}
/**
* 设置某个点的过期时间戳,1 设置成功 ; 0 设置无效
* @param {*} key
* @param {*} expire 时间戳
*/
expireat(key,expire) {
let res
return new Promise((resolve, reject) => {
res = this.redisClient.expireat(key,expire,function(err,result){
if (err) {
reject('redis_error')
return
}
resolve(result)
})
})
}
/**
* 获取某个key,key不存在 返回 null
* @param {*} key
*/
get(key) {
return new Promise((resolve, reject) => {
this.redisClient.get(key, (err, result) => {
if (err) {
reject('redis_error')
return
}
resolve(result)
})
})
}
/**
* 判断key是否存在,1:存在 ; 0:不存在
* @param {*} key
*/
exists(key) {
return new Promise((resolve, reject) => {
this.redisClient.exists(key, (err, result) => {
if (err) {
reject('redis_error')
return
}
resolve(result)
})
})
}
/**
* 删除 key,成功返回 1,否则返回 0
* @param {*} key
*/
del(key) {
return new Promise((resolve, reject) => {
this.redisClient.del(key, (err, result) => {
if (err) {
reject('redis_error')
return
}
resolve(result)
})
})
}
/**
* 查询 key 生命周期,不存在的key或已过期的key/不过期的key,都返回-1 ,否则返回秒数
* @param {*} key
*/
ttl(key) {
return new Promise((resolve, reject) => {
this.redisClient.ttl(key, (err, result) => {
if (err) {
reject('redis_error')
return
}
resolve(result)
})
})
}
/**
* key的值做加加操作,递增,并返回新值,如果key不存在,设置key 同时赋予1
* @param {*} key
*/
incr(key) {
return new Promise((resolve, reject) => {
this.redisClient.incr(key, (err, result) => {
if (err) {
reject('redis_error')
return
}
resolve(result)
})
})
}
/**
* 判断 key类型,不存在,返回 none
* @param {*} key
*/
type(key) {
return new Promise((resolve, reject) => {
this.redisClient.type(key, (err, result) => {
if (err) {
reject('redis_error')
return
}
resolve(result)
})
})
}
}
module.exports = Redis.getInstance();
用法:const redis = require('redis'); //把我们封装的class搞进来
await redis.set('test', 'hello redis',5) //设置key test,varlue:hello redis 过期时间5秒
data = await redis.get('test'); //获取test,返回汗血宝马
ctx.body = data这里用class封装,只有用到的时候才实例化、连接redis,如果用其他方式封装,一定要注意这点,require的时候不能连接redis,用到才连接。命令不够可以扩展,更多命令参考redis!