Redis操作哈希结构数据

程序员考拉

共 2026字,需浏览 5分钟

 ·

2020-08-12 10:39


今天带来的是Redis操作Hash。总体上来讲与操作字符串的方式基本相同。hash类似于java中的map,存储的基本上都是String类型的key和value的键值对,在内存足够大的情况下,一个hash结构可以存储2的32次方-1个键值对。但是需要注意的是,由于 redis是一个内存数据库, 所有数据基本上都存在于内存当中, 会定时以追加或者快照的方式刷新到硬盘中。所以当我们读取大量数据的时候,我们要考虑到对JVM内存的影响。 


同时在接下来我们的操作中我们会看到,Redis对hash 的操作与对字符串的操作相比,都会多一个hash名作为参数,这是需要注意的。


Redis存hash数据


添加整个Hash 


@RequestMapping("hmset")
    @ResponseBody
    public Map<String,Object> hmset(){
        Map<String,Object> map = new HashMap<>();
        map.put("f1","value1");
        map.put("f2","value2");
        stringRedisTemplate.opsForHash().putAll("hash",map);
        return  map;
    }


由于此时我们存取的都是String类型的数据,所以我使用的依然是StringRedisTemplete,上述操作完成后在可视化工具中可见



向已经存在的hash结构中添加或修改数据  


@RequestMapping("hset")
    @ResponseBody
    public Map<String,Object> hset(){
        Map<String,Object> map = new HashMap<>();
        stringRedisTemplate.opsForHash().put("hash","f1","new value1");
        return  map;
    }



可以看到数据已经被修改


为hash添加数据  


@RequestMapping("hsetnx")
    @ResponseBody
    public void hsetnx(){
        Boolean success = stringRedisTemplate.opsForHash().putIfAbsent("hash","f5","9");
        System.out.println(success);
    }


putIfAbsent表示如果已经存在对应的key则不会添加,没有对应的key则添加,如图



判断Hash结构中是否有输入的key  


@RequestMapping("hexsit")
    @ResponseBody
    public void hexsit(){
      Boolean exsit = stringRedisTemplate.opsForHash().hasKey("hash","f3");
      System.out.println(exsit);
    }


根据我们插入的数据,最后控制台输出了false


获取hash中的所有键值对   


@RequestMapping("hgetall")
    @ResponseBody
    public Map<Object,Object> hgetall(){
       Map<Object,Object> map= stringRedisTemplate.opsForHash().entries("hash");
        return  map;
    }


结果可见如图



hash实现加法


@RequestMapping("hincrby")
    @ResponseBody
    public void hincrby(){
        stringRedisTemplate.opsForHash().put("hash","f4","8");
         Long f4 = stringRedisTemplate.opsForHash().increment("hash","f4",6);
         System.out.println(f4);
    }



hash实现获取所有key的值 


@RequestMapping("hvals")
    @ResponseBody
    public void hvals()
{
        List list = stringRedisTemplate.opsForHash().values("hash");
        for (int i =0;i<list.size();i++){
            System.out.println(list.get(i));
        }
    }


可见控制台输出



hash实现 删除元素  


@RequestMapping("hdel")
    @ResponseBody
    public void hdel(){
        //返回真实删除的个数
        Long count = stringRedisTemplate.opsForHash().delete("hash","f2","f3");
        System.out.println(count);//此处返回1
    }


此时数据库中不存在f3,控制台中输出了1.


出处:csdn.net/u011342403/article/details/79080968


浏览 100
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报