Js全棧開發之NoSQL數據庫使用(MongoDB和Redis)

NoSQL數據庫使用

接着上一篇《Js全棧開發之Sequelize用法詳解(MySQL)》來繼續學習koa2,上一篇總結了MySQL等關係型數據庫的使用和ORM框架Sequelize的用法,本篇將彙總NoSQL類數據庫的用法,如MongoDB和Redis等,總結一些平時比較常用的api及語法。

1. MongoDB使用

1.1 mongoose庫安裝

npm install mongoose -save

1.2 數據庫連接

// 連接數據庫
const mongoose = require('mongoose');
mongoose.connect('mongodb://xxx.xxx.xxx.xxx:27017/admin',{
    user:'root',
    pass:'xxxxxx',
    poolSize: 10,
    useNewUrlParser: true,
    useUnifiedTopology: true 
});
const mongodbConn = mongoose.connection;
mongodbConn.on('error', err => {
    console.error(err);
});
mongodbConn.once('open', ()=> {
    console.log('連接成功!')
})

1.3 聲明創建保存model對象

const mongodbConn = mongoose.connection;
// 聲明和創建model對象
const cateqorySchema = new mongoose.Schema({
    name:{
        type:String,
        index:true,
        unique:true
    },
    description: String,
    createArt:{
        type:Date,
        default: Date.now
    }
});
const Category = mongodbConn.model('Category',cateqorySchema);
// 插入對象方法1
const categoryObj = new Category({
    name:'編程',
    description:'編程開發技術類'
});
categoryObj.save(err =>{
    if(err){
        console.error(err)
        return;
    }
    else{
        console.log('save success!');
    }
});
// 插入對象方法2
Category.create({
    name:'攝影',
    description:'攝影戶外類'
},(err, category)=>{
    if(err){
        console.error(err);
    }else{
        console.log(category);
    }
})

1.4 查詢修改刪除對象數據

// 查找對象
 Category.find({
    name: '編程'
},(err,res)=>{
    if(err){
        console.log(err)
    }else{
        console.log(res);
    }
    mongodbConn.close();
});
// 更新對象
Category.update({
    name: '編程'
},{
    description:'技術開發'
}).then((err,res)=>{
    if(err){
        console.log(err)
    }else{
        console.log(res);
    }
    mongodbConn.close();
});
// 刪除對象
Category.update({
    name: '編程'
}).then((err,res)=>{
    if(err){
        console.log(err)
    }else{
        console.log(res);
    }
    mongodbConn.close();
});

2. mongoose 官方文檔

3. Redis使用

3.1 安裝Redis庫

npm install redis -save

3.2 連接Redis

const redis = require('redis');
const redisLink = 'redis://xxx.xxx.xxx:6379'
const opts = {
	auth_pass: 'xxxxxx',
}
const redisClient = redis.createClient(redisLink, opts)
redisClient
.on('error', err => console.log('------ Redis connection failed ------' + err))
.on('connect', () => console.log('------ Redis connection succeed ------'))

3.3 使用Redis


// 儲存字符串
redisClient.set('name','dahlin',redis.print)
redisClient.get('name', function(err,value){
    if(err) throw err;
    console.log('name:'+value);
});
// 用哈希存儲數據
redisClient.hmset('dahlin',{
    'item':'koa2learn',
    'chapter':'use redis'
});
redisClient.hgetall('dahlin', function(err,obj){
    console.log(obj)
});
redisClient.hkeys("dahlin",function(err,replies){
    replies.forEach(function(reply,i){
        console.log(i+"->"+reply);
    })
});
// 用列表存取數據
redisClient.lpush('mylist','koa1',redis.print);
redisClient.lpush('mylist','koa2',redis.print);
redisClient.lrange('mylist',0,-1,function(err,items){
    if(err){
        console.log(err);
    }else{
        items.forEach(function(item,i){
            console.log(i+":"+item);
        })
    }
});
// 用集合存取數據
redisClient.sadd('myset','koa1',redis.print);
redisClient.sadd('myset','koa2',redis.print);
redisClient.smembers('myset',function(err,items){
    if(err){
        console.log(err);
    }else{
        console.log(items);
    }
});

3.4 使用同步方式

//封裝redis  util/redis.js
const redis = require("redis");
const { promisify } = require('util');
//Redis 命令參考  http://doc.redisfans.com/index.html  

/**
 * 
 * @param {*} db  需要切換的DB,不傳則默認DB 0
 */
function Client(num){
    let db = num || 0
    let client = redis.createClient({db});

    //需要使用同步函數,按照如下定義即可
    this.exists =  promisify(client.exists).bind(client);
    this.keys =  promisify(client.keys).bind(client);

    this.set = promisify(client.set).bind(client);
    this.get = promisify(client.get).bind(client);
    this.del = promisify(client.del).bind(client);
    this.incr = promisify(client.incr).bind(client);
    this.decr = promisify(client.decr).bind(client);

    this.lpush = promisify(client.lpush).bind(client);

    this.hexists =  promisify(client.hexists).bind(client);
    this.hgetall = promisify(client.hgetall).bind(client);
    this.hset = promisify(client.hset).bind(client);
    this.hmset = promisify(client.hmset).bind(client);
    this.hget = promisify(client.hget).bind(client);
    this.hincrby = promisify(client.hincrby).bind(client);
    this.hdel = promisify(client.hdel).bind(client);
    this.hvals = promisify(client.hvals).bind(client);
    this.hscan = promisify(client.hscan).bind(client);

    this.sadd = promisify(client.sadd).bind(client);
    this.smembers = promisify(client.smembers).bind(client);
    this.scard = promisify(client.scard).bind(client);
    this.srem = promisify(client.srem).bind(client);
    return this;
}
module.exports = Client

// 同步方式使用
const Client = require('../util/redis')
let client = new Client(3); //gateway在REDIS中的默認DB 爲0
let old = await client.exists(ip);//先查詢
if (!old) {
    await client.set(ip, value);
}

4. Redis參考博文

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章