使用Redis技术避免阻塞(redis 避免阻塞)
把网络请求和数据库操作拆解后,其中的 I/O 操作会很耗时,也就是我们常说的阻塞(Blocking)。因为 I/O 是一个非常耗时的操作,如果把系统性能要求提到一定水平,就要权衡系统中每个模块的时间复杂度。通常的做法是:这个模块耗时很长,做了一定的预处理,将这部分工作移到其他系统中处理,从而减轻每次网页请求带来的压力,可以让我们尽可能多地做到异步,来提升性能。
在这时使用Redis发挥作用。Redis本身是一个KEY-VALUE高速存储数据库,同时还支持Json,它的主要特点:
1. 有数据类型,不需要像关系型数据库那样加字段;
2. 高速,读取更快;
3. 保存有重复值,就是设计中规避不同类别数据三范式;
4. 一般都是内存操作,实时性高;
5. 支持查询和排序;
6. 支持消息队列功能,即Redis Pub/sub,使得数据订阅同步变动;
7. 支持较高延时,这里指存储或持续更新数据;
8. 支持分片扩容支持,如果事物越来越多,可以通过分片的形式来拓展项目31。
使用Redis来避免网络阻塞的方式主要有两种,一种是先把数据存在Redis中,这样客户端在请求时就不用等到数据操作结束,而是从Redis中取出数据,写数据也通过放入Redis来解决;另一种是Redis涉及到的消息队列功能,如果在网页中出现较多的查询,那么可以使用Redis Pub/sub的功能,把请求的任务放入Redis的队列,由另一个程序定期拉取进行处理,这样在客户端发起请求时,就不会被阻塞了。
// 保存数据
redis.hmset('hash_table_key', { 'subkey1': 'subvalue1',
'subkey2': 'subvalue2', 'subkey3': 'subvalue3',
}, function(err, result) { if (err) {
console.error(err); } else {
console.log(result); }
});
// 订阅消息redis.subscribe('topic_name',function(err,count){
if(err){ console.log(err);
}});
// 发布消息redis.publish('topic_name','message_content',function(err,result){
if(err){ console.log(err);
}});
使用redis可以有效避免网络阻塞的情况。当需要等待数据库操作的时候,使用Redis并行运行的可能性,可以大大减少服务器压力,提升系统性能。对于大型项目,使用redis避免阻塞,是一个不可或缺的步骤。