Java缓存

什么是缓存

1 数据交换的缓冲区(Cache)当当某一硬件要读取数据时,会首先从缓存中查询数据,有则直接执行,不存在时从磁盘中获取

2缓存往往使用的是RAM(断电既掉的非永久存储),所以在用完后还是会把文件送到硬盘等存储器中永久存储。

3高速缓存是用来协调CPU与主存之间存取速度的差异而设置的。

4缓存就是把一些外存上的数据保存在内存上而已


为什么用缓存?

高性能:减少查询同一个数据时的响应速度
高并发:减少数据库的承载压力(2000/s),缓存走内存,天然支撑高并发


缓存的不良后果:

缓存与数据库的双写不一致
缓存雪崩
缓存穿透
缓存并发竞争

如何防止缓存穿透、缓存击穿、缓存雪崩和缓存刷新。

【1】缓存穿透:缓存穿透是说收到一个请求,但是该请求缓存中不存在,只能去数据库中查询,然后放进缓存。但当有好多请求同时访问同一个数据时,业务系统把这些请求全发到了数据库;或者恶意构造一个逻辑上不存在的数据,然后大量发送这个请求,这样每次都会被发送到数据库,最终导致数据库挂掉。
【解决的办法】:对于恶意访问,一种思路是先做校验,对恶意数据直接过滤掉,不要发送至数据库层;第二种思路是缓存空结果,就是对查询不存在的数据也记录在缓存中,这样就可以有效的减少查询数据库的次数。非恶意访问,结合缓存击穿说明。
【2】缓存击穿:上面提到的某个数据没有,然后好多请求查询数据库,可以归为缓存击穿的范畴:对于热点数据,当缓存失效的一瞬间,所有的请求都被下放到数据库去请求更新缓存,数据库被压垮。
【解决的办法】:防范此类问题,一种思路是加全局锁,就是所有访问某个数据的请求都共享一个锁,获得锁的那个才有资格去访问数据库,其他线程必须等待。但现在大部分系统都是分布式的,本地锁无法控制其他服务器也等待,所以要用到全局锁,比如 Redis的 setnx实现全局锁。另一种思想是对即将过期的数据进行主动刷新,比如新起一个线程轮询数据,或者比如把所有的数据划分为不同的缓存区间,定期分区间刷新数据。第二个思路与缓存雪崩有点关系。
【3】缓存雪崩:缓存雪崩是指当我们给所有的缓存设置了同样的过期时间,当某一时刻,整个缓存的数据全部过期了,然后瞬间所有的请求都被抛向了数据库,数据库就崩掉了。
【解决的办法】:解决思路要么是分治,划分更小的缓存区间,按区间过期;要么给每个 key的过期时间加一个随机值,避免同时过期,达到错峰刷新缓存的目的。保险一些,可以加一些服务熔断降级的逻辑,以及本地缓存

对于 Redis 挂掉了,请求全部走数据库,也属于缓存雪崩,我们可以有以下思路进行解决:
事发前:实现 Redis 的高可用(主从架构+Sentinel 或者 Redis Cluster),尽可能避免 Redis 挂掉这种情况。
事发中:万一 Redis 真的挂了,我们可以设置本地缓存(ehcache)+ 限流(hystrix),尽量避免我们的数据库被干掉。
事发后:Redis 持久化,重启后自动从磁盘上加载数据,快速恢复缓存数据。

Redis单线程模型为什么效率高?

纯内存操作(事件处理器在内存操作,性能高1ms)
核心基于非阻塞IO多路复用机制(不处理、直接压队列)
单线程避免了多线程的频繁上下文切换问题

分布式缓存的典型应用场景?

  • 页面缓存,用来缓存Web页面的内容片段,包括HTML、CSS 和图片等,多应用于社交网站等。

  • 应用对象缓存,缓存系统作为ORM框架的二级缓存对外提供服务,目的是减轻数据库的负载压力,加速应用访问。

  • 状态缓存,缓存包括Session会话状态及应用横向扩展时的状态数据等,这类数据一般是难以恢复的,对可用性要求较高,多应用于高可用集群。

  • 并行处理,通常涉及大量中间计算结果需要共享。

  • 事件处理,分布式缓存提供了针对事件流的连续查询(continuous query)处理技术,满足实时性需求。

  • 极限事务处理,分布式缓存为事务型应用提供高吞吐率、低延时的解决方案,支持高并发事务请求处理,多应用于铁路、金融服务和电信等领域。

 

Redis主从复制、哨兵和集群这三个的区别是什么?

主从模式:读写分离,备份,一个Master可以有多个Slaves。

哨兵sentinel:监控,自动转移,哨兵发现主服务器挂了后,就会从slave中重新选举一个主服务器

  • 哨兵的作用:
    1. 集群监控,负责监控redis master和slave进程是否正常工作
    2. 消息通知,如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员
    3. 故障转移,如果master node挂掉了,会自动转移到slave node上
    4. 配置中心,如果故障转移发生了,通知client客户端新的master地址

集群:为了解决单机Redis容量有限的问题,将数据按一定的规则分配到多台机器,内存/QPS不受限于单机,可受益于分布式集群高扩展性。

 

Redis重启数据恢复(数据持久化)

持久化的意义:数据备份、故障恢复
两种持久化:RDB、AOF
RDB:对Redis中数据执行周期性的持久化
AOF:对于每条写入命令作为日志,以append-only模式写入一个日志文件中(更加完整)
Redis重启后,通过回放AOF日志中的指令重新构建数据集
AOF大到一等程度后,rewrite操作,构建更小的AOF文件


RDB优劣势:
优点:(冷备)
生成多个数据文件,适合冷备。AOF需要写脚本处理。
RDB对Redis性能影响小,fork子进行进行RDB持久化
RDB重启恢复速度快
缺点:
恢复效果差,数据丢失
fork子进程时,数据文件特别大,会对客户端服务暂停数毫秒


AOF优劣势:
优点:
保护数据不丢失
append-only写入,没有磁盘寻址开销,写入性能高,文件不易损坏
AOF日志文件过大rewrite对客户端读写性能影响小
日志文件可读
缺点:
日志文件大
支持的写QPS低
健壮性低


结合RDB和AOF同时使用

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值