java 常用缓存描述


好记忆不如烂笔头,记下点东西,有时候翻翻看还是蛮有好处的。


前记



在面试他人的时候,总会去问些关于缓存的问题,都用过哪些,答案都不够全面,现在有时间,就统一罗列下.




1、常见的缓存分类



1.1本地缓存:


不需要序列化,速度快,缓存的数量与大小受限于本机内存
1.2分布式缓存:


需要序列化,速度相较于本地缓存较慢,但是理论上缓存的数量与大小无限(因为缓存机器可以不断扩展)


2、本地缓存简述



ShiftOne : Java Object Cache是一个执行一系列严格的对象缓存策略的Java lib,就像一个轻量级的配置缓存工作状态的框架。
JCache:是个开源程序,正在努力成为JSR-107开源规范,JSR-107规范已经很多年没改变了。这个版本仍然是构建在最初的功能定义上。
SwarmCache :是一个简单且有效的分布式缓存,它使用IP multicast与同一个局域网的其他主机进行通讯,是特别为集群和数据驱动web应用程序而设计的。
Whirlycache :是一个快速的、可配置的、存在于内存中的对象的缓存。
Google guava cache:比较好用的本地缓存。。
Ehcache :spring默认集成的一个缓存,以spring cache的底层缓存实现类形式去操作缓存的话,非常方便,但是欠缺灵活,如果想要灵活使用,还是要单独使用Ehcache。
Oscache :最经典简单的页面缓存(JSP,HTTP)。
Voldemort :是一款基于Java开发的分布式键-值缓存系统,像JBoss Cache一样,Voldemort同样支持多台服务器之间的缓存同步,以增强系统的可靠性和读取性能。


3、分布式缓存简述



JSC(Java Caching system)是一个用分布式的缓存系统,是基于服务器的java应用程序。它是通过提供管理各种动态缓存数据来加速动态web应用。
SwarmCache是一个简单且有效的分布式缓存,它使用IP multicast与同一个局域网的其他主机进行通讯,是特别为集群和数据驱动web应用程序而设计的。
Cacheonix :同样也是一个基于Java的分布式集群缓存系统,它同样可以帮助你实现分布式缓存的部署。
memcached:分布式缓存的标配(http://blog.youkuaiyun.com/supingemail/article/details/18148905)。
Redis:新一代的分布式缓存,有替代memcached的趋势(目前是最好使用的,使用最广泛的分布式缓存)。


4、memcached简介



经典的一致性hash算法
基于slab的内存模型有效防止内存碎片的产生(但同时也需要估计好启动参数,否则会浪费很多的内存)
集群中机器之间互不通信(相较于Jboss cache等集群中机器之间的相互通信的缓存,速度更快<--因为少了同步更新缓存的开销,且更适合于大型分布式系统中使用)
使用方便(这一点是相较于Redis在构建客户端的时候而言的,尽管redis的使用也不困难)
很专一(专做缓存,这一点也是相较于Redis而言的)


5、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
有两种方式可以对缓存数据进行持久化
RDB
AOF
事件调度
发布订阅等


6、集成缓存常用



专指spring cache,spring cache自己继承了ehcache作为了缓存的实现类,我们也可以使用guava cache、memcached、redis自己来实现spring cache的底层。当然,spring cache可以根据实现类来将缓存存在本地还是存在远程机器上。




7、页面缓存常用



在使用jsp的时候,我们会将一些复杂的页面使用Oscache进行页面缓存,使用非常简单,就是几个标签的事儿;但是,现在一般的企业,前台都会使用velocity、freemaker这两种模板引擎,本身速度就已经很快了,页面缓存使用的也就很少了。




8.总结





在实际生产中,我们通常会使用guava cache做本地缓存+redis做分布式缓存+spring cache就集成缓存(底层使用redis来实现)的形式
guava cache使用在更快的获取缓存数据,同时缓存的数据量并不大的情况
spring cache集成缓存是为了简单便捷的去使用缓存(以注解的方式即可),使用redis做其实现类是为了可以存更多的数据在机器上
redis缓存单独使用是为了弥补spring cache集成缓存的不灵活
就我个人而言,如果需要使用分布式缓存,那么首先redis是必选的,因为在实际开发中,我们会缓存各种各样的数据类型,在使用了redis的同时,memcached就完全可以舍弃了,但是现在还有很多公司在同时使用memcached和redis两种缓存。
 

### Java常用缓存中间件 在Java领域,常见的缓存中间件有多种选择。这些工具主要用于提高系统的响应速度和减少数据库的压力。 #### Redis Redis 是一种基于内存的数据结构存储系统,它支持字符串、哈希、列表等多种数据结构的操作[^1]。其主要特点是高性能读写能力、丰富的功能集以及良好的扩展性。通过持久化选项(如 RDB 和 AOF),Redis 能够提供可靠的数据保护机制,在分布式环境中也表现出色。 ```java // 使用Jedis操作Redis的一个简单例子 import redis.clients.jedis.Jedis; public class RedisExample { public static void main(String[] args) { Jedis jedis = new Jedis("localhost"); jedis.set("foo", "bar"); String value = jedis.get("foo"); System.out.println(value); // 输出 bar } } ``` #### Memcached Memcached 提供了一个简单的键值对缓存解决方案,适用于那些只需要快速访问少量临时数据的应用程序场景[^2]。相比起 Redis 来说,它的功能较为单一,缺乏事务支持或者复杂查询的能力;但是由于设计上的简化,使得它拥有更高的吞吐率和服务效率。 --- ### Java常用消息中间件及其技术选型考量因素 正如前面提到的内容所描述那样,不同的业务需求决定了应该选用哪一类的消息中间件产品。下面列举了几种主流方案并分析它们各自的优劣之处: #### Kafka Kafka 设计之初就考虑到了日志收集与流式处理的需求,因此非常适合用于构建实时数据分析平台或事件驱动架构下的大规模数据管道建设工作之中[^3]。尽管如此,如果项目更关注的是单条消息传递的成功与否而非整体吞吐表现的话,则可能需要重新评估是否继续坚持采用该框架作为首选项之一。 - **优点**: 极高的吞吐量, 支持批量发送接收. - **缺点**: 对于小规模应用场景可能会显得过于重量级. #### RocketMQ 由阿里巴巴开源出来的 RocketMQ 结合了传统 MQ 的诸多特性同时还引入了一些创新性的改进措施来满足电商促销期间突发流量冲击的要求[^4]. 它特别强调了顺序消息投递的重要性,并且提供了灵活的重试策略以便应对各种异常情况的发生。 - **优势**: 高度可靠的传输保障; 即使在网络分区的情况下也能维持服务连续运行. - **劣势**: 初次学习成本相对较高一些. #### RabbitMQ 最后要介绍的就是广受欢迎的 AMQP 实现——RabbitMQ 。凭借易用性和强大的路由功能赢得了众多开发者的好评。不过需要注意的是当面临海量并发连接请求时其资源消耗会显著增加从而影响到整个集群的表现水平。 - **亮点**: 易于集成现有的企业 IT 系统 ; 多样化的交换器类型可供挑选 . - **局限性**: 如果追求极致的速度指标那么或许不是最佳拍档 . 综上所述 , 在实际工程实践中应当依据具体问题背景综合权衡各个维度之后再做出最终决定 .
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值