道者编程


基于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!


最新评论:
我要评论:

看不清楚


道知

about me

身体是革命的本钱,健身,养生,运动,公众号都有!

链接