Redis中常用的五大数据类型的介绍以及代码的实现

一.五大数据类型的介绍

String:字符串
二进制安全的,可以包含任何数据,包括jpg图片或者序列化对象
字符串value长度不能超过512MB
Hash:哈希
类似java中Map,就是一个键值对集合
特别适合存储对象
List:列表
简单的字符串列表,按照插入顺序排序
底层是一个链表,便插入和删除
SET:集合
String类型的无序结合
集合中绝对不可能出现重复元素
可完成Sets之间的聚合操作
ZSET:有序集合
和Set一样也是String类型元素的集合,并且不能出现重复成员
每个成员会关联一个Double类型分数,通过分数来为集合中的成员进行从小到大的排序

成员是唯一的,但是分数可以重复

二.代码实现

String代码实现:

public class stringDemo {
public static Jedis jedis = JedisPoolUtil.getJedis();
/*
添加和获取
 */
@Test
public void fun(){
    jedis.set("num","1");
    System.out.println(jedis.get("num"));
}
//删除值
@Test
    public void fun1(){
    jedis.del("num");
        System.out.println(jedis.get("num"));
    }
    //自减和自增
    @Test
    public void fun2(){
        jedis.set("num","1");
        System.out.println(jedis.get("num"));
        jedis.decr("num");
        System.out.println(jedis.get("num"));
        jedis.incr("num");
        jedis.incr("num");
        System.out.println(jedis.get("num"));
    }
    /*
    加上/减去  一个数
    incrby
    返回的是修改之后的值如果原值是字符串不是数字,则会抛出异常
     */
    @Test
    public void fun3(){
        Long num = jedis.incrBy("numm",3);
        System.out.println(num);
        jedis.decrBy("num",10);
        System.out.println(jedis.get("num"));
        jedis.set("name","zhangjie");
        //jedis.decrBy("name",1);
    }
    //字符串拼接
    @Test
    public void fun4(){
        Long len = jedis.append("name","123");
        System.out.println(len);
        System.out.println(jedis.get("name"));
    }
}

Hash代码实现:

public class hashDemos {
    public static Jedis jedis = JedisPoolUtil.getJedis();
    /*
    hash 操作的是map对象,适合存储键值对对象的信息
    存值 是那个参数第一个变量的名称,map键名(key),map键值(value)
     并调用hset
     */
    @Test
    public void fun(){
        Long num = jedis.hset("hash1","username","Roy wang");
        System.out.println(num);
        String hgets = jedis.hget("hash1","username");
        System.out.println(hgets);
    }

    /*
    也可以调用多个key,调用hmset
     */
    @Test
    public void fun1(){
        Map<String,String> map = new HashMap<String, String>();
        map.put("username","karry wang");
        map.put("age","18");
        map.put("sex","male");
        String result = jedis.hmset("hash2",map);
        System.out.println(result);
    }
    /*
    获取hash中所有值
     */
    @Test
    public void fun2(){
        Map<String,String> map2 = new HashMap<String, String>();
        map2 = jedis.hgetAll("hash2");
        System.out.println(map2);
    }
    /*
    删除hash中的键。可以删除一个也可以删除多个,返回的是删除的个数
     */
    @Test
    public void fun3(){
        Long num = jedis.hdel("hash2","username","age");
        System.out.println(num);
        Map<String,String> map2 = new HashMap<String, String>();
        map2 = jedis.hgetAll("hash2");
        System.out.println(map2);
    }
    /*
  Hincrby 命令用于为哈希表中的字段值加上指定增量值。
增量也可为负数,对指定字段进行减法操作。
如果哈希表的 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。
如果指定的字段不存在,那么在执行命令前,字段的值被初始化为 0 。
对一个储存字符串值的字段执行 HINCRBY 命令将造成一个错误。
本操作的值被限制在 64 位(bit)有符号数字表示之内。
也就是添加一个age的字段,值为10;
     */
    @Test
    public void fun4(){
        Map<String,String> map2 = new HashMap<String, String>();
        map2 = jedis.hgetAll("hash2");
        System.out.println(map2);
        jedis.hincrBy("hash2","age",10);
        map2 = jedis.hgetAll("hash2");
        System.out.println(map2);

    }
    /*
    判断hash是否存在某个值
     */
    @Test
    public void fun5(){
        System.out.println(jedis.hexists("hash2","username"));
        System.out.println(jedis.hexists("hash2","age"));
    }
/*
获取hash中键值对的个数
 */
@Test
public void fun6(){
    System.out.println(jedis.hlen("hash2"));
}
    /*
    获取一个hash中所有的key的值
     */
    @Test
    public void fun7(){
        System.out.println(jedis.hkeys("hash2"));
    }
    /*
    获取一个hash中所有的value的值
     */
    @Test
    public void fun8(){
        System.out.println(jedis.hvals("hash2"));
    }
}

List代码实现:

public class listDemo {
    public static Jedis jedis = JedisPoolUtil.getJedis();
    /*
    lpush 头部添加
    rpush尾部添加
     */
    @Test
    public void fun1(){
        Long num = jedis.lpush("mylist","jason zhang","Karry wang"," Roy " +
                "wang");
        System.out.println(num);
        Long rpush1 = jedis.rpush("mylist","tail");
        System.out.println(rpush1);
        Long lpush1 = jedis.lpush("mylist","head");
        System.out.println(lpush1);

    }
    /*
    查看列表  参数  名字 start end -1代表最后一个元素 -2 代表倒数第二个
     */
    @Test
    public void fun2(){
        List<String> list =jedis.lrange("mylist",0,-1);
        System.out.println(list);
    }
    /*
   移出并获取列表的第一个元素
     */
    @Test
    public void fun3(){
        String ltop = jedis.lpop("mylist");
        System.out.println(ltop);
    }

    /*
   移出并获取列表的最后一个元素
     */
    @Test
    public void fun4(){
        String last = jedis.rpop("mylist");
        System.out.println(last);
    }
    /*
    判断有没有存在的键,有就插入,没有就不插入,不会创建
     */
    @Test
    public void fun5(){
        List<String> list = jedis.lrange("mylist",0,-1);
        System.out.println(list);
        Long num = jedis.lpushx("mylist","jason yi");
        list = jedis.lrange("mylist",0,-1);
        System.out.println(num);
        System.out.println(list);
    }
    /*
    移除元数,返回移除的个数>0 从前往后删除,<0从后往前删除
     */
    @Test
    public void fun6(){
        Long num = jedis.lrem("mylist",2,"jason yi");
        System.out.println(num);
    }

    /*
    设置值
     */
    @Test
    public void fun7(){
     jedis.lset("mylist",2,"hejiong");
     List<String> list = jedis.lrange("mylist",0,-1);
        System.out.println(list);
    }
    /*
    在中间插入值,如果该值不存在则返回-1,如果存在返回list的长度
     */
    @Test
    public void fun8(){
        Long num = jedis.linsert("mylist", BinaryClient.LIST_POSITION
                .BEFORE,"Roy wang","Roy wang");
        System.out.println(num);
        jedis.lset("mylist",2,"jason zhang");
        List<String> list = jedis.lrange("mylsit",0,-1);
        System.out.println(list);
    }
    /*
    在第一个列表尾巴中弹出,在第二个列表中压入头
    * 使用场景,这样做可以保证原有数据的安全性,如果
    * 从第一个列表中拆出来,直接释放掉那么一旦发生了异常
    * 数据就不能回复了,我们还可以加上一个守护进程,更加确保
    * 数据的安全性
   */
    @Test
  public void fun9(){
      String rpoplpush = jedis.rpoplpush("mylist","mylist1");
      List<String> list = jedis.lrange("mylist",0,-1);
      System.out.println(list);
      List<String> list1 = jedis.lrange("mylist1",0,-1);
      System.out.println(list1);
      System.out.println(rpoplpush);
  }

}

SET集合代码实现:

public class setDemo {
    /*
* Set集合,和List类的区别就是
* set中不会出现重复的数据
* 他可以进行聚合操作效率比较高
* 其余的操作基本上和list相同
*
* */
   public static Jedis jedis = JedisPoolUtil.getJedis();
  /*
  添加元素删除元素(smove);
   */
  @Test
  public void fun(){
   Long num = jedis.sadd("myset","zhang jie","zhangjie","karry wang","Roy " +
           "wang");
      System.out.println(num);
  }
  /*
  获得元素 */
  @Test
public void fun1(){
    Set<String> myset = jedis.smembers("myset");
    System.out.println(myset);
}
/*
移除元数
 */
@Test
public void fun2(){
    jedis.srem("myset","zhangjie");
    Set<String> myset = jedis.smembers("myset");
    System.out.println(myset);
}
/*
判断是否这个set中存在某个值
 */
@Test
public void fun3(){
    Boolean sismember = jedis.sismember("myset","zhang jie");
    System.out.println(sismember);
}
/*
获得A-B 获得差集合
 */
@Test
public void fun4(){
    jedis.sadd("myset1","123","32","abc","def","123456","asdcfde");
    jedis.sadd("myset2","abc","345","123","fda");
    Set<String> sdiff = jedis.sdiff("myset1","myset2");
    System.out.println(sdiff);
}
/*
获得交集*/
@Test
public void fun5(){
    Set<String> sinter = jedis.sinter("myset1","myset2");
    System.out.println(sinter);
}

/*获得并集合 */
@Test
public void fun6(){
    Set<String> sunion = jedis.sunion("myset1","myset2");
    System.out.println(sunion);
}

/*
成员数量 */
@Test
public void fun7(){
    System.out.println(jedis.scard("myset1"));
}
    /*获得随机的一个成员 */
    @Test
    public void fun8(){
        System.out.println(jedis.srandmember("myset1"));
    }
    /* 将相差的成员放到一个新的set中同理交集和并集都可以后面均---加上一个store即可------并返回新的长度*/

    @Test
    public void fun9(){
        System.out.println(jedis.sdiffstore("myset3","myset1","myset2"));
        System.out.println(jedis.smembers("myset3"));
    }

}

ZSET有序集合

public class zsetDemo {
    /*和set极为的类似,他们是字符串的集合,没有重复的数据
  差别是sortedset每个成员中都会有一个分数(score)与之关联
  ,redis正是通过分数来为集合中的成员进行从小到大的排序
  sortedset中数据必须单一但是他的score可以是重复的 */
    public static Jedis jedis = JedisPoolUtil.getJedis();
    @Test
    public void fun(){
        jedis.zadd("mysort",100.0,"zhangsan");
        jedis.zadd("mysort",200.0,"lisi");
        jedis.zadd("mysort",50.0,"wangwu");
        Map<String,Double> map = new HashMap<String, Double>();
        map.put("mutouliu",70.0);
        jedis.zadd("mysort",map);
        Set<String> mysort = jedis.zrange("mysort",0,-1);
        System.out.println(mysort);
        Set<String> mysort1 = jedis.zrange("mysort",-1,0);
        System.out.println(mysort1);
    }


}

以上就是Redis常见的五大数据类型。


猜你喜欢

转载自blog.csdn.net/wyz0516071128/article/details/81057756