秒懂Redis:Hash 数据类型

  1. 需求:
    1. 使用 redis 存储用户详细信息:
      {
      "birthday":1557743055507,
      "ename":"zhangsan",
      "districtId":2,
      "sex":1,"id":1,
      "edate":1557743055507,
      "age":18,"sal":8000.0
      }
  2. 使用 string 类型的问题:
    1. 假设有 user 对象以 JSON 序列化的存储到 Redis 中,User 对象有 id、username、password 等属性
    2. 当业务上只修改 age 属性,不修改其他属性,使用 string 传输和处理时会造成资源浪费
  3. hash 介绍:
    1. hash 叫散装队列,它提供了字段和字段值的映射
    2. 字段值只能是字符串类型,不支持散装类型、集合类型
  4. 命令:
    1. 赋值与取值:
      hset key field value    #一次只能设置一个值
      hget key field value    #一次只能获取一个 key
      
      hmset key field value field value     #一次可以设置多个值
      hmget key field  field     #一次可以获取多个字段值
      
      hgetall    #获取所有字段值
      1. 设置单个值:
      2. 设置多个值:
      3. 获取所有值:
    2. 判断字段是否存在
      hexists key  field    #判断字段是否存在
      
      hsetnx key field value    #当字段不存在时赋值,当字段存在时不进行任何操作
    3. 删除字段:
      1. 可以删除一个或多个字段,返回值是被删除的字段个数
        hdel key  field  field …    #删除一个或多个字段
    4. 只获取字段名或字段值:
      hkeys key    #获取所有字段名
      
      hvals key    #获取所有字段值
    5. 获取字段数量:
      hlen  key     #获取字段数量
  5. 应用:
    package com.qcby.config.test;
    
    import com.qcby.config.RedisUtil;
    import org.junit.Test;
    import redis.clients.jedis.Jedis;
    
    import java.util.*;
    
    public class HashTest {
    
        @Test
        public void testHash(){
            Jedis jedis = RedisUtil.getJedis();
            try {
                Map<String,String> pairs = new HashMap<>();
                pairs.put("name","张三");
                pairs.put("age","23");
                pairs.put("sex","男");
                jedis.hmset("kid",pairs);
                System.out.println("Map 中 name:" + jedis.hmget("kid","name"));
    
                //删除 map 中的某个键
                jedis.hdel("kid","age");
                //此时应返回 null
                System.out.println("获取已经删除的 age:" + jedis.hmget("kid","age"));
    
                //返回键中存放值的个数
                System.out.println("kid 中值的个数:" + jedis.hlen("kid"));
                System.out.println("kid 是否为 user:" + jedis.exists("kid"));
                System.out.println("所有 key:" + jedis.hkeys("kid"));
                System.out.println("所有vallue:" + jedis.hvals("kid"));
    
                Iterator<String> iterator = jedis.hkeys("kid").iterator();
                while (iterator.hasNext()){
                    System.out.println(iterator.next() + ":" + jedis.hmget("kid",iterator.next()));
                }
    
                List<String> values = jedis.lrange("messages",0,-1);
                values = jedis.hmget("ked",new String[] {"name","age","sex"});
                System.out.println("List 列表:" + values);
    
                Set<String> setValue = jedis.zrange("hackers",0,-1);
                setValue = jedis.hkeys("kid");
                System.out.println("Set 列表:" + setValue);
    
                pairs = jedis.hgetAll("kid");
                System.out.println("pairs:" + pairs);
    
                //清空数据
                System.out.println("清空数据:" + jedis.flushDB());
    
                //添加数据
                jedis.hset("hashs","entryKey","entryValue");
                jedis.hset("hashs","entryKey2","entryValue2");
                jedis.hset("hashs","entryKey3","entryValue3");
    
                System.out.println("判断 entryKey 值是否存在:" + jedis.hexists("hashs","entryKey"));
    
                //获取指定的值
                System.out.println("获取指定的值:" + jedis.hmget("hashs","entryKey"));
                System.out.println("批量获取指定的值:" + jedis.hmget("hashs","entryKey","entryKey1"));
    
                //删除指定的值
                System.out.println("删除 entryKey:" + jedis.del("hashs","entryKey"));
    
                System.out.println(" field 域增量:" + jedis.hincrBy("hashs","entryKey",133l));
    
                System.out.println("获取所有的 keys:" + jedis.hkeys("hashs"));
    
                System.out.println("获取所有的 values:" + jedis.hvals("hashs"));
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                RedisUtil.closeJedis(jedis);
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值