本文總結常見的使用node操作redis服務,redis的key是唯一的,如果一個key所對應的存儲類型是string,則不能再次覆蓋式設置key為hash;
1. 啟動redis
-
這里我們使用docker方式搭建redis服務器
docker run -d --name redis -p 6379:6379 redis:2.8
2. 初始化
-
node操作redis需要引入redis包;
const redis = require('redis'); const client = redis.createClient( 6379, '127.0.0.1'); const util = require('util');
3. string(字符串)
-
一個字符串類型的值最大長度為512 M。
-
常見操作: 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(哈希)
-
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(列表)
-
對於lists,使用send_command進行操作;
-
隊列操作
-
list,常用操作, list,常用操作, lpush(首位添加),rpush(末位添加),lset(修改首位值),lindex(刪除首位元素),lpop(刪除末位元素)
-
一個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(集合)
-
sets 集合處理; 業務中用lodash進行交並補也是一個不錯的選擇。
-
常見操作: sadd、smembers、sinter(交)、sunion(並)、sdiff(補)、smove
-
集合中不允許重復成員的存在。當多次添加一個元素時,其結果會設置單個成員多次。一個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)
-
常用操作: zadd(設置元素), zrange(獲取范圍內的元素),zrank(獲取指定元素的排名,從0開始), zscore(獲取指定元素的score,用戶指定的score)
client.zadd(['zdb',0,'mysql', 1,'mongo',2,'redis'], function(err, data) { console.log(data); // 3 })
8. 事務
-
事務(multi命令): 批量執行所有的命令,並統一返回結果
client.multi() .set('xiao','xing') .get('xiao') .exec(function(err,replies) { console.log(replies); // [ 'OK', 'xing' ] })
9. 訂閱發布模式
-
redis的訂閱發布模式可用來做類似kafka的消息推送;
-
使用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的所有客戶端操作進行監聽;
-
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' ] });