一、常见的两种缓存redis
- 本地缓存:不须要序列化,速度快,缓存的数量与大小受限于本机内存
- 分布式缓存:须要序列化,速度相较于本地缓存较慢,可是理论上缓存的数量与大小无限(由于缓存机器能够不断扩展)
二、本地缓存算法
- Google guava cache:当下最好用的本地缓存
- Ehcache:spring默认集成的一个缓存,以spring cache的底层缓存实现类形式去操做缓存的话,很是方便,可是欠缺灵活,若是想要灵活使用,仍是要单独使用Ehcache
- Oscache:最经典简单的页面缓存
三、分布式缓存spring
- memcached:分布式缓存的标配
- Redis:新一代的分布式缓存,有替代memcached的趋势
3.一、memcached缓存
- 经典的一致性hash算法
- 基于slab的内存模型有效防止内存碎片的产生(但同时也须要估计好启动参数,不然会浪费不少的内存)
- 集群中机器之间互不通讯(相较于Jboss cache等集群中机器之间的相互通讯的缓存,速度更快<--由于少了同步更新缓存的开销,且更适合于大型分布式系统中使用)
- 使用方便(这一点是相较于Redis在构建客户端的时候而言的,尽管redis的使用也不困难)
- 很专注(专作缓存,这一点也是相较于Redis而言的)
3.二、Redis数据结构
- 能够存储复杂的数据结构(5种)
- strings-->即简单的key-value,就是memcached能够存储的惟一的一种形式,接下来的四种是memcached不能直接存储的四种格式(固然理论上能够先将下面的一些数据结构中的东西封装成对象,而后存入memcached,可是不推荐将大对象存入memcached,由于memcached的单一value的最大存储为1M,可能即便采用了压缩算法也不够,即便够,可能存取的效率也不高,而redis的value最大为1G)
- hashs-->看作hashTable
- lists-->看作LinkedList
- sets-->看作hashSet,事实上底层是一个hashTable
- sorted sets-->底层是一个skipList
- 有两种方式能够对缓存数据进行持久化
- 事件调度
- 发布订阅等
四、集成缓存jsp
专指spring cache,spring cache本身继承了ehcache做为了缓存的实现类,咱们也可使用guava cache、memcached、redis本身来实现spring cache的底层。固然,spring cache能够根据实现类来将缓存存在本地仍是存在远程机器上。分布式
五、页面缓存memcached
在使用jsp的时候,咱们会将一些复杂的页面使用Oscache进行页面缓存,使用很是简单,就是几个标签的事儿;可是,如今通常的企业,前台都会使用velocity、freemaker这两种模板引擎,自己速度就已经很快了,页面缓存使用的也就不多了。spa
总结:对象
- 在实际生产中,咱们一般会使用guava cache作本地缓存+redis作分布式缓存+spring cache就集成缓存(底层使用redis来实现)的形式
- guava cache使用在更快的获取缓存数据,同时缓存的数据量并不大的状况
- spring cache集成缓存是为了简单便捷的去使用缓存(以注解的方式便可),使用redis作其实现类是为了能够存更多的数据在机器上
- redis缓存单独使用是为了弥补spring cache集成缓存的不灵活
- 就我我的而言,若是须要使用分布式缓存,那么首先redis是必选的,由于在实际开发中,咱们会缓存各类各样的数据类型,在使用了redis的同时,memcached就彻底能够舍弃了,可是如今还有不少公司在同时使用memcached和redis两种缓存。
在本系列接下来的介绍中,会介绍在分布式状况下guava cache、memcached、redis、spring cache的使用与原理。
疑问:
- memcached相较于redis而言,有什么优势?(若是有大神了解这一块,请指点一下)