• Redis之数据类型及命令


      Redis(REmote DIctionary Server) 是一个遵守BSD协议、支持网络、可基于内存亦可持久化的日志型key-value存储系统。

    KEY

      常用指令:

    指令
    注释
    备注
    exits key 
    检测指定 key 是否存在
     1 : 存在,0 : 不存在
    del key1 key2......keyN 
    删除给定 key
    返回删除 key 的数目,0 表示给定 key 都不存在
    type key 
    返回给定 key 值的类型
    none : key 不在         string   : 字符类型
    list       : 链表类型      set       : 无序集合类型
    keys pattern 
    返回匹配指定模式的所有 key
     
    randomkey 
    随机返回一个 key
    如果当前数据库是空的,返回空串
    rename oldkey newkey 
    重命名一个 key
    如果 newkey 已存在,将会被覆盖newkey的值.
    expire key seconds
    设置key 的过期时间,单位是秒。
    返回 1 : 成功,0 :key 不存在
    ttl key 
    返回key的剩余过期秒数
    -1 : key未设置过期时间, -2:key不存在
    persist key
    清除key的过期时间
    1 : 成功  0:key不存在或者没有设置过期时间

     

     

     VALUE

      Redis 提供五种数据类型:String,Hash,List,Set 及 ZSet。

    • String

         String 是最基本的类型,而且 String 类型是二进制安全的,意思是 Redis 的 String 可以 包含任何数据。

        常用指令:

    指令
    注释
    例子
    set key value
    存数据
    set username 'winn'
    get key  
    取数据
    get username
    mset key1 value1... keyn valuen 
    一次存多个键值对
    mset uname 'winn' pwd '123'
    mget key1 ... keyn
    一次取多个值
    mget uname pwd

        Java使用:

    @Test
    public void testString() {
       Jedis jedis = new Jedis("localhost");
        jedis.set("name","winn");
        System.out.println(jedis.get("name"));
        //拼接
        jedis.append("name", " is my lover");
        System.out.println(jedis.get("name"));
        jedis.del("name");
        System.out.println(jedis.get("name"));
        //设置多个键值对
        jedis.mset("name","winn","age","27","qq","174754613");
        //进行加1操作
        jedis.incr("age");
        System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-" + jedis.get("qq"));//执行结果:winn-28-174754613
    }
    • Hash

        Hash 是一个 String 类型的 field 和 value 的映射表,最大可以包含(2^32 -1)个键值对。增删操作的时间复杂度为 O(1)。

                  Hash 特别适合用于存储对象,将一个对象存储在 Hash 类型中会占用更少的内存,并且可以更方便的存取整个对象。【省内存的原因是新建一个 Hash 对象时开始是用 zipmap(又称为 smallhash)来存储的。这个 zipmap 其实并不是hash table,但是 zipmap 相比正常的 hash 实现,可以节省不少 hash 本身需要的一些元数据存储开销。尽管 zipmap 的添加、删除、查找都是 O(n),但是由于一般对象的 field 数量都不太多,所以使用 zipmap的添加删除平均还是 O(1)。如果 field 或者 value的大小超出一定限制(在配置文件中指定)后,redis会在内部自动将zipmap替换成正常的hash实现.
    #配置字段最多 64 个 
    hash-max-zipmap-entries 64 
    
    #配置 value 最大为 512 字节
    hash-max-zipmap-value 512  

        常用指令:

    指令
    注释
    例子
    hmset key field1 value1 ... fieldn valuen
    存数据
    hmset user name 'winn' sex 'man'
    hget key
    取数据
    hget user name
    hgetall key
    获取对象
     
    HKEYS key
    夺取对象中的所有filed
     
    HVALS key
    夺取对象中的所有value
     
     @Test
        public void testHash(){
         Jedis jedis = new Jedis("localhost"); Map
    <String, String> map = new HashMap<>(); map.put("name", "xinxin"); map.put("age", "22"); map.put("qq", "123456"); jedis.hmset("user",map); List<String> rsmap = jedis.hmget("user", "name", "age", "qq"); System.out.println(rsmap); //删除map中的某个键值 jedis.hdel("user","age"); System.out.println(jedis.hmget("user", "age")); //null //hlen 返回key中的field-value个数 System.out.println(jedis.hlen("user")); //2 //exists 判断key是否存在 System.out.println(jedis.exists("user"));//true //hkeys 返回所有的field System.out.println(jedis.hkeys("user"));//[name, qq] //hvals 返回所有的value System.out.println(jedis.hvals("user"));//[xinxin, 123456] Iterator<String> iter=jedis.hkeys("user").iterator(); while (iter.hasNext()){ String key = iter.next(); System.out.println(key+":"+jedis.hmget("user",key)); } }
    • List(双向链表类型)

         List 是一个链表结构,可以理解为一个每个子元素都是 String 类型的双向链表。主要功能是 push、pop、获取一个范围内的所有值等。

        常用指令:

    指令
    注释
    例子
    lpush listName value
    将value存入list的表头
    lpush listData demo
    rpush listName value
    将value存入list的表尾
    rpush listData demo
    lrange listName startIndex endIndex
    返回下标在[startIndex, endIndex]中的值
    lrange listData 0 10

        Java使用:

    @Test
    public void testList(){
        Jedis jedis = new Jedis("localhost");
        if(jedis.keys("*") != null){
            jedis.flushDB();
        }
        //rpush : 在表尾添加数据
        jedis.rpush("db","This","is","redis");
        jedis.rpush("db","demo");
        //lpush : 在表头添加数据
        jedis.lpush("db","Begin : ");
        //lrange : 获取链表中的值 、 llen : 获取链表长度
        System.out.println(jedis.lrange("db", 0, jedis.llen("db")));
        //-1表示最后一个元素
        System.out.println(jedis.lrange("db", 0, -1));
        //排序 : 排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较。
        //System.out.println(jedis.sort("db"));
    }
    • Set
         Set 是无序集合,且不允许重复的成员。最大可以包含(2^32 -1)个元素。增删查操作的时间复杂度为 O(1)。
                   Set 的是通过 hashtable 实现的, hashtable 会随着添加或者删除自动的调整大小。 需要注意的是调整 hashtable 大小时候需要同步(获取写锁),会阻塞其他读写操作。
                   关于 Set 集合类型 除了基本的添加删除操作,还包含集合的取并集(union),交集(intersection), 差集(difference)。
        常用指令:
    指令
    注释
    例子
    sadd key member
    将value存入set
    sadd setData set demo
    smembers key
    返回key中的数据
    sembers setData
    sismbers key
     判断key是否存在  sismembers setData
    SDIFF key1 [key2]
    返回给定所有集合的差集
     
    SINTER key1 [key2]
    返回给定所有集合的交集
     
    SUNION key1 [key2]
    返回所有给定集合的并集
     

        Java使用:

    @Test
    public void testSet(){
       Jedis jedis = new Jedis("localhost");
    //添加 jedis.sadd("user","liuling"); jedis.sadd("user","xinxin"); jedis.sadd("user","ling"); jedis.sadd("user","zhangxinxin"); jedis.sadd("user","who"); //srem : 移除value jedis.srem("user","who"); System.out.println(jedis.smembers("user"));//获取所有加入的value System.out.println(jedis.sismember("user", "who"));//判断 who 是否是user集合的元素 System.out.println(jedis.srandmember("user"));//随机返回一个value System.out.println(jedis.scard("user"));//返回集合的元素个数

      
    jedis.sadd("customer","ling");
      jedis.sadd("customer","xinxin");
      jedis.sadd("customer","winn");
      jedis.sadd("customer","nicole");
      jedis.sadd("customer","sam");
      //并集
      System.out.println(jedis.sunion("user","customer"));
      //差集 : 返回user中customer不包含的value
      System.out.println(jedis.sdiff("user","customer"));
      //交集
      System.out.println(jedis.sinter("user","customer"));
    }
    • ZSet(有序集合类型Sorted Set)

         Sorted Set 是有序集合,且不允许重复的成员。它在 Set 的基础上增加了一个顺序属性(score),这一属性在添加修改元素的时候可以指定,每次指定后,会自动重新按新的值调整顺序。

        常用指令:

    指令
    注释
    例子
    zadd key score member
    存数据
    zset zsetData 0 demo
    zrange key startScore endScore  [WITHSCORES]
    取score在[startScore, endScore]之间的数据
    zrange zsetData 0  10

         Java使用:

    @Test
    public void testZSet(){
       Jedis jedis = new Jedis("localhost");
        jedis.zadd("user",1,"winn");
        jedis.zadd("user",2,"sam");
        jedis.zadd("user",5,"nicole");
        jedis.zadd("user",4,"roy");
        Set<String> user = jedis.zrange("user", 0, -1);
        System.out.println(user);
    }

    补充

    • 系统常用指令
    指令
    注释
    备注
    keys name
    获取指定key
    keys * 获取所有key
    flushdb
    清除当前数据库的所有数据
     
    flushall
    清除所有数据库的所有数据
     
    besize
    返回数据库中key的数量
     
    config set field value 设置系统参数 config set maxmemory 100mb
    config get field 查看系统参数 config get maxmemory
     
    • Java使用Redis事务
    /**
     * 使用事务
     * Redis事务可以理解为一个打包的批量执行脚本,中间某条指令的失败不会导致前面已做指令的回滚,也不会造成后续的指令不做。
     *
     */
    @Test
    public void testTrans() {
        //开启事务
        Transaction tx = jedis.multi();
        for (int i = 0; i < 1000; i++) {
            tx.set("t" + i, "t" + i);
        }
        //执行事务
        tx.exec();
        System.out.println(jedis.get("t100"));
    }
  • 相关阅读:
    CF633C Spy Syndrome 2 trie树
    luogu 3998 [SHOI2013]发微博 map
    阿里云ECS新增端口
    阿里云运行docker容器报错
    no matches for kind "ReplicaSet" in version "extensions/v1beta1"
    k8s中flannel:镜像下载不了
    k8s删除节点后再重新添加进去(踩坑)
    如何在IntelliJ Idea中同时启动不同端口
    SpringBoot整合Elastic-job(详细)
    K8S容器探针
  • 原文地址:https://www.cnblogs.com/BlueStarWei/p/11694443.html
Copyright © 2020-2023  润新知