Nosql与Sql
在面对海量用户和高并发需求的条件下,使用传统的关系型数据库,由于关系型数据库的数据存储在硬盘,性能会比较差,导致网站崩溃。除此之外,关系型数据库可扩展性差,数据库中的表之间是网状关系,错综复杂,对其中一个表的结构进行修改,有可能牵一发动全身。
Nosql的出现解决了Sql的这两个问题,所以Nosql常被用在海量用户和高并发的需求下,对比sql,特点是
- 数据主要将数据存储在内存,提高访问速度,但也能做数据灾难恢复,也可以将数据存在硬盘,但这不是nosql的重点。
- 采用key-value的方式存储数据,数据之间关联不紧密,具有较高灵活性和可扩展性
sql和nosql在不同的场景下因有不同的选择,以电商为例子。
商品基本信息适合存储在MySQL
商品描述、评论等大段文字,存在硬盘,读写比较慢,适合存储在MongoDB
图片信息这种数据,比较偏向于文件性质,适合存储在分布式文件系统
搜索关键字适合存储在ES、Lucene、solr
对于热点信息,具有高频和阶段性的特点,适合存储在Redis,运用其高性能的特点满足业务需求。
Redis
特点
- 数据之间没有必然关联,使用key-value存储
- 采用单线程工作,也就是说同步工作,不会出错,操作都是原子性的
- 虽然是单线程,但是高性能
- 支持五种数据类型
- 持久化支持
应用
- 热点数据加速查询
- 任务队列:秒杀、抢购、排队购票
- 即时信息查询:排行榜、聊天室信息、设备信号等
- 时效性信息:验证码、投票控制
- 消息队列
- 分布式数据共享,session分离
- 分布式锁
Nodejs中使用Redis
下载安装
下载redis源代码,编译
cd redis-<version>
make # 编译
src/redis-server #启动
打开另一个终端,启动redis交互命令行,通过set和get存取数据
src/redis-cli # 启动交互命令行查询
127.0.0.1:6379> set foo bar
OK
127.0.0.1:6379> get foo
"bar"
redis-server也可以后台执行
src/redis-server --daemonize yes # 后台执行
pkill -u $USER redis-server # 清空本机后台redis
接入node
npm install redis --save
const redis = require('redis');
const client = redis.createClient();
client.on('connect',()=>{
console.log('Redis client cennected');
});
client.set('foo','bar',redis.print);
client.get('foo',(err,result)=>{
if(err){
console.log(err);
throw error;
}
console.log('Get result: ',result);
})