欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-13 17:54:23
...

一.五大数据类型的介绍

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常见的五大数据类型。