Node.js中使用redis資料庫的正確姿勢

來源:互聯網
上載者:User

標籤:

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.conf29322: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.629322: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就寫這麼多吧,其實還有發布-訂閱等的用法,這裡就不說了。

Node.js中使用redis資料庫的正確姿勢

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.