[转]Node.js中koa使用redis数据库
本文转自:https://blog.csdn.net/offbye/article/details/52452322
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.conf
29322: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.6
29322: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等库
`-- koa-redis@2.1.2
+-- co-redis@2.1.1
| `-- es6-promisify@4.1.0
| `-- es6-promise@3.2.1
`-- hiredis@0.5.0
+-- bindings@1.2.1
`-- nan@2.4.0
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就写这么多吧,其实还有发布-订阅等的用法,这里就不说了。
---------------------
作者:offbye
来源:CSDN
原文:https://blog.csdn.net/offbye/article/details/52452322
版权声明:本文为博主原创文章,转载请附上博文链接!
[转]Node.js中koa使用redis数据库的更多相关文章
- node.js中 koa 框架的基本使用方法
一.安装 koa npm install koa --save 二.简单使用 const koa = require('koa'); //注意使用koa需要new,跟express有点不同 let a ...
- Node.js 中监听 redis key 过期事件
It is in fact possible to listen to the “expired” type keyevent notification using a subscribed clie ...
- 在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查
Sequelize是一个基于promise的关系型数据库ORM框架,这个库完全采用JavaScript开发并且能够用在Node.JS环境中,易于使用,支持多SQL方言(dialect),.它当前支持M ...
- [转]在node.js中,使用基于ORM架构的Sequelize,操作mysql数据库之增删改查
本文转自:https://www.cnblogs.com/kongxianghai/p/5582661.html Sequelize是一个基于promise的关系型数据库ORM框架,这个库完全采用Ja ...
- node.js中对 redis 的安装和基本操作
一.win下安装redis https://github.com/MicrosoftArchive/redis/releases 下载Redis-x64-3.2.100.zip,然后解压,放到自定义目 ...
- koa 基础(十)原生node.js 在 koa 中获取表单提交的数据
1.app.js // 引入模块 const Koa = require('koa'); const router = require('koa-router')(); /*引入是实例化路由 推荐*/ ...
- 性能追击:万字长文30+图揭秘8大主流服务器程序线程模型 | Node.js,Apache,Nginx,Netty,Redis,Tomcat,MySQL,Zuul
本文为<高性能网络编程游记>的第六篇"性能追击:万字长文30+图揭秘8大主流服务器程序线程模型". 最近拍的照片比较少,不知道配什么图好,于是自己画了一个,凑合着用,让 ...
- Node.js中的Session,不要觉得简单哦。
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,博客地址为http://www.cnblogs.com/jasonnode/ .学习网站上有对应 ...
- Node.js 连接 MySQL 并进行数据库操作
Node.js 连接 MySQL 并进行数据库操作 按照这篇操作mysql的指引,我远程操作了我另一台电脑的mysql数据库. var mysql = require('mysql'); var c ...
随机推荐
- java面试一、1.1基础
免责声明: 本文内容多来自网络文章,转载为个人收藏,分享知识,如有侵权,请联系博主进行删除. 基础篇 1.1Java基础 面向对象的特征:继承.封装和多态 三大特性是:封装,继承,多态 所谓封 ...
- python yield 关键字
最近看代码看到python里面的yield关键字,和我之前接触的语言好像都没有来着,我就查了查它的含义,大概理解如下: >>> def createGenerator(): ... ...
- git了解-使用笔记
1.Git的由来与设计理念 Git是linux之父Linus Torvalds开发的,是一款最先进的项目版本控制系统. Git的由来有一个小故事,传闻起初Linux社区工作者都是通过邮件的,发送给li ...
- html快速编写
1. 嵌套操作---------- 子操作: > div>ul>li <div> <ul> <li></li> </ul> ...
- cef3:禁止win10高dpi下cef对内部网页进行缩放
1.使用命令行参数 //禁止cef进行dpi缩放 command_line->AppendSwitchWithValue("--force-device-scale-factor&qu ...
- 腾讯开源 MMKV — 基于mmap的高性能通用key-value组件
一.介绍 MMKV 是基于 mmap 内存映射的 key-value 组件,底层序列化/反序列化使用 protobuf 实现,性能高,稳定性强.从 2015 年中至今,在 iOS 微信上使用已有近 3 ...
- Python 字符串增删改查的使用
#coding=utf-8a = 'haha'a = "hao"print(a)s = 'Hello World!'print(s.swapcase()) #大写变小写,小写变大写 ...
- 用Ajax遍历三级下拉框
用Ajax遍历三级下拉框 //通过一级分类的id查二级分类(记得在前端网页按钮绑定点击事件) function getSecondCategory(oneCategoryId){ alert(&quo ...
- js数组之sort排序的用法
sort排序 转载自:https://blog.csdn.net/idomyway/article/details/80544509 js中用方法sort()为数组排序.sort()方法有一个可选参数 ...
- ASP.NET Core微服务+Tabler前端框架搭建个人博客2--系统架构
功能分析 在整个微服务架构的搭建过程中,我们需要做的第一步就是对服务进行拆分,将一个完整的系统模块化,通过对各个模块互联,共同完成一个系统的工作.既然要做到模块化,那么必须明白你的系统的需求到底是什么 ...