Node.js中使用redis數據庫的正確姿勢

分類:IT技術 時間:2016-10-17

Redis是一個常用的Nosql數據庫,一般用來代替Memcached做緩存服務,同時它也支持數據的持久化,有著比較廣泛的應用場景。在Java中使用redis我們已經比較熟悉了,那麽在node.js和koa.js框架中使用Redis的正確姿勢是怎樣的呢?

Redis 是完全開源免費的,遵守BSD協議,是一個高性能的key-value數據庫。
Redis 與其他 key - value 緩存產品有以下三個特點:
* Redis支持數據的持久化,可以將內存中的數據保持在磁盤中,重啟的時候可以再次加載進行使用。
* Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。
* Redis支持數據的備份,即master-slave模式的數據備份。

Redis常用命令可以參考http://www.runoob.com/redis/redis-keys.html

Node.js已經有很多redis相關的庫,我在npm.org上搜了下大概有十幾個吧,其中經常使用的redis,co-redis。 由於我用koa做web框架,因此就直接用了koa-redis。這篇文章涉及koa.js,yield生成器和Promise相關的知識,需要先對這些概念有一定的認識。

下面介紹下redis和koa.js相關的操作吧,我是在Mac下操作的。

1. 安裝redis,並啟動客戶端和服務器端

brew install redis

  • 啟動服務器端

    redis-server

    29322:C 06 Sep 17:39:25.109 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
    29322:M 06 Sep 17:39:25.111 * Increased maximum number of open files to 10032 (it was originally set to 1024).
                    _._
               _.-``__ ''-._
          _.-``    `.  `_.  ''-._           Redis 3.0.6 (00000000/0) 64 bit
      .-`` .-```.  ```\/    _.,_ ''-._
     (    '      ,       .-`  | `,    )     Running in standalone mode
     |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
     |    `-._   `._    /     _.-'    |     PID: 29322
      `-._    `-._  `-./  _.-'    _.-'
     |`-._`-._    `-.__.-'    _.-'_.-'|
     |    `-._`-._        _.-'_.-'    |           http://redis.io
      `-._    `-._`-.__.-'_.-'    _.-'
     |`-._`-._    `-.__.-'    _.-'_.-'|
     |    `-._`-._        _.-'_.-'    |
      `-._    `-._`-.__.-'_.-'    _.-'
          `-._    `-.__.-'    _.-'
              `-._        _.-'
                  `-.__.-'
    
    29322:M 06 Sep 17:39:25.116 # Server started, Redis version 3.0.6
    29322:M 06 Sep 17:39:25.116 * The server is now ready to accept connections on port 6379
  • 啟動客戶端
    redis-cli

     
    127.0.0.1:6379[1]> select 0
    OK
    127.0.0.1:6379> keys *
    (empty list or set)
    127.0.0.1:6379>

2. 安裝node.js和koa.js,node的安裝這裏就不講了,通過brew install就可以。

npm install koa redis koa-redis

可以看到koa-redis已經依賴了co-redis, es6-promisify等庫

 
`-- [email protected]
+-- [email protected]
| `-- [email protected]
| `-- [email protected]
`-- [email protected]
+-- [email protected]
`-- [email protected]

3. koa.js操作redis數據

這塊是本文重點,由於官方的文檔和例子不太詳細,不熟悉node的同學折騰起來會比較累,所以本文提供了一個比較完整的例子。具體代碼裏面註釋已經寫的比較清楚了。

var session = require('koa-generic-session');
var redisStore = require('koa-redis');
var koa = require('koa');
var redis = require('redis');
// 註意: client默認是異步callback方式調用;
// store.client是經過了co-redis包裝,返回Promise, 在koa裏面用yield異步編程比較方便
var client = redis.createClient(6379, "172.19.65.240");

var app = koa();
app.keys = ['keys', 'keykeys'];
// var option={host: "172.19.65.240", db:1};
var options = {client: client, db: 1};

var store = redisStore(options);
app.use(session({
  store: store
}));

app.use(function *() {
  switch (this.path) {
    case '/get':
      get.call(this);
      break;

    case '/testKV':
      // 保存key value
      if (this.query.adminId) {
        yield store.client.set("test1", this.query.adminId);
      }
      //同步讀取key value
      this.body = yield store.client.get("test1");
      break;

    case '/testHM':
      //操作hashmap
      var result = yield store.client.hmset("hosts", "mjr", "123", "another", "23", "home", "1234");
      console.log(result);

      var obj = yield store.client.hgetall("hosts")
      console.dir(obj);
      //獲取hashmap key的值
      this.body = yield store.client.hget("hosts", "home");

      //保存hashmap,使用默認的callback方式
      // client.hset("hash key", "hashtest 1", "some value", redis.print);
      // client.hset(["hash key", "hashtest 2", "some other value"], redis.print);
      // client.hmset("hosts", "mjr", "1", "another", "23", "home", "1234");
      // client.hmset(["key", "test keys 1", "test val 1", "test keys 2", "test val 2"], function (err, res) {
      //   console.log(res);
      // });

      break;
    case '/testSet':
      //保存set
      var key = "key1";
      store.client.sadd("key1", "v1");
      store.client.sadd("key1", "v2");
      store.client.sadd("key1", "v3");

      //讀取set
      store.client.multi()
        .sismember(key, 'v1')
        .smembers(key)
        .exec(function (err, replies) {
          console.log("MULTI got " + replies.length + " replies");
          replies.forEach(function (reply, index) {
            console.log("Reply " + index + ": " + reply.toString());
          });
        });

      //讀取set
      this.body = yield store.client.smembers("key1");
      break;
    case '/testList':
      //保存list
      store.client.rpush("mylist", "bbb")
      store.client.rpush("mylist", "ccc")
      store.client.lpush("mylist", "aaa")

      this.body = yield store.client.rpop("mylist");
      break;
    case '/remove':
      remove.call(this);
      break;
    case '/regenerate':
      yield regenerate.call(this);
      break;
  }
});

function get() {
  var session = this.session;
  session.count = session.count || 0;
  session.count++;
  var test = store.client.get("test");
  console.log(test);
  this.body = session.count;
}

function remove() {
  this.session = null;
  this.body = 0;
}

function *regenerate() {
  get.call(this);
  yield this.regenerateSession();
  get.call(this);
}

app.listen(8080);

關於在koa框架中使用redis就寫這麽多吧,其實還有發布-訂閱等的用法,這裏就不說了。


Tags: specified 正確姿勢 default 服務器 number

文章來源:


ads
ads

相關文章
ads

相關文章

ad