Web - 缓存

缓存是分布式系统中的重要组件,主要解决高并发大数据场景下热点数据访问的性能问题,提供高性能的数据快速访问;

从部署角度分类缓存应用:CDN缓存;反向代理缓存;分布式Cache;本地应用缓存;

那些数据需要缓存:1.热点数据;2.静态资源;

根据在软件系统中的所处的位置不同,缓存大体可分为三类:客户端缓存、服务端缓存、网络中的缓存;

数据库缓存:

数据库属于IO密集型的应用,主要负责数据管理及存储.数据库缓存是一类特殊的缓存,是数据库自身的缓存机制.大多数数据库不需要配置就可以快速运行,但没有为特定的需求进行优化.在数据库调优的时候,缓存优化是一项很重要的工作.以mysql为例,mysql中使用了查询缓冲机制,将select语句和查询结果放在了缓冲区,以后对于同样的select语句,将直接从缓冲区读取结果,以节省查询时间.

平台级缓存:

平台级缓存指的是用来写带有缓存特性的应用框架,或者可用于缓存功能的专用库.java中缓存框架更多,例如:Ehcache,voldemort,JBossCache,OSCache,Cacheonix.

应用级缓存:

当平台级缓存不能满足要求的时候,就该考虑应用级缓存了.应用级缓存需要开发者通过代码实现缓存机制.这里是noSQL的胜场.不论是Redis,mongoDB,Memcached,都可以作为应用级缓存的重要技术.一种典型的方式是每分钟或者每一段时间后统一生成某类页面存储在缓存中,或者可以在热数据变化时更新缓存.

分布式缓存系统

目的:为了解决数据库服务器和Web服务器之间的瓶颈;

²  如果一个网站流量很大这个瓶颈将会非常明显,每次数据库查询的耗费的时间将不容乐观;

²  对于更新不是很快的站点v,可以采用静态化来避免过多的数据查询,可采用Freemaker或Velocity来实现页面静态化;

²  对于更新数据以秒级的站点,静态化也不会太理想,可以通过分布式缓存系统来解决,如Redis、MemCache、SSDB等;

【在Web开发中,经常从数据库中获取相同的数据,这种重复的操作极大地增加了数据库的负载.缓存是解决这种问题最好的办法;】

【Redis就是一个高性能的、分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度】

数据存储方案:

Web - 缓存

关系型数据库:Oracle、Mysql、DB2

非关系型数据库:MongoDB、HBase、Redis

 

关系型数据库

非关系型数据库

特点

1.  结构化存储,完整约束,基于关系模型设计;

2.  表与表之间有关联表;

3.  具有结构化的查询语言;

4.  严格控制事务的一致性;

  1. 非结构化存储;
  2. 基于多维关系模型;
  3. 应用于互联网或者电商系统中的一些特有场景;

优点

  1. 严格的事务控制保持数据一致性;
  2. 可进行复杂查询;
  3. 产品多,技术成熟;
 
  1. 高并发下读写能力强大;
  2. 易扩展;
  3. 结构简单;

缺点

1.  高并发下数据的读写效率低;

2.  不易扩展;

3.  不支持非结构化存储;

  1. 难以支持复杂查询;
  2. 事务支持较弱;
  3. 适用于一些特定业务场景;
关系型与非关系型数据库之间的异同点

Redis

MemCache

线程操作

单核,单线程;

多核,多线程;

数据结构

KV类型,List、Set、Hash;

KV类型;

数据安全性

内存存储;宕机或重启可恢复,可做持久化;(定期将内存数据同步到磁盘中)

内存存储;宕机或重启数据不可恢复;

数据备份

支持数据备份,需开启master-slave主从策略;

过期策略

通过expire设置Key的过期时间;

在set时就指定了过期时间;

²  Redis提供两种持久化策略,默认支持的是RDB持久化以及需要手工开启的AOF持久化.而MemCache仅仅是将数据存储在内存中;

²  内存回收——,MemCache有内存回收机制,当程序中为它设置的内存大小,一旦存储的数据超过时,它会去自动回收,也就是释放,不然会出现内存溢出的情况.这是因为memCache的数据都时存储在内存中的.而Redis不会出现这种情况,因为Redis可以将数据持久化到磁盘上;

Redis

²  是一个开源的面向键值对Key-Value烈性数据的分布式NoSQL数据库系统,它的特点是高性能,适用于高并发的应用场景.可以说,Redis纯粹是为了应用而产生的;

²  是一个高性能的KV数据库,并提供多种语言的API.缺点也很明显,对事务的处理很弱,也无法做太复杂的关系型数据库中的模型;

²  支持存储的Value烈性相对较多,典型的如字符串String、链表List、集合Set、有序集合Zset(sortedset)、哈希类型Hash,这些数据类型都支持push和pop、add和remove,以及取交集、并集、差集等更复杂的操作.由于这些操作都是原子性的,在此基础上,Redis支持各种不同方式的排序;

²  与MemCache一样为了保证效率,数据都被缓存到内存中,区别在于Redis会周期性的把更新的数据写入磁盘,把修改操作写入追加的记录文件中,并且在此基础上实现maste-slave主从同步策略,也就是数据可以从主服务器向任意数量的从服务器上同步,从服务器可以关联其他类型的服务器.因此,Redis的出现很大程度上弥补了MemCahe此类KV存储的不足,在部分场合可以对关系型数据库起到很好的补充作用;