RedisTemplate 存取Hash类型的值

3,176 阅读2分钟

为了方便网关统计每天 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<Object,Object> objectMap = redisTemplate.opsForHash().entries(redisKey);
    // 获取需要取的 item 的值
    System.out.println(objectMap.get(path));
    int num = 1;
    if (objectMap == null){
        // 如果redis里无当日的api访问数据,存入redis
        redisTemplate.opsForHash().put(redisKey, path, String.valueOf(num));
    } else {
        if (objectMap.get(path) != null){
            // 如果redis里无当前path的访问数据
            num = Integer.valueOf(objectMap.get(path).toString()) + 1;
            redisTemplate.opsForHash().put(redisKey, path, String.valueOf(num));
        } else {
            redisTemplate.opsForHash().put(redisKey, path, String.valueOf(num));
        }
    }
}

二、存 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<String,Object> pathNumMap = new HashMap<>();
    Map<String,Object> valueRedis = new HashMap<>();
    Map<String,Object> map = new HashMap<>();
    Map<String,Object> 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 进行沟通。