nodejs操作redis總結

本文總結常見的使用node操作redis服務,redis的key是唯一的,如果一個key所對應的存儲類型是string,則不能再次覆蓋式設置key爲hash;

1. 啓動redis

  1. 這裏我們使用docker方式搭建redis服務器

     docker run -d --name redis -p 6379:6379 redis:2.8

2. 初始化

  1. node操作redis需要引入redis包;

     const redis = require('redis');
     const client = redis.createClient( 6379, '127.0.0.1');
     const util = require('util');

3. string(字符串)

  1. 一個字符串類型的值最大長度爲512 M。
  2. 常見操作: get,set,mget,mset,incr(計數器++),decr(--)等等;

     client.set('hello', 5, function(err, obj) {
         client.incr('hello', function(err,data) {
             client.get('hello', function(err,data) {
                 console.log(data);         // 6
             })
         })
     })

4. hash(哈希)

  1. hash可用來存儲對象,一個Redis 列表中最多可存儲232-1(40億)個元素

     var obj = {
         name:'sss',
         age:223
     }
     client.hset("test", obj, function(err, obj) {
         client.hgetall('test', (err, obj) => {
             console.log(`hgetall:${JSON.stringify(obj)}`);
             console.log(obj.age);
         })
         client.hget('test','name', function(err, name) {
             console.log('hget test name');
             console.log(name);
         })
     });

5. lists(列表)

  1. 對於lists,使用send_command進行操作;
  2. 隊列操作
  3. list,常用操作, list,常用操作, lpush(首位添加),rpush(末位添加),lset(修改首位值),lindex(刪除首位元素),lpop(刪除末位元素)
  4. 一個Redis 列表中最多可存儲232-1(40億)個元素

         client.send_command('lset',['mylist',0,1], function(err,data) {
             console.log(data);          // OK
         })
         client.send_command('lpush',['mylist', 'one'], function(err, data) {
             console.log(dada);          //OK 
         })
    
         // 使用命令行獲取對應的索引下的結果
         // lindex mylist 0    'one'
         // lindex mylist 1   '1'
         // lindex mylist 2   'xxx'
         // lindex mylist 3   'xxx'

6. sets(集合)

  1. sets 集合處理; 業務中用lodash進行交併補也是一個不錯的選擇。
  2. 常見操作: sadd、smembers、sinter(交)、sunion(並)、sdiff(補)、smove
  3. 集合中不允許重複成員的存在。當多次添加一個元素時,其結果會設置單個成員多次。一個Redis 集合中最多可包含232-1(40億)個元素。

     let db1 = ['mysql','redis'];
     let db2 = ['mongo','redis'];
     client.sadd('db1',db1, function(err,data) {
         client.smembers('db1', function(err,data) {
             console.log(toString.call(data));               // [object Array]
             console.log('smemers:' + data);                 // 獲取set中的成員, ['redis,mysql]  
         })
         client.sadd('db2', db2, function(err, data) {
             client.sinter('db1','db2', function(err,data) {
                 console.log('sinter:' + data)                    //交集: sinter:redis
             });
             client.sunion('db1','db2', function(err,data) {
                 console.log('sunion:' + data)                    // 並集: sunion:mongo,mysql,redis
             });
             client.sdiff('db1','db2', function(err,data) {
                 console.log('SDIFF:' + data)                     // 補集: SDIFF:mysql
             })
         })
     });

7. 有序集合(SortedSets)

  1. 常用操作: zadd(設置元素), zrange(獲取範圍內的元素),zrank(獲取指定元素的排名,從0開始), zscore(獲取指定元素的score,用戶指定的score)

     client.zadd(['zdb',0,'mysql', 1,'mongo',2,'redis'], function(err, data) {
         console.log(data);           // 3
     })

8. 事務

  1. 事務(multi命令): 批量執行所有的命令,並統一返回結果

     client.multi()
         .set('xiao','xing')
         .get('xiao')
         .exec(function(err,replies) {
             console.log(replies);         // [ 'OK', 'xing' ]
         })

9. 訂閱發佈模式

  1. redis的訂閱發佈模式可用來做類似kafka的消息推送;
  2. 使用list + redis的訂閱發佈模式可以構建一個不錯的消息隊列;

     let sub = redis.createClient(6379, '127.0.0.1');   // 監聽消費者
     let pub = redis.createClient(6379, '127.0.0.1');   // 生產者
    
     // 在sub開始監聽時允許觸發subscribe事件進行操作,類似連接數據庫的connect事件
     sub.on('subscribe', function(channel, count) {
         console.log(`${channel}:${count}`);               //  test channel:1
         pub.publish('test channel', 'channel message test')
     })
     sub.on('message', function(channel, message) {
         console.log(`${channel}-message:${JSON.stringify(message)}`)    // test channel-message:"channel message test"
     })
     sub.subscribe('test channel');

10. 對整個redis的所有客戶端操作進行監聽;

  1. monitor事件可以監聽到redis收到的所有客戶端命令

     client.monitor(function(err, res) {
         console.log(res);   // ok
     })
     client.on("monitor", function (time, args) {
         console.log(time + ": " + util.inspect(args));             // 1556285641.395573: [ 'lindex', 'myset', '2' ]
     });
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章