您的位置:首页 > 数据库 > Redis

node.js 之 Redis

2016-07-21 00:40 423 查看

redis数据库

1、 Redis是一个key-value类型的内存数据库,而key全部都是 字符串 、哈希表(map)、列表(list)、集合(set)、有序集。

2、 Redis是通过MULTI/DISCARD/EXEC/WATCH这4个命令来实现事务功能。事务提供了一种“将多个命令打包,然后一次性、按顺序执行”的机制,在事务完成之前,客户端的其他命令都是阻塞状态。

node 使用redis

安装redis 的客户端

npm install redis


var redis = require(redis),
client = redis.createClient(port, host, opt);
//opt 是选项的按钮 为了安全可以设置密码
//默认连接的是第一个数据库, 如果你想连接第三个服务器 实例:
// client.select(3, function() { /* ... */ });

client.on(error, function (err) {
console.log(err.message);
});
clinet.on(ready, function(err){
console.log("ready");
});
//client.on 是用来用来监听事件的, 当与redis服务器连接成功后会
//触发这个事件,此时表示已经准备好接收命令,当这个事件触发之
//前client命令会存在队列中,当一切准备就绪后按顺序调用


如上这些接口都是异步的

每个Redis命令暴露在客户对象的功能。所有的功能以一个args数组加上可选的回调函数或变量数的各个参数后跟一个可选的回调。

//单值的设置和获取
client.set(string key, string val, redis.print);
client.get(string key, string val , redis.print);

//多值的设置和获取
client.hset(hash key, hashtest 1, some value, redis.print);
client.hset([hash key, hashtest 2, some other value], redis.print);
client.hkeys(hash key, function (err, replies) {
console.log(replies.length +  replies:);
replies.forEach(function (reply, i) {
console.log(     + i + :  + reply);
});
client.quit();
});


client.hmset("hosts", "mjr", "1", "another", "23", "home", "1234");
client.hgetall("hosts", function (err, obj) {
console.dir(obj);
});

Output:
{ mjr: '1', another: '23', home: '1234' }


其中有些回调函数是可选的, 其实有时候 统一, 就都写上吧, 也不费劲~~

订阅和发布功能

这个程序打开两个客户端连接,支持其中的一个频道,并公布在其他渠道

var redis = require("redis");
var sub = redis.createClient()
, pub = redis.createClient();
var msg_count = 0;

sub.on("subscribe", function (channel, count) {
pub.publish("a nice channel", "I am sending a message.");
pub.publish("a nice channel", "I am sending a second message.");
pub.publish("a nice channel", "I am sending my last message.");
});

sub.on("message", function (channel, message) {
console.log("sub channel " + channel + ": " + message);
msg_count += 1;
if (msg_count === 3) {
sub.unsubscribe();
sub.quit();
pub.quit();
}
});

sub.subscribe("a nice channel");


订阅的 事件

事务

MULTI命令排队等待直到EXEC 发出,然后所有的命令都是原子运行的redis。在node_redis接口是通过调用客户端返回一个单独的多目标。对于multi()如果任何命令不能队列,所有的命令都回滚,没有一个将被执行

var redis  = require("./index"),
client = redis.createClient(), set_size = 20;

client.sadd("bigset", "a member");
client.sadd("bigset", "another member");

while (set_size > 0) {
client.sadd("bigset", "member " + set_size);
set_size -= 1;
}

// multi chain with an individual callback
client.multi()
.scard("bigset")
.smembers("bigset")
.keys("*", function (err, replies) {
// NOTE: code in this callback is NOT atomic
// this only happens after the the .exec call finishes.
client.mget(replies, redis.print);
})
.dbsize()
.exec(function (err, replies) {
console.log("MULTI got " + replies.length + " replies");
replies.forEach(function (reply, index) {
console.log("Reply " + index + ": " + reply.toString());
});
});


除了将命令单独添加到多个队列之外,还可以将一个命令和参数数组传递给构造函数

var redis  = require("redis"),
client = redis.createClient(), multi;

client.multi([
["mget", "multifoo", "multibar", redis.print],
["incr", "multifoo"],
["incr", "multibar"]
]).exec(function (err, replies) {
console.log(replies);
});


拆分命令队列, 直到multi.exec 被调用。

var redis  = require("redis"),
client = redis.createClient(), multi;

// start a separate multi command queue
multi = client.multi();
multi.incr("incr thing", redis.print);
multi.incr("incr other thing", redis.print);

// runs immediately
client.mset("incr thing", 100, "incr other thing", 1, redis.print);

// drains multi queue and runs atomically
multi.exec(function (err, replies) {
console.log(replies); // 101, 2
});


Multi-word commands

client.script('load', 'return 1');
client.multi().script('load', 'return 1').exec(...);
client.multi([['script', 'load', 'return 1']]).exec(...);


redis 这个博客写的不错 :

http://github.thinkingbar.com/redisbook_chapter01/

推荐本书

《redis设计与实现》

参考:

https://github.com/NodeRedis/node_redis
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息