Redis在Nodejs中的应用

什么是Redis?

Redis是一个开源的拿C语言编写的可持久化的日志型、Key-value的数据库,提供多种语言的API,Nodejs可以以很容易的使用。类似的还有Memcached,Redis和Memcached有一样的地方也有不一样的地方,一样的地方比如:他们都是将数据存到内存中,提高读写速度,避免直接对数据组直接进行读写操作,不一样的地方有很多:Memcached是多线程非阻塞I/O模型,Redis是单线程的I/O复用模型,对于单线程可以将速度优势发挥到最大,实现了epoll,Nodejs的V8核心其实也是epoll,这点上来说两者有着共同的东西,具体Redis和Memcached之间的区别可以移步,Redis与Memcached的区别。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作,貌似是性能最快的Key-Value DB.NodeRedis

安装Redis

下载安装

可以先去中文官网下载压缩包Redis官网,也可以用命令来下载安装,命令如下:

1
2
3
4
5
6
7
$ wget http://download.redis.io/releases/redis-3.0.6.tar.gz 
$ tar xzf redis-3.0.5.tar.gz
$ mv redis-3.0.5 redis
$ cd redis
$ make
$ make test
$ make install

配置Redis.conf

redis解压目录里有一个配置文件redis.conf ,编辑此配置文件,找到dir ./这一行,Redis会将数据写入文件中,而这里配置的就是将指定数据保存到对应路径,我本机的指定目录是:

1
$ dir /Users/{用户名}/redis_data/

编辑过后,将配置文件移动到 /usr/local/etc 目录下:

1
$ sudo mv redis.conf /usr/local/etc

启动Redis

命令行输入:

1
$ /usr/local/bin/redis-server /usr/local/etc/redis.conf

启动成功画面:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
13417:M 10 Jul 16:52:00.552 * Increased maximum number of open files to 10032 (it was originally set to 256).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.0.6 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 13417

`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'

|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'

`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'

13417:M 10 Jul 16:52:00.553 # Server started, Redis version 3.0.6
13417:M 10 Jul 16:52:00.554 * The server is now ready to accept connections on port 6379

如果你有写入操作,控制台就会出现信息,类似于:

1
2
3
4
5
6
13417:M 10 Jul 16:52:00.553 # Server started, Redis version 3.0.6
13417:M 10 Jul 16:52:00.554 * The server is now ready to accept connections on port 6379
13417:M 10 Jul 17:00:33.754 * 10 changes in 300 seconds. Saving...
13417:M 10 Jul 17:00:33.754 * Background saving started by pid 13458
13458:C 10 Jul 17:00:33.756 * DB saved on disk
13417:M 10 Jul 17:00:33.856 * Background saving terminated with success

Nodejs安装Node_Redis

安装

1
$ npm install redis --save

使用教程

Nodejs for Redis 专门有一个官方文档,查询使用方法可以移步到Nodejs版Redis使用文档.

Demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var redis = require("redis"),
option = {},
client = redis.createClient(option);
client.on("error", function (err) {
console.log("Error " + err);
});
client.set("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();
});

上面是一个简单的demo,大概意思就是新建一个Redis的client,默认的这个Nodejs的client会去连接本地127.0.0.1:6379是否有Redis服务,如果连接成功,则可以往上面配置的指定路径中写入dump.rdb文件,数据文件一般存放在内存中,只要不断开连接,随时可以进行读写,最下面的那个forEach大概意思就是把Redis中Key是”hash key”的字段全部遍历出来。

Nodejs执行之后,控制台会打出这样的结果:

1
2
3
4
5
6
Reply: OK
Reply: 0
Reply: 0
2 replies:
0: hashtest 1
1: hashtest 2

未完待续

后续可以关注Codefilled Demo,会在这里完成一个Redis的Demo,大概思路是一个可视化的界面,实现Redis的各种操作。

结语

既然Nodejs其实已经算是后端语言了,即便被后端开发多么看不上,但是Nodejs定位已经如此了,还是尽量的能做更多的事情比较好,否则只做个控制器这么薄薄一层就显得像一个玩具了,如果选用了Nodejs作为技术栈还是希望能把离前端最近的那一层给干掉比较合适,否则各大公司天天喊着要前后端分离的意义就不是特别大了。后续会陆续推出一些后端技术相关的文章,消息队列,Nodejs use kafka,RPC(node_thrift),zookeeper等..

完..

搭建Codefilled下的demo服务

引言

有时候光写文章贴代码其实是一个挺烦的事情,贴了代码上去,读者不一定愿意看,而且还比较占篇幅,一篇文章可能往下滚半天才能看完,还是需要一个存放Demo的路径比较合适,其实早都想这样弄了,刚好接着捣鼓定位Demo的契机,把demo.codefilled.com搭建起来,这样我的这台服务器上现在有三个Nodejs的服务同时在跑,一个主页的Hexo,一个聊天室m.codefilled.com,还有demo.codefilled.com.

内容

现在只放了两个Demo扔在上面,以后随着边写文章,需要配合Demo一起的展示的,都丢到demo.codefilled.com上面去。

结语

HTML5的那个🔋Demo 纯是为了玩,定位这个是腾讯这边对H5 GeoLocation做了优化改进的定位组件,比较适合移动H5开发,针对经常会在微信、手Q里面使用定位功能的场景,做了专门针对腾讯系列社交app内嵌的优化。

完…

深入浅出Nodejs脑图

引言

学习Nodejs,这本《深入浅出Nodejs》暂时看起来是市面上深入学习Nodejs中文书里面最好的一本,但是没有Nodejs的基础的拿来直接看,其实还是有些吃力的,有过一些Nodejs的基础的同学看起来还能稍微好一些,如果你能把这本书研究的很透,里面的各种网络编程、内存管理等在边学习理论的过程中能有所实践的话,你的Nodejs水平将会上升到一个新的档次,当然前提是你NPM的基础要扎实,要不在实践过程中遇到一些package管理的问题,解决起来就会很吃力,NPM的基础知识请移步这里,NPM必须掌握的基础概念.

章节

最近网上看到一篇文章,一位特别无私的哥们😄,分享了他自己看完深入浅出这本书之后,自己画的脑图,有了几张图之后,学习Nodejs就更方便多了,尤其是啃书比较费劲的同学,可以先对整个学习过程有个大致的思路,再针对知识盲点进行分别突破,对于不是很重要使用不太多的知识可以之后需要的时候再学。下面是我把那几张图引过来,做了一个汇总:

结语

有了这些图,对于Nodejs学习还是方便多了,能让你跳出一些技术细节,站在全局来看看Nodejs的技术体系,更进一步的提升Nodejs的技术水平。

完…

如何用Nodejs写一些小工具

引言

6月初最近没怎么写文章👿,不是因为偷懒,是因为端午节前去了趟上海迪士尼,回来之后新岗位事情相对较多,在公司内部搭了个MkDoc花了一些业余时间,然后欧洲杯又开幕了😄,看⚽必须是️优先的啊,所以没怎么写。不过话说上海迪士尼虽然没全部建完,不是那么大,但是真心值得一去,从早上8:00开园就进去了,一直到看完🎆才撤退,虽然累成🐶,但是真心好玩呀,大项一定记得要拿pass卡,这样才能保证整个游玩的体验😄,越写越跑题,下面赶紧进入正题😢:
网上有各种各样基于Nodejs的工具,不管还是靠谱不靠谱的,总之就是又多又乱,形形色色,五花八门,也有很多雷人的,雷人的就不说了哈😄。工作中其实还是做业务的童鞋比较多,对怎么下手写一个Nodejs的工具包还不是特别有思路,其实当你有了思路之后发现也挺容易的,下面就针对一个简单case,稍微讲一下怎样从一个很简单🌰入手。

正题

平常在工作中也有可能遇到这样的情况,比如设计师把设计稿切完给你很多图片(当然很多公司得前端自己切😄),然后图片文名起的不是很满足前端的命名规范,很多图片名字用下划线连接的,例如:”icon_star”,但是我们想把它改成”icon-star”,或者其他的命名方式,但是文件有好几十个,那么这时候手工改几十个文件起来就实在太费劲了,其实这时候用Nodejs写一个package就很容易把这个问题用技术的方法更好的解决掉,而且Nodejs的自带的fs模块对于文件的流操作有十分擅长。

npm如何发布一个package,请移步我之前写的,npm必须掌握的基础概念,这里就不过多讲解了,主要讲一下如何实现上面的那个case。

代码实现

在写这个工具前,可以异步Nodejs的官方文档,熟悉一下fs模块,链接:fs模块文档,其实可以看到里面提供了很多的API供我们使用。
实现上面的这个case其实就会用到两个主要的API就够了,一个是fs.readdir,另外一个是fs.rename,看这两个名字就大概清楚是做什么的了,一个是读取某个目录,另外一个是给文件改名字。下面是处理这个问题的核心代码:

$vim {project}/index.js
var fs = require('fs');
var src = 'file'; /* project/file 下面的需要修改名字的文件目录 */
fs.readdir(src,function(err,files) {
    console.log(files);
    files.forEach(function(filename) {
        var oldPath = src + '/' + filename;
        var newPath = src + '/' + filename.replace(/_/g,"-");
        fs.rename(oldPath,newPath,function(err) {
            if(!err) {
                console.log(filename + "替换下划线成功!");
            }
        });
    });
});
$node index.js

执行node index.js之后,就可以看见结果了。

/* 本机执行的结果,上面代码console打出来的log */
[ 'icon_font.js','npm_pkg.js','oh_mygod.js','ops_hi.js','web_font.js' ]
icon_font.js替换下划线成功!
oh_mygod.js替换下划线成功!
npm_pkg.js替换下划线成功!
ops_hi.js替换下划线成功!
web_font.js替换下划线成功!

这时候你再看file目录下面,所有”_”连接的文件名称,全部变为”-“链接。

结语

虽然这个🌰比较简单,但是主要是为了提供了一个思路给大家,如何结合自己的工作中的情况来解决重复劳动的问题。其实这个🌰就是利用Nodejs强大的处理文件的能力,提高自己的生产效率,类似这样的问题其实会有不少,怎么去在工作中发掘并解决还是需要经常去思索的.

完…

Javascript Quiz

简单的几道JavaScript Quiz

收集了几道不错JavaScript小题,能cover住一部分JavaScript比较重要的基础部分,汇总分享出来学习一下,答案在文章最后。

第一题

1
2
3
(function(){ 
return typeof arguments;
})();

考察arguments相关知识,参考

第二题

1
2
var f = function g(){ return 23; }; 
typeof g();

考察函数表达式相关知识,参考

第三题

1
2
3
4
(function(x){ 
delete x;
return x;
})(1);

考察参数是否可以被删除,参考

第四题

1
2
var y = 1, x = y = typeof x; 
x;

考察typeof相关知识

第五题

1
2
3
(function f(f){ 
return typeof f();
})(function(){ return 1; });

考察自执行函数和参数名称冲突的相关问题

第六题

1
2
3
4
5
6
7
8
var foo = {  
bar: function() { return this.baz; },
baz: 1
};

(function(){
return typeof arguments[0]();
})(foo.bar);

考察this指向以及参数问题,参考

第七题

1
2
3
4
5
var foo = { 
bar: function(){ return this.baz; },
baz: 1
}
typeof (f = foo.bar)();

还是this指向问题。

第八题

1
2
var f = (function f(){ return "1"; }, function g(){ return 2; })(); 
typeof f;

考察逗号和括号表达式问题,参考

第九题

1
2
3
4
5
var x = 1; 
if (function f(){}) {
x += typeof f;
}
x;

考察if语句判断中不是statement的情况,以及typeof statement的情况。

第十题

1
2
3
4
5
(function f(){ 
function f(){ return 1; }
return f();
function f(){ return 2; }
})();

考察函数生命解析顺序问题

第十一题

1
2
function f(){ return f; } 
new f() instanceof f;

考察new运算符相关知识,参考

第十二题

1
2
var x = [typeof x, typeof y][1];
typeof typeof x;

考察typeof和[][1]的相关问题。

第十三题

1
2
3
function(foo){ 
return typeof foo.bar;
})({ foo: { bar: 1 } });

纯文字游戏,考查传进去的参数的问题。

第十四题

with (function(x, undefined){}) length;

考察with,和函数length问题,其实就是参数的个数,参考

答案汇总

1.”object”;
2.报错;
3.1;
4.”undefined”;
5.”number”;
6.”undefined”;
7.”undefined”;
8.”number”;
9.”1undefined”;
10.2;
11.false;
12.”string”;
13.”undefined”;
14.2 .

结语

如果你这几道小题完全无压力,说明你的JS基础知识已经挺不错了,不过这些小题里面继承的知识貌似没有,Cover的不够全面。

完。。

MkDocs快速搭建

MkDocs是什么?

MKDocs就是一个能快速,简单,优雅的生成静态文档站点的项目。文档用Markdown书写,目录用YAML配置,弄好之后你可以把它放到Github的Pages 上,或者自己服务器上就可以了。并且也有好几套UI供你选择MkDocs UI,特别适合那些做开源项目的童鞋,生成说明文档使用。总的来说,就是省时省力,效果还不错。

安装

前提你电脑上已经有了Python,以及Python的包管理器Pip,一般都会有Python环境,Pip不一定有,Pip的安装移步这里Pip Install,进去之后你会发现其实Pip的这个说明文档,也是用这个鬼(MkDocs)做的,其实还是很多人都在用的吧。。😄
这里提一嘴,你的新建一个get-pip.py文件,从上面的安装教程里面下载一段Python代码拷进去,然后执行下面命令,Pip才能安装成功

$sudo python get-pip.py /* 最好加上sudo,否则最后有可能某些文件权限不够安装失败*/
$pip --version
pip 1.5.2

Pip安装成功之后,接着安装Mkdocs,执行下面的命令

$sudo pip install mkdocs /* 最好加上sudo,否则最后有可能某些文件权限不够安装失败*/
$mkdocs --version
mkdocs, version 0.15.2

开始

准备工作做完了,就可以开始了,执行下面命令:

$mkdocs new my-project
$cd my-project
$ mkdocs serve
Running at: http://127.0.0.1:8000/

这时候就可以在本地8000端口看到了,进入my-project,会有一个doc目录和一个mkdocs.yml文件,.yml就是配置文件,配置如下:

site_name: Mkdocs
pages:
- Home: index.md
- About: about.md /*在doc目录下新建.md文件就好了,冒号前面的key会自动生成目录名称*/
theme: readthedocs /*选择了readthedocs主题*/

上面这个配置基本就是Pip Install和这个效果差不多的,我这里就不给demo了,您也可以按照上面的教程实现以下,其实就是这个链接的效果。
也可以进行以下其他的操作,例如:

$mkdocs build /*生成网站的site目录,里面有一些静态资源*/
$mkdocs build --clean
$mkdocs --help

结语

总之,这还是一个比较方便的工具,还是那句话,特别适合开源项目快速撰写文档,或者API接口文档等,如果没记错的话,点评的内部一些文档,也是用的类似工具快速生成的。

完…