本文介绍: 对于热点数据,想将百万数量级的数据存储到redis中的实现思路
一、需求描述
项目中需要查询用户对应的地市信息,这些数据是存储在mysql数据库中,并且数据量是百万级别,查询频率高,所以想将需要查询的字段存储到redis中,来提高查询速度
二、需求分析
对redis数据预热,一般思路就通过mysql将数据查询出来,然后遍历存储到redis中。
注意点:
1、因为数据量大,不要直接将所有数据查询出来然后遍历存储,因为大数据量数据全部缓存在服务器内存中会导致内存溢出报错;
解决方式: 分页读取数据,循环遍历直到最后一页
以下是分页读取和数据存储代码
int i=0;
while (true){
String sql =" select userid,CITYCODE from tb_tc_orderuser_bycity limit "+i+",5000";
List<Tcorderinfo> datalist = new ArrayList<>();
try {
datalist = jdbcTemplate.query(sql, Tcorderinfo.class);
if (datalist!=null && datalist.size() >0){
i=i+datalist.size();
}else {
break;
}
} catch (Exception e) {
logger.error("查询用户的数据失败");
}
for (Tcorderinfo one : datalist) {
stringRedisTemplate.opsForValue().set("userCity:"+one.getUserid(),one.getCitycode());
}
logger.info("已存入{}数据",i);
datalist.clear();
}
上述方式是通过stringRedisTemplate.opsForValue().set方法将数据一条条插入redis中的。
虽然能正常执行了,但是一条条的存储到redis中是相当耗时的,统计了一下,一分钟只能存储500左右的数据量,显然不可行
优化方案:
redis中有一个叫管道的概念,简单概括,就是可以数据先存储到管道中,然后一起推到redis缓存中,这样可以大大提高存储效率
int i=0;
while (true){
String sql =" select userid,CITYCODE from tb_tc_orderuser_bycity limit "+i+",5000";
List<Tcorderinfo> datalist = new ArrayList<>();
try {
datalist = jdbcTemplate.query(sql, Tcorderinfo.class);
if (datalist!=null && datalist.size() >0){
i=i+datalist.size();
}else {
break;
}
} catch (Exception e) {
logger.error("查询用户的数据失败");
}
for (Tcorderinfo one : datalist) {
batchStoreStringsUsingConnection(datalist);
}
logger.info("已存入{}数据",i);
datalist.clear();
}
public void batchStoreStringsUsingConnection(List<Tcorderinfo> datalist) {
stringRedisTemplate.executePipelined((RedisCallback<Void>) connection -> {
RedisSerializer<String> stringSerializer = stringRedisTemplate.getStringSerializer();
for (Tcorderinfo one : datalist) {
String key = "userCity:"+one.getUserid();
String value = one.getCitycode();
connection.set(stringSerializer.serialize(key), stringSerializer.serialize(value));
}
return null;
});
}
将存储方式改为管道存储,分页大小设置为50000,10秒能执行一次循环,也就是10秒能向redis存储5w数据,十分钟可以存储百万数据量,可实现redis数据预热。
原文地址:https://blog.csdn.net/weixin_43986850/article/details/135982628
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_64469.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。