学Redis从认识它开始

Redis是什么?

(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis的应用场景

在我们的日常开发中,基本上都是使用数据库来进行数据存储,一般的系统中通常不会存在高并发的情况,所以看起来没什么问题,但是一旦出现同一时间大量的数据请求来访问系统,比如抢购,秒杀等等,那这种单一的用数据库来进行数据的保存的系统会因为面向磁盘,而又受到磁盘的读写速度限制,大量的数据给磁盘带来的巨大的的压力,这种情况就和网安界最无解的DDOS攻击一样,轻则让系统卡顿,重则直接宕机。

而redis主要应用的两个场景就是:

1、用来存储常用缓存的数据

2、在需要快速读写的场景下进行快速读写

NoSql技术

为了解决上述的问题,大多数项目都会引入NoSql技术,这是一种面向内存的数据库,并且提供了一定的持久化功能,现在流行的NoSql技术有Redis和MongoDB,相比较之下,redis的性能就比较强大了,它可以支持每秒十几万次的读写操作,其性能远高于数据库,并且还支持分布式,集群,主从同步等配置,原则上支持无限拓展(实际根据服务器的内存来看,默认开启16个库,默认优先使用0号库),另外redis还支持一定的事务能力,从而在一定程度上保证了在高并发情况下数据的安全性和一致性。

一张图了解集群,分布式:

集群:多个人在一起作同样的事 。

分布式 :多个人在一起作不同的事 。

主从同步:

1、在多台数据服务器中,只有一台主服务器,而主服务器只负责写入数据,不负责外部程序读取数据。
2、存在多台从服务器,从服务器不写入数据,只负责同步主服务器的数据,并让外部程序读取数据。
3、主服务器写入数据后,即刻将写入数据的命令发送给从服务器,从而使得主从数据同步。
4、应用程序可以随机读取某一台从服务器的数据,这样就可以分摊读取数据的压力。
5、当从服务器不能工作时,整个系统将不受影响;当主服务器不能工作时,可以方便地从从服务器选举一台来当主服务器

缓存技术

现在比较流行的缓存技术是redis和memcached,两者相比:

1、redis拥有“持久化”的特性,虽然两者都可以做缓存,但是redis还可以做存储;

2、存储的数据类型不一样,memcached仅仅能存储字符串一种类型,而redis支持5种类型,即字符串,哈希结构,链表,集合,有序集合。

缓存应用

在我们日常开发的场景中,读操作对数据库的访问次数远远超过写操作,比例大概在9:17:3,当我们对数据库进行读操作时,数据库就会去磁盘把对应的索引取回来,另外如果sql语句很繁琐,需要多表联查,而且数据库的结构设计的很不合理的情况下,并且数据库里面没有建立视图,那这样一条语句查询的时间是很容易让人暴走的,尤其是当你二开那些无良外包团队写的项目的时候,心肌梗塞都能给你憋出来!

但是如果我们把数据放在redis中,也就是直接放在内存当中的话,让服务器直接从内存中读取数据,那么这样的速度就会快上很多,并且能够极大地减小数据库的压力,系统能够迅速的反应数据请求,但是这样直接使用内存进行数据存储虽然快,但是成本也是比较大的,一般考虑到成本方面的原因,我们只会把常用的一些数据和主要的数据放在redis上面,比如用户的登录信息之类的。

如果我们考虑项目是否需要用redis,一般从以下几个方面考虑:

一、业务数据常用吗?使用率如何?

如果使用的频率很低,就没有必要写入缓存,还占用一定的内存

二、该业务是读操作频率高,还是写操作频率高?

如果是写操作频率高,那么就是频繁的写入数据库。也就没有必要使用缓存了

三、业务数据的大小如何?

如果业务数据过大,例如要存储几百M字节的数据,那如果放到缓存里面的话,那么对内存的开销是十分的巨大的,也不建议使用缓存(谷歌那样的除外,据说他是把互联网所有的数据都放在了内存条上面,才会有如此高效,快速的搜索。。。。。)

如果考虑了上面的一些问题,还是觉得有必要使用缓存的话,那么就开始选择redis吧。redis作为缓存读取的逻辑如下图所示:

从上图我们可以了解到:

一、当第一次读取的时候,读取redis失败,然后会从数据库里面读取,读出来的数据先写入到redis,然后再去执行后面的程序

二、当从第二次以后开始读取的时候,因为在第一次的时候已经写入了redis,所以读取redis会成功,然后就直接去执行后面的程序,这样不仅节省了从数据库里面再去读取的时间,也大大提升了程序执行的效率

这样在进行读操作的时候,直接从redis里面读取,其操作效率是很高的,而且大大的减少了数据库的压力

接下来看一下redis作为缓存的写操作是如何运行的

从上面的流程图我们可以看出来,相对比与普通的写操作,redis作为缓存执行写操作的时候,会多一步更新写入到redis,当我们的项目里面写操作的次数大于读操作时,我们就没有必要来使用Redis了,这样不仅浪费内存,而且程序执行效率还不是很高

 

了解完Redis作为缓存的应用,我们再来了解一下Redis在高速读/写场合下的应用

现在的互联网中,高并发的情况越来越常见,比如马上到来的双11,活动抢购,秒杀等等等等,这些活动都是在瞬间或者某一个时刻有成千上万甚至上百万千万的数据来同时到达服务器的,如果按照单一的从数据库进行读写,再去写入到磁盘,就算你的服务器再能抗,出现卡顿是在所难免的,甚至如果是小网站的话,直接宕机也不在话下,这么些大的数据同时阻塞在服务器, 就相当于自己给自己搞了一个巨大的DDOS定时炸弹,造成的影响有多么的严重都是难以想象的

而Redis能够很轻松的应对这样高并发的场合,下图是成百上千万里面的一次请求:

我们来分析一下上图的操作:

当一个业务请求过来的时候,我们直接在redis进行读取,然后判断高速读写业务是否已经结束,如果没有结束的话,就把数据写入到redis,然后执行下一个业务请求;如果判断高速读写已经结束,通常的判断条件是抢购的商品数量已经为0,或者时间已经到了,这样就把redis存放的缓存数据一次性异步批量的写入到数据库,来完成数据的持久化

 

小结:redis既可以作为缓存来暂时的存放数据,又可以作为持久化工具来完成数据的持久化,但是并不是适用于所有的场合,像写操作的次数大于读操作的时候,用redis就不合适了,大多数情况下,redis还是能满足很多需求的,今天主要就是先认识一下redis,redis的应用场景,以后会继续学一下redis的常用命令,在项目中的使用情况。

 

这里这位朋友对redis的理解和分析也是很容易让人理解,文章写的很好,我也是按照他的文章加上自己的一点理解写出来的:

https://www.jianshu.com/p/56999f2b8e3b

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章