一.Redis数据类型

       Redis支持5中数据类型,分别是字符串(Strings),列表(Lists),集合(Sets),哈希(Hashes),有序集合(Sorted Sets)下面会分别介绍各个数据类型以及在redis客户端下相关命令。

二.字符串(Strings)

        字符串类型是Redis中最基本的数据类型,能存储任何形式的字符串,包括二进制数据。可以使用字符串来存储json化的对象,持久化的对象,二进制流表示的图片等等。3.0之前字符串类型最大容量是512MB。这足够使用了。

       2.1  命令

set key value         localhost:6379> set name Tom                保存一个key为name,value为 Tom的键值对。
                get key                  localhost:6379> get name                         读取key为name的值
                keys *                      localhost:6379> keys *                             返回所有的key
                incr key                    localhost:6379> incr age             当value是整数的时候可以使用这个命令对整数+1.原子性的操作

 当value是整数的时候,对value加上指定数。原子性

当value是整数的时候,对value减去1   ,  原子性的

localhost:6379> decrby age 10   当value是整数的时候,对value减去指定数,原子性
incrbyfloat key  float     localhost:6379>  incrbyfloat price 0.9      当value是浮点数的时候,对value增加指定浮点数数,原子性
decrbyfloat key  float    localhost:6379>  decrbyfloat price 0.9    当value是浮点数的时候,对value减去指定浮点数数,原子性
                 append key value       localhost:6379> append name Jack       把value追加到相应key的value后面
localhost:6379> mset city ShangHai nation China    同时设置多个key-value
OK
localhost:6379> mget city  nation                同时获取多个key-value
1) "ShangHai"
2) "China"

二.散列类型(Hashes)        当我们存一个对象的时候一般是把这个对象进行序列化,然后存在redis中,在需要对象里面某个字段的时候,从redis中读取对象序列化的value,对这个对象进行反序列化,再获得我们需要的某个字段,这造成很大的浪费。如果想要读取那个字段就可以直接读取某个字段多好。关系型数据库就是这样做的,但是对于某一些对象我有某些字段,某些对象我没有某些字段,这样关系型数据库就做不到了。在散列类型中一个key最多有2^32-1个字段。

          Redis的散列类型就能做到。一个key对于多个filed,一个filed对于一个value。

localhost:6379> hset student:001 name Tom
(integer) 1
localhost:6379> hset student:001 age 25
(integer) 1
localhost:6379> hset student:001 city ShangHai
(integer) 1
localhost:6379> hget student:001 name
"Tom"
localhost:6379> hget student:001 age
"25"
localhost:6379> hget student:001 city
"ShangHai"

    key为student:001的学生有三个字段,分别是name = Tom ,  age = 25,city  = ShangHai

在这里需要注意一个事情,就是使用hset的时候,如果字段以及存在了,则会更新数据,然后返回0,如果字段不存在,则会新建字段插入数据,然后返回1。

当然我们也可以批量添加和查询操作    

localhost:6379> hmset student:002 name Jck age 25 city BeiJing
OK
localhost:6379> hmget student:002 name age city
1) "Jck"
2) "25"
3) "BeiJing"

或者

localhost:6379> hgetall student:002
1) "name"
2) "Jck"
3) "age"
4) "25"
5) "city"
6) "BeiJing"

或者 获取某个key的所有字段的值

localhost:6379> hvals student:001
1) "123"
2) "35"
3) "ShangHai"
4) "80kg"

增加数字

localhost:6379>     hincrby student:001 age 10
(integer) 35

当字段不存在时,会自动创建字段,并赋值。

获取字段数量

localhost:6379> hlen student:002
(integer) 3

删除字段

localhost:6379> hdel student:001 ages
(integer) 1

三.列表类型(Lists)

        列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获取列表中某一段的值。列表类型在Redis中是使用的双向链表实现的。查询头尾比较近的元素相当快,但是通过索引去访问元素就比较慢了。这种特性是的Redis适合用来做关心最新数据的一些功能,如微博上新鲜事,新闻中今日新闻,热点新闻。也适合记录日志,因为添加日志不会受到已有的日志数量的影响。借助列表类型,Redis可以作为队列或者栈来使用。一个列表类型最多容纳2^32-1个元素。

        

  3.1往列表里面添加,从左边插入

localhost:6379> lpush numbers 5 4 3 2 1
(integer) 5

   现在数列里面顺序从左到右是     1 2 3 4 5

    3.2往列表里面添加,从右边插入

localhost:6379> rpush numbers 5 4 3 2 1
(integer) 10

    现在数列里面顺序从左到右是  1 2 3 4 5 5 4 3 2 1

    3.3查看数列值

localhost:6379> lrange numbers 0 10
 1) "1"
 2) "2"
 3) "3"
 4) "4"
 5) "5"
 6) "5"
 7) "4"
 8) "3"
 9) "2"
10) "1"
localhost:6379> lrange numbers 0 0 
1) "1"

    在redis里面下标从0 开始,lrange numbers 0 10 是指从下标为0的开始到下标为10的元素。 lrange numbers 0 0 查下标为0的元素开始到下标为0的元素结束,也就是左边第一个元素。负数代表从右边第几个开始,-1表示右边第一个,-2表示右边第二个。 lrange numbers 0 -1表示显示整个数列

    3.4从左边弹出一个元素

localhost:6379> lpop numbers
"1"
localhost:6379> lrange numbers 0 -1
1) "2"
2) "3"
3) "4"
4) "5"
5) "5"
6) "4"
7) "3"
8) "2"
9) "1"

   可以通过lrange看到左边第一个元素被弹出了。


localhost:6379> rpop numbers 
"1"
localhost:6379> lrange numbers 0 -1
1) "2"
2) "3"
3) "4"
4) "5"
5) "5"
6) "4"
7) "3"
8) "2"

    可以看到右边第一个元素被弹出了。

    3.6获取列表中元素的个数

localhost:6379> llen numbers
(integer) 8


localhost:6379> lrem numbers 1 2
(integer) 1

    删除从列表删除前1一个值为2的元素

    lrem numbers count value

    count>0  :  从左边开始删除count个值为value的元素。

    count <0  :   从右边开始删除count个值为value的元素。    

    count = 0 : 删除所有值为value的元素

    3.8  根据下标位置获取元素

localhost:6379> lindex numbers 0
"4"
localhost:6379> lindex numbers 1
"5"
localhost:6379> lindex numbers -1
"4"

    3.9 修改元素的值 

localhost:6379> lset numbers 0 10
OK
localhost:6379> lindex numbers 0 
"10"

    3.10  只保留某个范围的元素


localhost:6379> lrange numbers 0 -1
1) "10"
2) "5"
3) "5"
4) "4"
localhost:6379> ltrim  numbers 1 2
OK
localhost:6379> lrange numbers  0 -1
1) "5"
2) "5"


  3.8 队列和栈的实现

    聪明的你一定想到了

    lpush配合rpop(或者rpush配合lpop)就实现先入先出的一个队列了。

    lpush配合lpop(或者rpush配合rpop) 就实现后进先出的一个栈了。

四.集合类型(Set)

    集合里面没有顺序,每个元素都不同,与java中set有点类似。Redis中集合类型可以存储最好2^32-1个元素。Redis中集合类型使用hash table 实现的,就类似java中的HahsMap的数据结构。


localhost:6379> sadd letters a b c d
(integer) 4

4.2查询集合中所有元素

localhost:6379> smembers letters
1) "b"
2) "a"
3) "c"
4) "d"

    4.3 从集合中删除元素

localhost:6379> srem letters b a
(integer) 2
localhost:6379> smembers letters
1) "c"
2) "d"

  4.4 查询集合中是否存在

localhost:6379> sismember letters c
(integer) 1

  4.5 集合间的运算


localhost:6379> sadd seta a b c d
(integer) 4
localhost:6379> sadd setb c d
(integer) 2
localhost:6379> sdiff seta setb
1) "b"
2) "a"

        {a,b,c,d} -{c,d}  = {a.b}

        

localhost:6379> sinter seta setb
1) "c"
2) "d"

         {a,b,c,d} ∩{c,d}  = {c,d}

        4.5.3 求两个集合的并集        

localhost:6379> sunion seta setb
1) "a"
2) "c"
3) "d"
4) "b"

    4.6获得集合中元素个数

localhost:6379> scard seta
(integer) 4

五.有序集合(Sorted Set)

    很显然就是一个集合,但是元素是有序的。

    5.1 向有序集合中添加

localhost:6379> zadd scoreset 80 Tom 90 Jack 40 Devil
(integer) 3

    如果元素已经存在则修改元素的值

     5.2 查询某个元素的值

localhost:6379> zscore scoreset Jack
"90"

      5.3 根据下标位置查询

localhost:6379> zrange scoreset 0 -1
1) "Devil"
2) "Tom"
3) "Jack"

localhost:6379> zrange scoreset 0 -1 withscores 
1) "Devil"
2) "40"
3) "Tom"
4) "80.5"
5) "Jack"
6) "90"

     5.4  获取指定分数范围的元素

localhost:6379> zrange scoreset 0 -1 withscores 
1) "Devil"
2) "40"
3) "Tom"
4) "80.5"
5) "Jack"
6) "90"