RedisTemplate 存取Hash类型的值

  • Post author:
  • Post category:其他


为了方便网关统计每天 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 进行沟通。



版权声明:本文为qq_39415129原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。