node.js 之 Redis

本文介绍了如何使用Node.js操作Redis数据库,包括基本的数据操作、事务处理及发布订阅功能。通过具体的代码示例,展示了如何设置和获取数据、执行事务操作以及实现消息的订阅与发布。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值