缓存方案

目录
目录 I
1 引言 1
1.1 文档概述 1
1.2 适用范围 1
1.3 定义 1
2 功能操作说明 1
2.1 缓存Cache 1
2.1.1 EHCache 1
2.1.2 memcache 2
2.1.3 Redis 3
2.1.4 现有 Cache 系统 5
2.1.5 期待的理想 Cache 系统 5
2.1.6 Redis和Memcached的比较 6

1引言
1.1文档概述
本文主要阐述各个缓存之间的差异性比较。

1.2适用范围

1.3定义

2功能操作说明

2.1缓存Cache

所谓缓存,就是将程序或系统经常要调用的对象存在内存中,一遍其使用时可以快速调用,不必再去创建新的重复的实例。这样做可以减少系统开销,提高系统效率。
缓存主要可分为二大类:
一、文件缓存
二、内存缓存

2.1.1EHCache
2.1.1.1功能简介

EHCache 是一个纯java的在进程中的缓存

  1. 够快
    Ehcache的发行有一段时长了,经过几年的努力和不计其数的性能测试,Ehcache终被设计于large, high concurrency systems.

  2. 够简单
    开发者提供的接口非常简单明了,从Ehcache的搭建到运用运行仅仅需要的是你宝贵的几分钟。其实很多开发者都不知道自己用在用Ehcache,Ehcache被广泛的运用于其他的开源项目
    比如:hibernate

3.够小
关于这点的特性,官方给了一个很可爱的名字small foot print ,一般Ehcache的发布版本不会到2M,V 2.2.3 才 668KB。

  1. 够轻量
    核心程序仅仅依赖slf4j这一个包,没有之一!

5.好扩展
Ehcache提供了对大数据的内存和硬盘的存储,最近版本允许多实例、保存对象高灵活性、提供LRU、LFU、FIFO淘汰算法,基础属性支持热配置、支持的插件多

6.监听器
缓存管理器监听器 (CacheManagerListener)和 缓存监听器(CacheEvenListener),做一些统计或数据一致性广播挺好用的
2.1.1.2操作说明
1、 项目类库中添加ehcache.jar;
2、 在类路径下编写ehcache.xml配置文件。

2.1.2MemCache
2.1.2.1功能简介
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap,所有数据都放在储存在内存中。
如果插件停止,那么所有的内存数据将会被销毁。
memcached中缓存的单个对象不能超过1MB

这里写图片描述

1.依赖
memcache C语言所编写,依赖于最近版本的GCC和libevent。GCC是它的编译器,同事基于libevent做socket io。在安装memcache时保证你的系统同事具备有这两个环境。

2.多线程支持
memcache支持多个cpu同时工作,在memcache安装文件下有个叫threads.txt中特别说明,By default, memcached is compiled as a single-threaded application.默认是单线程编译安装,如果你需要多线程则需要修改./configure –enable-threads,为了支持多核系统,前提是你的系统必须具有多线程工作模式。开启多线程工作的线程数默认是4,如果线程数超过cpu数容易发生操作死锁的概率。结合自己业务模式选择才能做到物尽其用。

3.高性能
通过libevent完成socket 的通讯,理论上性能的瓶颈落在网卡上。
2.1.2.2操作说明
1、 项目类库中添加java_memcached-release_2.6.3.jar;

2.1.3Redis

2.1.3.1功能简介
Redis是在memcache之后编写的,大家经常把这两者做比较,如果说它是个key-value store 的话但是它具有丰富的数据类型,我想暂时把它叫做缓存数据流中心,就像现在物流中心那样,order、package、store、classification、distribute、end。
特性

  1. 支持持久化
    redis的本地持久化支持两种方式:RDB和AOF。RDB 在redis.conf配置文件里配置持久化触发器,AOF指的是redis没增加一条记录都会保存到持久化文件中(保存的是这条记录的生成命令),如果不是用redis做DB用的话还会不要开AOF ,数据太庞大了,重启恢复的时候是一个巨大的工程!

2.丰富的数据类型
作为Key-value 型数据库,Redis 也提供了键(Key)和键值(Value)的映射关系。但是,除了常规的数值或字符串,Redis 的键值还可以是以下形式之一:

 · Lists (列表)
 · Sets (集合)
 · Sorted sets (有序集合)
 · Hashes (哈希表)

 键值的数据类型决定了该键值支持的操作。Redis 支持诸如列表、集合或有序集合的交集、并集、查集等高级原子操作;同时,如果键值的类型是普通数字,Redis 则提供自增等原子操作。

3.高性能
这点跟memcache很想象,内存操作的级别是毫秒级的比硬盘操作秒级操作自然高效不少,较少了磁头寻道、数据读取、页面交换这些高开销的操作!这也是NOSQL冒出来的原因吧,应该是高性能
是基于RDBMS的衍生产品,虽然RDBMS也具有缓存结构,但是始终在app层面不是我们想要的那么操控的。

4.replication(复制)
redis提供主从复制方案,跟mysql一样增量复制而且复制的实现都很相似,这个复制跟AOF有点类似复制的是新增记录命令,主库新增记录将新增脚本发送给从库,从库根据脚本生成记录,这个过程非常快,就看网络了,一般主从都是在同一个局域网,所以可以说redis的主从近似及时同步,同事它还支持一主多从,动态添加从库,从库数量没有限制。 主从库搭建,我觉得还是采用网状模式,如果使用链式(master-slave-slave-slave-slave·····)如果第一个slave出现宕机重启,首先从master 接收 数据恢复脚本,这个是阻塞的,如果主库数据几TB的情况恢复过程得花上一段时间,在这个过程中其他的slave就无法和主库同步了。

5.更新快
这点好像从我接触到redis到目前为止 已经发了大版本就4个,小版本没算过。redis作者是个非常积极的人,无论是邮件提问还是论坛发帖,他都能及时耐心的为你解答,维护度很高。有人维护的话,让我们用的也省心和放心。

2.1.3.2操作说明
1、 项目类库中添加jedis.jar;

2.1.4现有 Cache 系统
2.1.4.1功能简介
目前业界使用得最多的 Cache 系统主要是 memcached 和 redis。 这两个 Cache 系统都有都有很大的用户群,可以说是比较成熟的解决方案,也是很多系统当然的选择。 不过,在使用 memcached 和 redis 过程中,还是碰到了不少的问题和局限:
集群支持不够。在扩容、负载均衡、高可用等方面存在明显不足。
持久化支持不好,出现问题后恢复的代价大。
memcached 完全不支持持久化,redis 的持久化会造成系统间歇性的负载很高。

2.1.5期待的理想 Cache 系统
2.1.5.1功能简介
良好的集群支持
Key 可以动态分散在不同的服务器上,可以通过动态添加服务器节点增加系统容量。
没有单点失效,任何一个单点都不会造成数据不可访问。
读写负载可以均匀分布在系统的不同节点上。
支持异步持久化支持
方便快速恢复,甚至可以直接用作 key/value 数据库。 经常在跟业界朋友交流时,会提到用 key 分段的方法来做容量扩展以及负载均衡。但是用静态的 key 分段会有不少问题:
Cache 系统本身及使用 cache 的客户端都需要预设一个分段逻辑,这个逻辑后期如果需要调整将会非常困难。不能解决单点失效的问题,还需要额外的手段。运维需要更多的人为参与,避免 key 超出现有分区,一旦出现 key 找不到对应服务器,访问直接失败。
  最接近需求的系统:Couchbase
  
这里写图片描述
Couchbase的最大特点:
1,完全继承Memcache,原生支持所有Memcache操作;
2,继承了Membase的特性,支持集群和数据持久化;
3,继承了CouchDB的文档性质,支持通过View对数据进行操作。这个View的特性,提供了以往memcache所不具备的便利性,但是同Mongodb相比又很简单原始,感觉不是一种普遍需求的功能。

2.1.6Redis和Memcached的比较
Redis和Memcached的比较
Redis使用最佳方式是全部数据。
Redis更多场景是作为Memcached的替代者来使用。
当需要除key/value之外的更多数据类型支持时,Redis更合适。
当存储的数据不能被剔除时,使用Redis更合适。
Redis可以使用指令直接对缓存的数据进行操作。

redis是单线程的,memcached是多线程的,故在多核处理器环境下,memcacahed的性能会更高一些,但是由于redis基本上都是在内存中操作,所以这些性能上的差别几乎可以不计
redis在高级数据类型和持久化方面要比memcached好一些
ehcache直接在jvm虚拟机中缓存,速度快,效率高;但是缓存共享麻烦,集群分布式应用不方便。
redis是通过socket访问到缓存服务,效率比ecache低,比数据库要快很多,处理集群和分布式缓存方便,有成熟的方案。

补充下:ehcache也有缓存共享方案,不过是通过RMI或者Jgroup多播方式进行广播缓存通知更新,缓存共享复杂,维护不方便;简单的共享可以,但是涉及到缓存恢复,大数据缓存,则不合适。

*没有更好,只有更适合。具体要看你的业务场景了。
如果是简单的web应用建议ehcache或Memcached就够了;
如果是互联网应用,存在缓存共享、分布式部署、缓存内容很大的,强烈建议Redis,它支持丰富的数据结构,非常适合互联网应用场景,比如:Feed,计数器,队列,pub/sub等。Redis既可以用来作为Cache,也可当做db。
重要的数据:先存到数据库,然后存到redis
要求响应速度很高的的数据:先写缓存,然后通过消息队列再写入数据库*

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我要修改昵称

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值