redis数据类型

一、字符串(存放的字符串为二进制是安全的。字符串长度支持到512M。)

  incr key

    当存储的字符串是整数时,redis提供了一个实用的命令INCR,其作用是让当前键值递增,并返回递增后的值

    如果num不存在,则自动会创建,如果存在自动+1

  INCRBY key increment  指定增长系数

  decr/decrby      减少指定的整数

  INCRBYFLOAT key decrement      整数时,第一次加可以得到正确结果,浮点数后再加浮点就会出现精度问题。

  append key  向尾部追加值。如果键不存在则创建该键,其值为写的value,即相当于SET key value。

  strlen key    字符串长度,返回数据的长度,如果键不存在则返回0。注意,如果键值为空串,返回也是0。

  MSET key value [key value …]  同时设置/获取多个键值

       MGET key [key …]  同时设置/获取多个键值

二、hash结构

  场景:通常保存用户信息到redis的做法是利用jackson技术将User对象转换为json字符串,然后存放到redis中;

      如果业务上只是更新age属性,其他的属性并不做更新应该怎么做呢?

  散列类型存储了字段(field)和字段值的映射,但字段值只能是字符串,不支持其他类型。

  一个散列类型可以包含最多232-1个字段。

    

  hset/hget

   (HSET命令不区分插入和更新操作,当执行插入操作时HSET命令返回1,当执行更新操作时返回0。)

    HSET key field value

 

    HGET key field

 

    HMSET key field value [field value…]

 

    HMGET key field value [field value…]

 

    HGETALL key

  其他命令: 

  hmset/hmget

    HMSET和HMGET设置和获取对象属性

      上面HMGET字段顺序可以自行定义

       hmset person username tony age 18

       hmget person age username

       hgetall person

  hincrby

    HINCRBY和INCR区别在于HINCRBY如果没有KEY 则自动创建KEY然后赋值而INCR只能添加不能判断。

      hdecrby article total 1

       hincrby article total -1      #没有hdecrby自减命令

  hexists  属性是否存在

    hexists user username

  hdel

     hdel user age

     hgetall user

  hkeys/hvals  只获取字段名HKEYS或字段值HVALS

     hkeys person

     hvals person

  hlen  元素个数

     hlen user

  注意:key值的大小写是区分的。

三、list结构

  说明:list类型其实就是一个每个子元素都是string类型的双向链表。

      可以通过push,pop操作从链表的头部或者尾部添加删除元素。

      这使得list既可以用作栈,也可以用作队列。

     有意思的是list的pop操作还有阻塞版本的,当我们[lr]pop一个list对象时,如果list是空,或者不存在,会立即返回nil。

     但是阻塞版本的b[lr]po以则可以阻塞,当然可以加超时时间,超时后也会返回nil。

     为什么要阻塞版本的pop呢,主要是为了避免轮询。

     举个简单的例子如果我们用list来实现一个工作队列。

     执行任务的thread可以调用阻塞版本的pop去获取任务这样就可以避免轮询去检查是否有任务存在。

     当任务来时候工作线程可以立即返回,也可以避免轮询带来的延迟。

 

    利用链表形成安全消息队列

      RPOPLPUSH命令实现安全消息队列。

      Redis链表经常会被用于消息队列的服务,以完成多程序之间的消息交换。

      假设一个应用程序正在执行LPUSH操作向链表中添加新的元素,我们通常将这样的程序称之为"生产者(Producer)",

      而另外一个应用程序正在执行RPOP操作从链表中取出元素,我们称这样的程序为"消费者(Consumer)"。

      如果此时,消费者程序在取出消息元素后立刻崩溃,由于该消息已经被取出且没有被正常处理,

      那么我们就可以认为该消息已经丢失,由此可能会导致业务数据丢失,或业务状态的不一致等现象的发生。

      然而通过使用RPOPLPUSH命令,消费者程序在从主消息队列中取出消息之后再将其插入到备份队列中,

      直到消费者程序完成正常的处理逻辑后再将该消息从备份队列中删除。

      同时我们还可以提供一个守护进程,当发现备份队列中的消息过期时,可以重新将其再放回到主消息队列中,以便其它的消费者程序继续处理。

  命令:

    lpush  在key对应list的头部添加字符串元素

      lpush mylist "world"

      lpush mylist "hello"

      lrange mylist 0 -1  (0到1表示查出全部)

    rpush  在key对应list的尾部添加字符串元素

       rpush mylist2 "hello"

       rpush mylist2 "world"

       lrange mylist2 0 -1

     del  del mylist

     linsert  在key对应list的特定位置之前或之后添加字符串元素

      rpush mylist3 "hello"

       rpush mylist3 "world"

       linsert mylist3 before "world""there"

       lrange mylist3 0 -1

    lset  设置list中指定下标的元素值

       rpush mylist4 "one"  rpush mylist4 "two"  rpush mylist4 "three"

       lset mylist4 0 "four"  lset mylist4 -2 "five"

        lrange mylist4 0 -1

     lrem  从key对应list中删除count个和value相同的元素,

      count>0时,按从头到尾的顺序删除

         rpush mylist5 "hello"  rpush mylist5 "hello"  rpush mylist5 "foo"  rpush mylist5 "hello"

        lrem mylist5 2 "hello"

        lrange mylist5 0 -1

      count<0时,按从尾到头的顺序删除

         rpush mylist6 "hello"   rpush mylist6 "hello"   rpush mylist6 "foo"   rpush mylist6 "hello"

         lrem mylist6 -2 "hello"

         lrange mylist6 0 -1

      count=0时,删除全部

         rpush mylist7 "hello"   rpush mylist7 "hello"   rpush mylist7 "foo"  rpush mylist7 "hello"

         lrem mylist7 0 "hello"

         lrange mylist7 0 -1

   ltrim  保留指定key 的值范围内的数据

        rpush mylist8 "one"  rpush mylist8 "two"   rpush mylist8 "three"   rpush mylist8 "four"

         ltrim mylist8 1 -1

         lrange mylist8 0 -1

  lpop  从list的头部删除元素,并返回删除元素

     lrange mylist 0 -1

      1) "hello"

      2) "world"

     lpop mylist

     lrange mylist 0 -1

  rpop  从list的尾部删除元素,并返回删除元素:

    range mylist2 0 -1

    1) "hello"

    2) "world"

    rpop mylist2

     lrange mylist2 0 -1

    llen  返回key对应list的长度:

    len mylist5

     index  返回名称为key的list中index位置的元素:

       lrange mylist5 0 -1

      1) "three"

      2) "foo"

       lindex mylist5 0

       lindex mylist5 1

   rpoplpush  从第一个list的尾部移除元素并添加到第二个list的头部,最后返回被移除的元素值,

            整个操作是原子的.如果第一个list是空或者不存在返回nil

 

四、set结构

  说明:Redis的Set是string类型的无序集合。

     集合成员是唯一的,这就意味着集合中不能出现重复的数据。

     Redis中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

     集合中最大的成员数为232 - 1 (4294967295每个集合可存储40多亿个成员)。

   命令:

    sadd  添加元素,重复元素添加失败,返回0

 

      sadd name tony

       sadd name hellen

      sadd name rose

      sadd name rose

    smembers  获取内容

    smembers name

    spop  移除并返回集合中的一个随机元素

      smembers internet

      spop internet

    scard  获取成员个数

     scard name

     smove  移动一个元素到另外一个集合

       sadd internet amoeba nginx redis

       sadd bigdata hadopp spark rabbitmq

      smembers internet

       smembers bigdata

      smove bigdata internet rabbitmq

       smembers internet

       smembers bigdata

    sunion  并集

       sunion internet bigdata

 

  

  

posted @ 2017-10-22 19:50  bruce.chen  阅读(107)  评论(0)    收藏  举报