Redis——Redis分布式集群—基础知识介绍

一、Redis简介?
【1】redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)和zset(有序集合)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。
【2】在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
【3】Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。
【4】redis的作者,他叫Salvatore Sanfilippo[2],他使用的网名是antirez。来自意大利的西西里岛,现在居住在卡塔尼亚。目前供职于Pivotal公司。
【5】redis目前提供四种数据类型:string,list,set及zset(sorted set)。
【6】Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
【7】redis的官网地址,非常好记,是redis.io。(特意查了一下,域名后缀io属于国家域名,是british Indian Ocean territory,即英属印度洋领地)目前,Vmware在资助着redis项目的开发和维护。
二、redis和mysql的区别?
这两者的主要差异在于查询,redis只能用key去获取value,不支持sql语句来进行查询。而mysql则只能通过sql语句来进行查询,不能直接通过key来获取value。
因为redis的数据读取过程的时间复杂度是O(1),也就是说和数据量无关。再加上数据保存在内存,所以读取速度在理论上已经达到了上限。而mysql的查询则是通过扫描表来进行,读取的速度取决于数据量,以及是否有合适的索引。

1.mysql和redis的数据库类型
mysql是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。
redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限
2.mysql的运行机制
mysql作为持久化存储的关系型数据库,相对薄弱的地方在于每次请求访问数据库时,都存在着I/O操作,如果反复频繁的访问数据库。第一:会在反复链接数据库上花费大量时间,从而导致运行效率过慢;第二:反复的访问数据库也会导致数据库的负载过高,那么此时缓存的概念就衍生了出来。
3.缓存
缓存就是数据交换的缓冲区(cache),当浏览器执行请求时,首先会对在缓存中进行查找,如果存在,就获取;否则就访问数据库。
缓存的好处就是读取速度快
4.redis数据库
redis数据库就是一款缓存数据库,用于存储使用频繁的数据,这样减少访问数据库的次数,提高运行效率。
5.redis和mysql的区别总结

(1)类型上
从类型上来说,mysql是关系型数据库,redis是缓存数据库
(2)作用上
mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢
redis用于存储使用较为频繁的数据到缓存中,读取速度快
(3)需求上
mysql和redis因为需求的不同,一般都是配合使用。

在这里插入图片描述
三、为什么要使用Redis?
【1】在我们日常的Java Web开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,
所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,
单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,
需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,
最终导致服务宕机的严重生产问题。

【2】NoSQL 技术
为了克服上述的问题,Java Web项目通常会引入NoSQL技术,这是一种基于内存的数据库,并且提供一定的持久化功能。
Redis和MongoDB是当前使用最广泛的NoSQL,而就Redis技术而言,它的性能十分优越,可以支持每秒十几万此的读/写操作,
其性能远超数据库,并且还支持集群、分布式、主从同步等配置,原则上可以无限扩展,让更多的数据存储在内存中,
更让人欣慰的是它还支持一定的事务能力,这保证了高并发的场景下数据的安全和一致性。
【3】redis是Nosql数据库,是一个key-value存储系统
虽然redis是key-value的存储系统,但是redis支持的value存储类型是非常的多,比如字符串、链表、集合、有序集合和哈希。
为什么使用类似redis这样的Nosql数据库
(1) 当数据量的总大小一个机器放不下时;
(2)数据索引一个机器的内存放不下时;
(3)访问量(读写混合)一个实例放不下时。
单机时代,存储只用一台机器装mysql,如果每次存储成千上万条数据,这样很会导致mysql的性能很差,存储以及读取速度很慢,然后就演变成缓存+mysql+垂直拆分的方式。
Cache作为中间缓存时代,将所有的数据先保存到缓存中,然后再存入mysql中,减小数据库压力,提高效率。
但是当数据再次增加到又一个量级,上面的方式也不能满足需求,由于数据库的写入压力增加,缓存只能缓解数据库的读取压力。读写集中在一个数据库上让数据库不堪重负,大部分网站开始使用主从复制技术来达到读写分离,以提高读写性能和读库的可扩展性。Mysql的master-slave模式成为这个时候的网站标配了。
主从分离模式时代,在redis的高速缓存,MySQL的主从复制,读写分离的基础之上,这时MySQL主库的写压力开始出现瓶颈,而数据量的持续猛增,由于MyISAM使用表锁,在高并发下会出现严重的锁问题,大量的高并发MySQL应用开始使用InnoDB引擎代替MyISAM。
四、sql和nosql的区别
4.1什么是sql?
SQL Server是由Microsoft开发和推广的关系数据库管理系统(DBMS),它最初是由Microsoft、Sybase和Ashton-Tate三家公司共同开发的,并于1988年推出了第一个OS/2版本。Microsoft SQL Server近年来不断更新版本,1996年,Microsoft 推出了SQL Server 6.5版本;1998年,SQL Server 7.0版本和用户见面;SQL Server 2000是Microsoft公司于2000年推出,目前最新版本是2017年份推出的SQL SERVER 2017。
1.真正的客户机/服务器体系结构。
2.图形化用户界面,使系统管理和数据库管理更加直观、简单。
3.丰富的编程接口工具,为用户进行程序设计提供了更大的选择余地。
4.SQL Server与Windows NT完全集成,利用了NT的许多功能,如发送和接受消息,管理登录安全性等。SQL Server也可以很好地与Microsoft BackOffice产品集成。
5.具有很好的伸缩性,可跨越从运行Windows 95/98的小型电脑到运行Windows 2000的大型多处理器等多种平台使用。
6.对Web技术的支持,使用户能够很容易地将数据库中的数据发布到Web页面上。
7.SQL Server提供数据仓库功能,这个功能只在Oracle和其他更昂贵的DBMS中才有。
SQL Server 2000与以前版本相比较,又具有以下新特性 :

1.支持XML(Extensive Markup Language,扩展标记语言)
2.强大的基于Web的分析
3.支持OLE DB和多种查询
4.支持分布式的分区视图

4.2什么是nosql?
​NoSQL(NoSQL = Not Only SQL ),意即“不仅仅是SQL”,是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
特点特征
它们可以处理超大量的数据。
它们运行在便宜的PC服务器集群上。
PC集群扩充起来非常方便并且成本很低,避免了“sharding”操作的复杂性和成本。
它们击碎了性能瓶颈。
NoSQL的支持者称,通过NoSQL架构可以省去将Web或Java应用和数据转换成SQL友好格式的时间,执行速度变得更快。
“SQL并非适用于所有的程序代码,” 对于那些繁重的重复操作的数据,SQL值得花钱。但是当数据库结构非常简单时,SQL可能没有太大用处。
没有过多的操作。
虽然NoSQL的支持者也承认关系数据库提供了无可比拟的功能集合,而且在数据完整性上也发挥绝对稳定,他们同时也表示,企业的具体需求可能没有那么多。
Bootstrap支持
因为NoSQL项目都是开源的,因此它们缺乏供应商提供的正式支持。这一点它们与大多数开源项目一样,不得不从社区中寻求支持。
优点:
1.易扩展
这些类型的数据存储不需要固定的模式,无需多余的操作就可以进行横向的扩展。
相对于关系型数据库可以减少表和字段特别多的情况。也无型之间在架构的层面上带来了可扩展的能力
(2)大数据量提高性能
(3)多样灵活的数据模型
4.4sql和nosql的主要差异:

1.类型
SQL数据库主要称为关系数据库(RDBMS); 而NoSQL数据库主要称为非关系数据库或分布式数据库。
2.语言
SQL数据库定义和操作基于数据的结构化查询语言(SQL)。从侧面看这种语言是非常强大的。SQL是最通用和最广泛使用的选项之一,使其成为安全的选择,尤其适用于复杂的查询。但从另一方面来说,它可能是限制性的。SQL要求您在使用之前使用预定义模式来确定数据的结构。此外,您的所有数据都必须遵循相同的结构。这可能需要大量的前期准备,这意味着结构的变化既困难又对整个系统造成破坏。
NoSQL数据库具有非结构化数据的动态模式。数据以多种方式存储,这意味着它可以是面向文档,面向列,基于图形或组织为KeyValue存储。这种灵活性意味着可以在没有首先定义结构的情况下创建文档。每个文档也可以有自己独特的结构。语法因数据库而异,您可以随时添加字段。
3.可伸缩性
在几乎所有情况下,SQL数据库都是可垂直扩展的。这意味着您可以通过增加RAM,CPU或SSD等功能来增加单个服务器的负载。但另一方面,NoSQL数据库可以横向扩展。这意味着您可以通过分片或在NoSQL数据库中添加更多服务器来处理更多流量。它类似于在同一建筑物中添加更多楼层,而不是在附近增加更多建筑物。因此NoSQL最终可以变得更大,更强大,使这些数据库成为大型或不断变化的数据集的首选。
4.结构
SQL数据库是基于表的,另一方面NoSQL数据库是键值对,基于文档的,图形数据库或宽列存储。这使得关系SQL数据库成为需要多行事务的应用程序(如会计系统)或为关系结构构建的遗留系统的更好选择。
5.遵循的属
SQL数据库遵循ACID属性(原子性,一致性,隔离性和持久性),而NoSQL数据库遵循Brewers CAP定理(一致性,可用性和分区容差)。
6.支持
来自其
供应商的所有SQL数据库都提供了很好的支持。此外,还有很多独立咨询可以帮助您使用SQL数据库进行大规模部署,但对于某些NoSQL数据库,您仍然需要依赖社区支持,并且只有有限的外部专家可用于设置和部署大规模NoSQL部署。
SQL数据库的一些示例包括PostgreSQL,MySQL,Oracle和Microsoft SQL Server。NoSQL数据库示例包括Redis,RavenDB Cassandra,MongoDB,BigTable,HBase,Neo4j和CouchDB。
SQL vs NoSQL的主要区别:

SQL	                                         NOSQL
关系数据库管理系统(RDBMS)	           非关系或分布式数据库系统。
这些数据库具有固定或静态或预定义的架构	   他们有动态架构
这些数据库不适用于分层数据存储。	       这些数据库最适合分层数据存储。
这些数据库最适合复杂查询	               这些数据库不太适合复杂的查询
Verticlly可扩展	                        Horizontally可扩展

五、redis的应用场景
一般而言 Redis 在 Java Web 应用中存在两个主要的场景:一个是缓存常用的数据,另一个是在需要高速读/写的场合使用它快速读写。
  1.缓存
  在对数据库的读/写操作中,读操作远超写操作,一般是9:1到7:3的比例,所以需要读的可能性比写的可能性多得多。
  当发送SQL去数据进行读取时,数据库就会去磁盘把对应的数据索引回来,而索引磁盘是一个相对缓慢的过程。如果把数据直接放在运行在内存中的Redis服务器上,那么就不需要去读/写磁盘了,而是直接读取内存,显然速度会快得多,而且会极大减轻数据库的压力。
  而使用内存进行存储数据开销也是比较大的,应该考虑在Redis中存储哪些数据,需要从3个方面进行考虑:

1.业务数据常用与否以及命中率大小。如果命中率很低,就没有必要写入缓存。
2.该业务数据是读操作多,还是写操作多,如果写操作多,频繁需要写入数据库,也没有必要使用缓存
3.如果要存储几百兆字节的文件,会给缓存带来很大的压力,没有必要。
如果觉得有必要使用缓存,那么就使用它!
5.1使用 Redis 作为缓存的读取逻辑如下图所示:
在这里插入图片描述
1.当第一次读取数据的时候,读取Redis的数据就会失败,此时会触发程序读取数据库,把数据读取出来,并且写入Redis
2.当第二次以及以后读取数据时,就直接读取Redis,读到数据后就结束了流程,这样速度就大大提高了。
5.2写操作流程
在这里插入图片描述
如果业务数据写操作次数远远大于读操作次数,那么没有必要使用 Redis
5.3高速读/写场合
高速读/写场合例如:秒杀商品、抢红包、抢票等。这类场合在一瞬间成千上万的请求就会达到服务器,如果使用的数据库,很容易造成数据库瘫痪。
  解决办法是异步写入数据库,即在高速读/写的场合单单使用 Redis 去应对,把这些需要高速读/写的数据缓存到 Redis 中,而在满足一定的条件下,触发这些缓存的数据写入数据库中。
  在这里插入图片描述
  当一个请求到达服务器时,只是把业务数据在 Redis 上进行读写,而没有对数据库进行任何的操作,这样就能大大提高读写的速度,从而满足高速响应的需求;
但是这些缓存的数据仍然需要持久化,也就是存入数据库之中,所以在一个请求操作完 Redis 的读/写之后,会去判断该高速读/写的业务是否结束,这个判断通常会在秒杀商品为0,红包金额为0时成立,如果不成立,则不会操作数据库;如果成立,则触发事件将 Redis 的缓存的数据以批量的形式一次性写入数据库,从而完成持久化的工作。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值