本地缓存,Redis缓存,数据库DB查询(结合代码分析)
问题背景
为什么要使用缓存?本地缓存/Redis缓存/数据库查询优先级?
一、为什么要使用缓存
原因:CPU的速度远远高于磁盘IO的速度
问题:很多信息存在数据库当中的,每次查询数据库就是一次IO操作
所以,提高响应速度,必须减少磁盘IO的操作,缓存就是为了提升系统性能而存在的
二、查询的优先级
1、本地缓存
2、Redis缓存
3、数据库查询
public static List<Content> getContentList(int positionId, String provCode, String areaCode) throws SQLException {
String key_p_p_a = positionId + "_" + provCode + "_" + areaCode;
List<Content> contentList = null;
String strTemp = "|";
StringBuilder cacheLogInfoSb = new StringBuilder("get cache [");
/*判断本地缓存是否存在*/
if (ContentService.MAP_CONTENT_P_P_A.containsKey(key_p_p_a)) {
contentList = ContentService.MAP_CONTENT_P_P_A.get(key_p_p_a);
cacheLogInfoSb.append(strTemp).append(" by cache MAP_CONTENT_P_P_A get List, key:").append(key_p_p_a)
.append(",List.size:").append(contentList.size());
/*判断Reids缓存是否存在*/
}else if (RedisCached.has(key_p_p_a)) {
contentList = (List<Content>) RedisCached.get(key_p_p_a.getBytes());
cacheLogInfoSb.append(strTemp).append(" by xmemcache MAP_CONTENT_P_P_A get List, key:").append(key_p_p_a)
.append(",List.size:").append(contentList.size());
/*数据库查询操作*/
} else {
try {
contentList = dao.getContentList(positionId, provCode, areaCode);
cacheLogInfoSb = new StringBuilder(" cache is not exists,get data by database");
} catch (SQLException e) {
cacheLogInfoSb.append(strTemp).append("SQLException:").append(e.toString());
e.printStackTrace();
throw e;
}
log.info(cacheLogInfoSb.toString() + "]");
log.info("[ContentService]加入缓存key_p_p_a, key:{},contentList.size:{}", key_p_p_a, contentList.size());
/*数据库查询后,将结果写入redis,方便下次查询*/
RedisCached.set(key_p_p_a, contentList, ContentService.Cache_ExPireTime_Day);
} return contentList;
}
三、缓存常用的集合框架以及操作(实际使用得比较多的方法)
使用的MAP集合ConcurrentHashMap
public static Map<String, List<Content>> MAP_CONTENT_P_P_A = new ConcurrentHashMap<String, List<Content>>();
读取本地缓存get()
List<Content> list = ContentService.MAP_CONTENT_P_P_A.get(key);
设置本地缓存put()
ContentService.MAP_CONTENT_P_P_A.put(key_p_p_a, contentList);
定时更新本地/Redis缓存(代码演示)
/** 查询数据库,获取最新数据 **/
Map<String, List<Content>> position_content_map_p_p_a = dao.queryContentListRelateProvCodeAreaCode(positionId);
/** 清除本地缓存 **/
Iterator<String> contentskeysIterPPA = MAP_CONTENT_P_P_A.keySet().iterator();
while (contentskeysIterPPA.hasNext()) {
String key = contentskeysIterPPA.next();
if (key.startsWith(String.valueOf(positionId))) {
removeKeys.add(key);
}
}
/** 清除Redis缓存 **/
for (int i = 0; i < removeKeys.size(); i++) {
String key = removeKeys.get(i);
contentList.addAll(MAP_CONTENT_P_P_A.remove(key));
RedisCached.delete(key);
}
removeKeys.clear();
/** 把最新内容加入MAP_CONTENT_P_P_A缓存 **/
Iterator<String> keysIterppa = position_content_map_p_p_a.keySet().iterator();
while (keysIterppa.hasNext()) {
String key = keysIterppa.next();
reFreshContenList.addAll(position_content_map_p_p_a.get(key));
MAP_CONTENT_P_P_A.putAll(position_content_map_p_p_a);
}
本地缓存,Redis缓存,数据库DB查询(结合代码分析)的更多相关文章
- Mybatis一级缓存和二级缓存 Redis缓存
一级缓存 Mybatis的一级缓存存放在SqlSession的生命周期,在同一个SqlSession中查询时,Mybatis会把执行的方法和参数通过算法生成缓存的键值,将键值和查询结果存入一个Map对 ...
- tp5 数据库Db查询操作
$data = Db::query('select * from tf_action'); $data = Db::query('select * from tf_action where id &g ...
- 使用mybatis实现分页查询示例代码分析
*******************************************分页查询开始*************************************************** ...
- Redis 多级缓存架构和数据库与缓存双写不一致问题
采用三级缓存:nginx本地缓存+redis分布式缓存+tomcat堆缓存的多级缓存架构 时效性要求非常高的数据:库存 一般来说,显示的库存,都是时效性要求会相对高一些,因为随着商品的不断的交易,库存 ...
- 简单的redis缓存操作(get、put)
简单的redis缓存操作(get.put) 本文介绍简单的redis缓存操作,包括引入jedisjar包.配置redis.RedisDao需要的一些工具.向redis中放数据(put).从redis中 ...
- 企业项目开发--分布式缓存Redis
第九章 企业项目开发--分布式缓存Redis(1) 注意:本章代码将会建立在上一章的代码基础上,上一章链接<第八章 企业项目开发--分布式缓存memcached> 1.为什么用Redis ...
- 高并发架构系列:Redis缓存和MySQL数据一致性方案详解
一.需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景, ...
- Redis缓存和MySQL数据一致性方案(转)
需求起因 在高并发的业务场景下,数据库大多数情况都是用户并发访问最薄弱的环节.所以,就需要使用redis做一个缓冲操作,让请求先访问到redis,而不是直接访问MySQL等数据库. 这个业务场景,主要 ...
- redis缓存击穿问题一种思路分享
思路每一个key都有一个附属key1,附属key1可以是key加特定前缀组成,key对应value为真正的缓存数据,附属key1对应的value不重要,可以是随便一个值,附属key1的作用主要是维护缓 ...
随机推荐
- 爬虫系列(1)-----python爬取猫眼电影top100榜
对于Python初学者来说,爬虫技能是应该是最好入门,也是最能够有让自己有成就感的,今天在整理代码时,整理了一下之前自己学习爬虫的一些代码,今天先上一个简单的例子,手把手教你入门Python爬虫,爬取 ...
- centos7 安装docker
1.首先cent7 基本是在vm上完全安装'. 2.参考官方网站安装 1.https://wiki.centos.org/AdditionalResources/Repositories OS req ...
- 可空类型 Nullable<T>
Nullable<T> 内部实现了显示和隐式转换 显示转换: public static explicit operator T(T? value) { return value.Valu ...
- tomcat-theory
(一) java类:applet,servlet,jsp JSP:.jsp-->.java-->(JVM).classJDK:javac,.java-->.classweb:Serv ...
- HTTP协议扫盲(七)请求报文之 GET、POST-FORM 和 POST-FILE
一.get 1.页面代码 2.请求报文 3.小结 get请求没有报文体,所以请求报文没有content-type url上的query参数param11=val11¶m12=val12 ...
- MySql入门(2-2)创建数据库
mysql -u root -p; show databases; create database apigateway; use apigateway; show tables;
- ssh_maven之controller层开发
我们已经完成了前两层的开发,现在 只剩下我们的controller层了,对于这一层,我们需要创建一个动作类CustomerAction,另外就是我们的strutss.xml以及我们的applicati ...
- 将Tomcat添加进服务启动
tomcat有解压版和安装版2种版本,安装版已经做好了将tomcat添加进服务的操作,而解压版需要我们自己来实现,应用场景主要是在服务器端需要在服务器启动时就启动tomcat. 1.首先需要配置好jd ...
- React-Native(四):React Native之View学习
React Native实现以下布局效果:携html5(http://m.ctrip.com/html5/) 基于HelloWord修改项目代码: /** * Sample React Native ...
- python json.dumps 中的ensure_ascii 参数引起的中文编码问题
在使用json.dumps时要注意一个问题 >>> import json >>> print json.dumps('中国') "\u4e2d\u5 ...