接口高并发的解决思路:
-
加缓存
-
数据静态化
-
集群
-
分布式
-
同步转异步
-
限流、降级
适合加缓存的场景:
-
读多写少的数据,不经常需要修改的数据、一致性要求不高(数据只能保持最终一致性,不能保证数据同步一致性)
缓存的概念
1)外存
外存储器是指除计算机内存及CPU缓存以外的存储器,断电后仍然能保存数据。常用的有硬盘、u盘等。
2)内存
内存是计算机组成部分。被称为内存存储器,其作用是暂时存放CPU运算数据,以及与外存之间交互的存储器。只要计算机在运行中,CPU就会把需要运算的数据读到内存中,当运算完成后CPU在将运算结果写到外存中。断电后数据就会清空,常用的有内存条。
3)缓存
缓存就是介于内存和外存之间的存储,加快内存和外存之间的数据交互。软件中间件一般用外部计算机内存当缓存。
4)缓存的指标
1)缓存命中率
从缓存中读取数据的次数与总读取次数的比率,命中率越高越好。
2)缓存更新策略
如果缓存满了,从缓存中清除数据的策略。常见的有:LFU、LRU、FIFO
-
LRU(Least Recently Used):最久未使用算法,使用时间距离现在最久的那个被移除。
-
LFU(Least Frequencyly Used):最少使用算法,一定时间使用次数最少的那个被移除。
-
FIFO(First In First Out):先进先出算法,先放入缓存的先被移除。
Redis缓存在Java中的实现
在java代码中,我们一般对调用的方法进行缓存控制,比如我要查询具体的省市区县数据,findProvidenceAndCityAndArea(String id)
,那么我们应该在调用这个方法之前先从缓存中查找有没有这个数据,如果没有在调用该方法从数据库中查询,然后添加到缓存中去;下次接口调用时将会从缓存直接获取数据。Java中使用分布式缓存Redis。
1)缓存逻辑流程图
查询策略:
修改策略:
2)逻辑流程代码
查询代码:
/**
* 使用缓存,根据省份ID获取省市数据
* @param provinceid
* @return
*/
@Override
public Provinces detail(String provinceid) {
Provinces provin