数据存储

数据存储

Node中的数据存储主要有

  • 内存和文件系统数据存储
  • 传统的关系型数据库存储
  • 非关系型数据库存储
  • 此次主要写的是非关系型数据库存储中的Redis,其余数据存储方式略谈

内存存储

内存存储的理想用途是存放少量经常使用的数据,这种数据的读取和写入都很快,但服务器和程序重启后数据就丢了;

基于文件的存储

用文件系统 fs 存放数据,存储在本地或服务器上,重启后数据还在;问题是:如果有两个用户同时修改了同一份文件,保存一个版本会覆盖另一个版本,导致其中一个用户数据丢失,所以对于多用户程序而言,不推荐使用基于文件的存储;

关系型数据库

关系型数据库管理系统(RDBMS)可以存储复杂的信息,并且查询起来很容易,历来被用在相对高端复杂的程序上,主要用的是MySQL,MySQL设置简单,且有很大的用户群;

非关系型数据库

对于实时分析或消息传递,NoSQL数据库可能是更好的选择,而且NoSQL数据库通常不用预先设置schemas,对于那种要把数据存储在层次结构中,但层次结构却会发生变化的程序而言,是很有帮助的,其中代表为Mongo和Redis;

* 现在重点来说Redis

Redis把数据存在RAM中,并在磁盘中记录数据的变化,虽然存储空间有限,但数据操作非常快,假如Redis服务器崩了,RAM中的内容丢失,可以用磁盘中的日志恢复数据;Redis支持常用的数据结构:哈希表、链表、键值对(作为简单的变量使用)

  • 安装(Windows)

https://github.com/MicrosoftArchive/redis/releases

数据存储

解压 => 新建一个redis文件夹 => 将解压后的64bit文件内容全移至redis中 => 运行终端
=> 将 redis-server.exe 拖至终端运行 (如下)

数据存储

如此,Redis就已经在本地上运行起来了


  • 写入数据
1
2
3
4
5
6
7
8
9
10
11
12
var redis = require('redis');
var client = redis.createClient(6379, '127.0.0.1');
client.on('error', function(err){
console.log('Error' + err);
});
client.set('color', 'red', redis.print);
client.get('color', function(err, data){
if(err) throw err;
console.log('Got' + data);
});

运行以上代码,就在本地6379端口连接Redis,并创建一个简单的键值对

新开了一个终端,将redis中的 redis-cli.exe 拖进终端运行,可查看当前Redis中的数据;切记保持上一个终端,不可关闭!

数据存储

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
var redis = require('redis');
var client = redis.createClient(6379, 'localhost');
client.on('error', function(err){
console.log('Error' + err);
});
client.hmset('camp', {
'shelter': '2-person tent',
'cooking': 'campstove'
}, redis.print);
client.hget('camp', 'cooking', (err, value) => {
if (err) throw err;
console.log('Will be cooking with : ' + value);
});
client.hkeys('camp', function(err, keys){
if(err) throw err;
keys.forEach((key, i) => {
console.log(' ' + key);
})
})

运行以上代码,创建一个哈希表,存入数据,hget 取的是对应键名的数据,hkeys 取的是当前Redis中该哈希表存在的键

数据存储

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var redis = require('redis');
var client = redis.createClient(6379, 'localhost');
client.on('error', function(err){
console.log('Error' + err);
});
client.lpush('weather', 'Today is sunny.', redis.print);
client.lpush('weather', 'Tomorrow will be sunny too.', redis.print);
client.lrange('weather', 0, -1, function(err ,items){
if(err) throw err;
items.forEach(function(item, i){
console.log(' ' + item);
})
})

运行以上代码,会创建一个列表,列表按顺序将数据插入,查询列表的时候需要带参数,第一个参数为从哪条数据开始取,第二个元素是取到第几条数据(0代表从第一条数据开始,-1代表取到最后一个元素)

数据存储

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var redis = require('redis');
var client = redis.createClient(6379, 'localhost');
client.on('error', function(err){
console.log('Error' + err);
});
client.sadd('color', 'red', redis.print);
client.sadd('color', 'blue', redis.print);
client.sadd('color', 'red', redis.print);
client.smembers('color', function(err, members){
if(err) throw err;
console.log(members);
})

运行以上代码,会创建一个集合,并将数据写入集合里,但集合中的元素是唯一的,将两个相同的值写入,第二次的写入将会被忽略

数据存储

以上便是Redis基础知识!

后话

  • 一个程序中可使用多种存储机制,比如一个内容管理系统,可能会用文件存储Web程序的配置选项,用MongoDB存储文章,用Redis存储用户给出的文章评级