1 Redis架构分析
1.1 为什么要用nosqlàredis?
1)存储方式的区别:
nosql:使用K-V的方式存储数据
例如:mset id 0001 name zhangsan age 18
关系型数据库:使用多表结构关联的方式存储数据
例如:
Id |
Name |
Age |
0001 |
Zhangsan |
18 |
… |
… |
… |
2)读写方式的区别:
nosql:可以把不同类型的数据通过k-v的方式进行快速的读写操作,无关系性、数据结构简单。
关系型数据库:在不同类型的数据下需要进行多表关联的方式读写,造成性能上损耗
3)nosql的优缺点
优点:读写数据快,取决于他的无关系性,数据库结构简单。
缺点:不支持sql工业化的数据操作,对于业务类型的数据使用不方便,并且最重要的是不支持对于事务的操作。不适合做数据安全性要求很高的数据存储。
1.2 为什么redis可以快速,并且替代memcache,占领市场
1.2.1 为什么要与memcache来比较
其他的缓存框架(如oscache)只是一个小型的jar包形式的框架,档次不够,而memcache跟redis一样也是可以独立运行在服务器上,并且支持了分布式集群,但是我们今天的redis不光是独立运行,还支持了分布式集群,而且还支持持久化和丰富数据类型,并且在缓存上更加优秀。
1.2.2 了解Memcache实际应用中出现的问题
1)Memcache数据丢失问题:
为了防止意外(服务器宕机、断电),会把一个时间段缓存中的数据插入到DB中,这个过程会给服务器运行效率带来巨大的影响,如果这个时候在高并发的时间段,可能造成服务器压力过大出现死机,数据丢失,然而这种数据的丢失对于企业来说却是灾难性的,所以一般我们会把入库的时间与并发的时间分开(2-3个小时)。
2)数据一致性的问题:
在这个时差(2-3个小时)有的模块已经修改了DB中的数据,但是memcache还没有同步,所以数据就不一致了,为了解决数据一致和命中率的问题,在企业中通常让客户端请求读取不到的数据,去DB中读取,导致大量请求穿透到DB,导致DB无法支撑。
3)命中率低问题:
hash算法是有失误率的,可能在某一段时间的失误率很大导致在memcache中读取不到数据。同时为了解决命中率的问题,在企业中通常也会让客户端请求读取不到的数据,去DB中读取,也会导致大量请求穿透到DB,导致DB无法支撑。
4)业务量增加、访问量持续增长的问题:
导致DB(mysql)表结构的变化,需要重新建表、拆表,memcache也需要扩容,这些工作会浪费很多的人力、物力,造成资源上的浪费。
1.2.3 Memcache+mysql vs redis
1)redis支持了数据持久化的功能(相当于数据库),我们可以配置让从服务器来做RDB、AOF。
(a)可以在很大的程度上防止了数据的丢失。
(b)redis提供了持久化(相当于数据库),可以设计实现前后台数据分离,数据一致性和命中率的问题完全由redis解决。redis存储数据结构简单,建表拆表的情况不存在。
2)数据类型
(a)memcache只支持string类型。
(b)Redis支持5种数据类型,企业使用更加方便。
3)缓存性能
(a)缓存性能比memcache优(在数据结构、内存使用上进行了优化调整,所以比memcache性能优)
(b)内存使用区别:
Memcache:使用内存池的方式,可以省去申请/释放内存的开销,但是在空间上就有了浪费,因为他不能释放空闲内存空间。当内存空间不够的时候,memcache即便是新数据也会被剔除。
Redis:现场申请内存的方式来存储数据。所以不存内存空间的浪费。当内存空间不够的时候,即便是导致swap(替换),也不会剔除数据(非临时数据)。所以Redis更适合作为存储而不是cache。
1.3 Redis在企业架构中的应用
l redis在电商网站中存储的是门户数据,用来处理大数据,高并发的问题
l 关系型数据库在电商网站中存储的是后台业务类型的数据。
1.4 Redis应用场景
l 应用范围:电商购物商品信息缓存、商品抢购、购票系统的队列、新浪微博对于大量不同数据类型的操作、实时聊天信息平台、游戏排行榜
可用场景:数据量比较大且数据内容变化大的场合,需要进行数据快速的读写。并且对数据的安全性要求不高。
不可用的场合:对于数据安全性要求绝对高的情况,比如:银行转账、存取款。
1.5 总结:
1.nosql->redis与关系型数据库差别:
存储方式:数据存储结构简单,不存在表关联
读写速度:速度快,取决于结构简单、无关系型
2.针对于同级别的缓存框架而言,与memcache的对比
--缓存性能比memcache好
--数据类型丰富
--持久化
3.用memcache+mysql与redis对比
业务数据量的不断增加,和访问量的持续增长,遇到的问题:
--mysql需要建表拆表,memcache需要扩容
--数据一致性(持久化)
--访问穿透到DB