秒懂Redis:set 数据类型

  1. set 类型介绍:
    1. 在集合中的每个元素都是不同的,且没有顺序
    2. 集合类型和列表类型的对比:
    3. 集合类型的常用操作是向集合中加入或删除元素、判断某个元素是否存在
    4. 由于集合类型的 redis 内部是使用值为空的散列表实现,所有这些操作的时间复杂度都为 O(1)
    5. redis 还提供了多个集合之间的交集、并集、差集的运算
  2. 命令:
    1. 增加删除元素:
      sadd  key  member member ...    #增加元素
      
      sadd  key member member ...     #增加元素
    2. 获得集合中所有的元素
      smember key    #查询集合中的所有元素

    3. 判断元素是否在集合中:
      sismember key  value    #判断是否有 value 这个元素值

sorted  set 数据类型:

  1. 介绍:        
    1. 在集合类型的基础上,有序集合类型为集合中的每个元素一个分数
    2. 这使得我们不仅可以完成插入、删除和判断元素是否存在集合中
    3. 还能够获得分数最高或最低的前 N 个元素获取指定范围内的元素与分数有关的操作
    4. 有序集合和列表类型有类似点:
      1. 二者都是有序的
      2. 二者都可以获得某一范围的元素
    5. 二者区别:
      1. 列表类型是通过链表实现的,获取靠近两端的数据速度极快,而当元素增多后,访问中间数据的速度会变慢
      2. 有序集合类型使用散列列表实现,所有即使读取位于中间部分的数据也很快
      3. 列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改分数实现)
      4. 有序集合要比列表类型更耗内存
  2. 命令:
    1. 增加元素:
      1. 向有序集合中加入一个元素和该元素的分数,如果该元素已经存在则会用新的分数替换原有的分数
      2. 返回值是新加入到集合中的元素个数,不包含之前已经存在的元素
        zadd key score member  score member ...    #向集合中添加元素
    2. 获取元素的分数:
      zscore key member    #查询元素的分数
    3. 获得排名在某个范围的元素列表:
      1. 按照元素分数从小到大的顺序返回索引从 start 到 stop 之间的所有元素(包含两端的元素)
        zrange key start stop [withscores] #withsxores 显示元素的分数

    4. 获取指定分数范围的元素:
      zrangebyscore  key min max [withscores] [limit offset count]

    5. 增加某个的分数,返回值是更改后的分数
      zincrby  key  increment  member
    6. 获取集合中元素的数量:
      zcard scoreboard
    7. 获取指定分数范围内的元素分数:
      zcount key min max
  3. jedis 应用:
    package com.qcby.config.test;
    
    import com.qcby.config.RedisUtil;
    import org.junit.Test;
    import redis.clients.jedis.Jedis;
    
    import java.util.Set;
    
    public class SortSetTest {
    
        @Test
        public void test(){
            Jedis jedis = RedisUtil.getJedis();
            try {
                jedis.zadd("hackers",1940,"Alan Kay");
                jedis.zadd("hackers",1953,"Richard Stallman");
                jedis.zadd("hackers",1965,"Yukihiro");
                jedis.zadd("hackers",1916,"Linus");
    
                Set<String> setValues = jedis.zrevrange("hackers",0,-1);
                System.out.println("set 集合:" + setValues);
    
                Set<String> setValues2 = jedis.zrevrange("hackers",0,-1);
                System.out.println("set2 集合:" + setValues2);
    
                //清空数据
    //            System.out.println("清空数据:" + jedis.flushDB());
    
                //添加数据:
                jedis.zadd("zset",10.1,"hello");
                jedis.zadd("zset",10.0,"world");
                jedis.zadd("zset",10.11,"everything");
    
                System.out.println("元素个为:" + jedis.zcard("zset"));
                System.out.println("hello 的存活时间:" + jedis.zscore("zset","hello"));
                System.out.println("zset 集合:" + jedis.zrange("zset",0,-1));
                System.out.println("删除 hello 元素:" + jedis.zrem("zset","hello"));
                System.out.println("取出指定元素:" + jedis.zcount("zset",10.1,10.0));
                System.out.println("整个集合:" + jedis.zrange("zset",0,-1));
            }catch (Exception e){
                e.printStackTrace();
            }finally {
                RedisUtil.closeJedis(jedis);
            }
        }
    }
  4. keys 命令(演示命令):
    1. 设置 key 生存时间
      1. redis 在实际使用过程中更多的用作缓存,然而缓存的数据一般都是需要设置生存时间,到期后数据销毁:
        expire  key  seconds    #设置 key 的生存时间(单位:秒) key 在多少秒后会自动删除
        ttl  key    #产看 key 剩余的生存时间
        pexpire key milliseconds    #生存时间设置单位为:毫秒
  5. 其他命令:
    1. keys:返回满足条件的所有 key:
      keys  user*     #返回满足前缀为 user 的 key
      exists  key    #确认一个 key 是否存在
      del key    #删除一个 key
      rename oldkey newkey     #重命名 key
      type  key    #key的返回类型

    2. 应用:
      @Test
      public void testOther(){
          Jedis jedis  = RedisUtil.getJedis();
      
          try {
              System.out.println("查询所有key:" + jedis.keys("*"));
              System.out.println("查询所有结尾带 set 的key:" + jedis.keys("*set"));
              System.out.println("删除指定 key(失败返回 0):" + jedis.del("sanmdde"));
              System.out.println("返回key 的有效时间(-1:表示永久):" + jedis.ttl("zset"));
      
              //指定 key 的存活时间,时间为 秒
              jedis.setex("hackers",10,"min");
      
              //睡眠 5s 剩余时间为 5
              Thread.sleep(5000);
              System.out.println("hackers 剩余存活时间:" + jedis.ttl("hackers"));
              System.out.println("是否有hacksers:" + jedis.exists("hackers"));
              System.out.println("给 hackers 重命名为 time:" + jedis.rename("hackers","time"));
              System.out.println("再次获取 hackers:" + jedis.get("hackers"));
              System.out.println("获取 time key:" + jedis.get("time"));
      
              //jedis 排序
              //此处 rpush 和 lpush 是 list 的操作
      
              jedis.del("a");
              jedis.rpush("a","1");
              jedis.rpush("a","3");
              jedis.rpush("a","7");
              jedis.rpush("a","4");
              jedis.rpush("a","2");
              jedis.rpush("a","6");
              jedis.rpush("a","5");
              System.out.println("正常顺序:" + jedis.lrange("a",0,-1));
              System.out.println("排序:" + jedis.sort("a"));
          }catch (Exception e){
              e.printStackTrace();
          }finally {
              RedisUtil.closeJedis(jedis);
          }
      }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值