为了方便网关统计每天 api 访问网关的次数,这里写了一个方法来统计,并将统计数据存入 redis 服务器里,方便读取。
今天讲的是两个方法,一个是存 HashMap 的方式,另外一个是存 Hash 的方式。
一、存 Hash 的方式
使用的是 redisTemplate.opsForHash().put(redisKey, item, value); 这个方法。
释义:
1、存入 redis 的主键
2、item 每个 hash 的 key
3、value 对应 key 的值
代码:
/**
* @Description: api访问次数计数存入redis(存入Hash)
* @Param: path 访问路径
* @return:
* @Author: ma.kangkang
* @Date: 2019/11/6
*/
public void addPathNumHash(String path){
// key序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
//val实例化
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
// 当前日期
Date today = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 当前年月日
String todayStr = sdf.format(today).replace("-","");
String redisKey = "apiVisitNum_".concat(todayStr);
// 获取redis
Map
二、存 HashMap 的方式
使用的是 redisTemplate.opsForValue().set(redisKey, pathNumMap); 方法。
释义:
1、rediskey 存入的 redis 的键
2、pathNumMap 存入的 redis 的值(hashMap)
代码:
/**
* @Description: api访问次数计数存入redis(存入HashMap)
* @Param: path 访问路径
* @return:
* @Author: ma.kangkang
* @Date: 2019/11/5
*/
public void addPathNumHashMap(String path){
// key序列化
redisTemplate.setKeySerializer(new StringRedisSerializer());
//val实例化
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
PathNum pathNum = new PathNum();
Map pathNumMap = new HashMap<>();
Map valueRedis = new HashMap<>();
Map map = new HashMap<>();
Map mapAll = new HashMap<>();
// 当前日期
Date today = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
// 当前年月日
String todayStr = sdf.format(today).replace("-","");
String redisKey = "apiVisitNum_".concat(todayStr);
// 获取redis缓存,转换为Map
Object object = redisTemplate.opsForValue().get(redisKey);
JSONObject json = (JSONObject) JSON.toJSON(object);
if (json != null){
// redis里之前的缓存
map = JSON.parseObject(JSON.parse(json.toString()).toString());
mapAll.putAll(map);
}
if (json != null && json.get(path) != null){
pathNum = JSON.parseObject(JSON.parse(json.get(path).toString()).toString(),PathNum.class);
}
if (pathNum.getPath() != null ){
valueRedis.put("path",pathNum.getPath());
// 如果存在这个path,直接加访问次数
valueRedis.put("num",pathNum.getNum() + 1);
map.put(path,valueRedis);
mapAll.putAll(map);
JSONObject json1 =new JSONObject(mapAll);
System.out.println(json1);
redisTemplate.opsForValue().set(redisKey, mapAll);
} else {
// 如果redis中没有这个path,说明redis里无当前key,存入redis
valueRedis.put("path",path);
valueRedis.put("num","1");
pathNumMap.put(path,valueRedis);
if (json != null){
// redis不为null,追加map到redis
mapAll.putAll(pathNumMap);
redisTemplate.opsForValue().set(redisKey, mapAll);
} else {
redisTemplate.opsForValue().set(redisKey, pathNumMap);
}
}
}
相对来说,存 Hash 的方式更为简单,但是redis服务器显示的是二进制的数据, 而存 HashMap 的方式存入的是一个Map,redis服务器显示的时候显示的是我们俗说的 UTF-8 格式的内容。
这时候就需要看个人需要了,但是取的时候都是可以正常取出来想要的 UTF-8 格式的数据的。
我是进阶的球儿,大家一起2019年的爬坑历程。感觉分享很给力的话给个赞,谢谢!!!有问题也可以下方留言或者加本人QQ:313989006 进行沟通。