Redis的数据类型

发表时间:2017-07-19 21:49:20 浏览量( 31 ) 留言数( 0 )

学习目标:

1、了解Redis的类型介绍

2、了解各种类型的基本使用

学习过程:

    Redis强大之处就是在于其丰富的数据类型。Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

1、String(字符串)

    string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。一个键最大能存储512MB。

实例

redis 127.0.0.1:6379> SET name "liubao"

OK

redis 127.0.0.1:6379> GET name

"liubao"

在以上实例中我们使用了 Redis 的 SET 和 GET 命令。键为 name,对应的值为 liubao。


2、Hash(哈希)

    Redis hash 是一个键值(key=>value)对集合。Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

实例

redis> HMSET myhash field1 "value1" field2 "value2"

"OK"

redis> HGET myhash field1

"value1"

redis> HGET myhash field2

"value2"

    以上实例中 hash 数据类型存储了包含用户脚本信息的用户对象。 实例中我们使用了 Redis HMSET, HGETALL 命令,user:1 为键值。每个 hash 可以存储 232 -1 键值对(40多亿)。


其他常用命令:

    赋值与取值

        hset key field value

        hget key field

        hmset key field value [ field value ...... ]

        hmget key field [ field ...... ]

        hgetall key

        hset 命令用来给字段赋值,而hget命令用来获得字段的值

        hset 命令的方便之处在于不区分插入和更新操作,这意味着修改数据时不用事先判断字段是否存在来决定要执行的是插入操作还是更新操

            作,当执行的是插入操作时, hset 命令返回 1 ,当执行的是更新操作时,hset 命令返回的是 0 ,当键本身不存在时, hset 命令还会

            自动建立他

        hmset 设置多个键值

        hmget 获得多个键值

        hgetall 获取键中所有字段和字段值却不知道键中有哪些字段时使用,返回的结果是字段和字段值组成的列表

 

    判断字段是否存在

        hexists key field

        存在返回 1 ,否则返回 0

    

    当字段不存在时赋值

        hsetnx key field value

        hsetnx 命令与hset 命令类似,区别在于如果字段已经存在,hsetnx 命令将不执行任何操作

        

    增加数字

        hincrby key field increment

        使字段值增加指定的整数

 

    删除字段

        hdel key field [ field .....]

        删除一个或多个字段,返回值是被删除的字段个数

 

    只获取字段名或字段值

        hkeys key

        hvals key

        hkeys 获取所有字段的名字

        hvals 获得键中所有字段的值

 

    获得字段数量

        hlen key

  

3、List(列表)

   Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。或者从头部或尾部弹出数据,我们可以使用Redis的列表实现消息队列的功能,数据量不是很大的时候,效率比RabbitMQ等其他的队列工具更高。

实例

127.0.0.1:6379> lpush mylist one

(integer) 1

127.0.0.1:6379> lpush mylist two

(integer) 2

127.0.0.1:6379> lpush mylist three 

(integer) 3

127.0.0.1:6379> lrange mylist 0 10

1) "three"

2) "two"

3) "one"

127.0.0.1:6379> rpush mylist haha

(integer) 4

127.0.0.1:6379> lrange mylist 0 10

1) "three"

2) "two"

3) "one"

4) "haha"

列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

其他常用命令:

  向列表两端增加元素

        lpush key value [ value ....... ]

        rpush key value [ value ....... ]

        lpush 命令用来向列表左边增加元素,返回表示增加元素后列表的长度 

        rpush 命令用来向列表右边增加元素,返回表示增加元素后列表的长度 

        

    从列表两端弹出元素

        lpop key

        rpop key

        lpop 命令可以从列表左边弹出一个元素,lpop 命令执行两步操作,1:将列表左边的元素从列表中移除,2:返回被移除元素值

        rpop 命令可以从列表右边弹出一个元素

 

    获取列表中元素个数

        llen key

        当键不存在时,llen 返回 0

 

    获得列表片段

        lrange key start stop

        获得列表中的某一片段,返回索引从 start 到 stop 之间的所有元素(包括两端的元素) 索引开始为 0

        注:lrange 与很多语言中用来截取数组片段的方法有一点区别是 lrange 返回的值包含最右边的元素

               lrange 命令也支持负索引,表是从右边开始计算序数,如 ' -1 ' 表示最右边第一个元素, ' -2 ' 表示最右边第二个元素,一次类推

 

    删除列表中指定的值

        lrem key count value

        lrem 命令会删除列表中前 count 个值为 value 的元素,返回值是实际删除的元素个数。根据count 值的不同,lrem 命令执行的方式会

            略有差异

            当 count > 0 时,lrem 命令会从列表左边开始删除前 count 个值为 value 的元素

            当 count < 0 时,lrem 命令会从列表右边开始删除前count 个值为 value 的元素

            当 count = 0 时,lrem 命令会删除所有值为value的元素

 

    获得 / 设置 指定索引的元素值

        lindex key index

        lset key index value

        lindex 命令用来返回指定索引的元素,索引从 0 开始 ,如果 index 是负数则表示从右边开始计算的索引,最右边元素的索引是 -1 

        lset 是通过索引操作列表的命令,它会将索引为 index 的元素赋值为 value 

 

    只保留列表指定片段

        ltrim key start end

        ltrim 命令可以删除指定索引范围之外的所有元素,其指定列表范围的方法和 lrange 命令相同

        ltrim 命令常和 lpush 命令一起使用来限制列表中元素的数量,比如记录日志时我们希望只保留最近的 100 条日志,则每次加入新元素时

            调用一次ltrim 命令即可;

 

    向列表中插入元素

        linsert key before | after pivot value

        linsert 命令首先会在列表中从左到右查找值为 pivot 的元素,然后根据第二个参数是 before 还是 after 来决定将 value 插入到该元素的

            前面还是后面,如果命令执行成功,返回插入操作完成之后列表的长度。如果没有找到 pivot 返回 -1 如果key 不存在或为空,返回 0

            

    将元素从一个列表转到另一个列表R

        rpoplpush source destination

        rpoplpush 先执行 rpop 命令在执行 lpush 命令。rpoplpush 命令先会从source 列表类型键的右边弹出一个元素,然后将其加入到 destination 列表类型键的左边,并返回这个元素的值,整个过程是原子的

 


4、Set(无序集合)

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

sadd 命令

添加一个string元素到,key对应的set集合中,成功返回1,如果元素已经在集合中返回0,key对应的set不存在返回错误。

sadd key member

实例

127.0.0.1:6379> sadd myset one

(integer) 1

127.0.0.1:6379> sadd myset two

(integer) 1

127.0.0.1:6379> sadd myset three

(integer) 1

127.0.0.1:6379> sadd myset three

(integer) 0

127.0.0.1:6379>  smembers myset 

1) "one"

2) "three"

3) "two"

   注意:以上实例中 three添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。集合中最大的成员数为 232 - 1(4294967295, 每个集合可存储40多亿个成员)。

其他常用命令:

    增加删除命令

        sadd key member [ member .... ]

        srem key member [ member .... ]

        sadd 命令用来向集合中增加一个或多个元素,如果键不存在则会自动创建。因为在一个集合中不能有相同的元素,所以如果要加入的元

            素已经存在与集合中就会忽略这个元素。返回值是成功加入的元素数量(忽略的元素不计算在内)

        srem 命令用来从集合中删除一个或多个元素,并返回删除成功的个数


    获得集合中的所有元素

        smembers key

        返回集合中的所有元素

 

    判断元素是否在集合中

        sismember key member

        判断一个元素是否在集合中是一个时间复杂度为 0(1) 的操作,无论集合中有多少个元素, sismember 命令始终可以极快的返回结果。当

            值存在时 sismember 命令返回 1 ,当值不存在或者键不存在时返回 0

 

    集合间运算

        sdiff key [ key ...... ]

        sdiff 命令用来对多个集合执行差集运算。集合 A 与集合 B 的差集表示为 A- B ,代表所有属于 A 且不属于 B 的元素构成的集合,即 

            A - B = { x| x∈A  且 x ∈/B }

            

        命令使用方法:

                sadd seta 1 2 3 4 6 7 8

                sadd setb 2 3 4

                sdiff seta setb

        该命令支持同时传入多个键, 计算顺序是先计算 seta 和 setb 在计算结果与 setc 的差集

                sadd setc 2 3 4

                sdiff seta setb setc

        

        sinter key [ key ..... ]

        该命令用来对多个集合执行交集运算。集合 A 与集合 B 的交集表示为 A∩B,代表所有属于 A 且属于 B 的元素构成的集合

            即 A∩B = { x| x∈A  且 x ∈B }

            

            命令使用方法:

                sinter seta setb

                该命令同样支持同时传入多个键

 

        sunion key [ key ...... ]

        该命令用来对多个集合执行并集运算。集合 A 与集合 B的并集表示为 A∪B ,代表所有属于A或所有属于B的元素构成的集合

            即  A∪B = { x| x∈A  或 x ∈B }

            

            命令使用方法:

                sunion seta setb

                该命令同样支持同时传入多个键

 

        获得集合中元素的个数

            scard key

            

        进行集合运算并将结果存储

            sdiffstore destination key [ key ...... ]

            sinterstore destination key [ key ...... ]

            sunionstore destination key [ key ...... ]

            sdiffstore 命令和 sdiff 命令功能一样,唯一的区别就是前者不会直接返回运算的结果,而是将结果存在 destination 键中

            sinterstore 这个命令类似于 sinter 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。

            sunionstore 这个命令类似于 sunion 命令,但它将结果保存到 destination 集合,而不是简单地返回结果集。

 

        随机获得集合中的元素

            srandmember key [ count ]

            该命令用来随机从集合中获取一个元素

            还可以传递 count 参数来一次随机获得多个元素,根据 count 的正负不同,具体表现也不同

                当count 为正数时,srandmember 会随机获取从集合里获得 count 个不重复的元素。如果 count 的值大于集合中的元素个数,则 

                    srandmember 会返回集合中的全部元素

                当 count 为负数时,srandmember 会随机从集合中获得 |count| 个的元素,这些元素有可能相同

            注:当传递count 参数时,在windows环境下提示命令参数错误

 

        从集合中弹出一个元素

            spop key

            由于集合类型的元素是无序的,所以 spop 命令会从集合中随机选择一个元素弹出,返回值为被移除的随机元素,如果 key 不存在或者 

                key 为空集时,返回 nil

 

5、Set(sorted set:有序集合)

    Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的成员是唯一的,但分数(score)却可以重复。

zadd 命令

添加元素到集合,元素在集合中存在则更新对应score

zadd key score member 

实例

127.0.0.1:6379> zadd mysset 0 one

(integer) 1

127.0.0.1:6379> zadd mysset 2 three

(integer) 1

127.0.0.1:6379> zadd mysset 3 three

(integer) 0

127.0.0.1:6379> ZRANGEBYSCORE mysset 0 1000

1) "one"

2) "two"

3) "three"

127.0.0.1:6379> zscore mysset three

"3"

有序集合类型(sorted set)

        增加元素

            zadd key score member [ score member ...... ]

            zadd 命令用来向有序集合中加入一个元素和该元素的分数,如果该元素已经存在,则会用新的分数替换原有的分数。zadd命令的返回

                值是新加入到集合中的元素个数(不包含之前已经存在的元素)

 

        获得元素的分数

            zscore key member

            

        获得排名在某个范围的元素列表

            zrange key start stop [ withscores ]

            zrevrange key start stop [ withscores ]

            zrange 命令会按照元素分数从小到大的顺序返回索引从 start 到 stop 之间的所有元素(包含两端的元素)。zrange 命令和 lrange 命

                令十分相似,如索引都是从0开始,负数代表从后向前查找(-1 表示最后一个元素)。如果需要同时获得元素的分数的话,可以在 

                 zrange 命令的尾部加上 widthscores 参数

            注:如果两个元素的分数相同,redis会按照字典顺序(即 0<9<A<Z<a<z 这样的顺序)来进行排列。如果元素的值是中文,则取决于

                   中文的编码方式,如图:

                    

            zrevrange 命令和 zrange 的唯一不同在于 zrevrange 是按照元素分数从大到小的顺序给定结果的

           

        获得指定分数范围内的元素

            zrangebyscore key min max [ withscores ] [ limit offset count ]

            该命令按照元素分数从小到大的顺序返回分数在 min 到 max 之间(包含 min 和max 的元素)

            如果希望分数范围不包含端点值,可以在分数前加上 "(" 符号,例如:希望返回80分到100分的的数据,可以包含80分单不包含100分

                命令:zrangebyscore scoreboard 80 (100 widthscores

                

                min 和 max 还支持无穷大,同 zadd 命令一样,-inf 和 +inf 分别表示负无穷大和正无穷大。比如希望得到所有分数高于 80分(不

                包含80分)的人的名单,但是却不知道最高分是多少,这是就可以使用 +inf

                zrangebyscore scoreboard (80 +inf

                

                命令 limit offset count 与 SQL 中的用法基本相同,即在获得的元素列表的基础上向后偏移 offset 个元素并且只获取前count个元

                素

              

                zrevrangebyscore 不仅是按照元素分数从大往小的顺序给出结果,而且他的 min 和max 的参数的顺序和 zrangebyscore 命令是相

                反的

                

        增加某个元素的分数

            zincrby key increment member

            zincrby 命令可以增加一个元素的分数,返回值是更改后的分数,例如想给peter 加 4 分

               zincrby scoreborder 4 peter

               increment  也可以是负数表示减分

                 zincrby scoreborder -4 peter

            如果指定元素不存在,redis 在执行命令前会先建立它并将他的值赋为0在执行操作        

 

        获得集合中元素的数量

            zcard key

        获得指定分数范围内的元素个数

            zcount key min max

            zcount 命令的 min max 参数的特性与 zrangebyscore 命令中的一样

            

 

        删除一个或多个元素

            zrem key member [ member .... ]

            zrem 命令的返回值是成功删除的元素数量(不包含本来就不存在的元素)

 

        按照排名范围删除元素

            zremrangebyrank key start stop

            按照元素分数从小到大的顺序(即索引 0 表示最小的值)删除在指定排名范围内的所有元素,并返回删除元素的数量

            

 

        按照分数范围删除元素

            zremrangebyscore key min max

            zremrangebyscore 命令删除指定分数范围内的所有元素,参数 min 和 max 的特性和 zrangebyscore 命令中的一样,返回值是删除

                元素的个数

            

 

        获得元素的排名

            zrank key member

            zrevrank key member

            zrank 命令会按照元素分数从小到大的顺序获得指定的元素排名(从 0 开始,即分数最小的元素排名为0)

            

            zrebrank 命令则正好相反,分数最大的元素排名为0

 

        计算有序集合的交集

            zinterstore destination numkeys key [ key ... ] [ weights weight [ weight ... ] ] [ aggregate SUM | MIN | MAX ]

            zinterstore 命令用来计算多个有序集合的交集病将结果存储在 destination 键中(同样以有序集合类型存储),返回值为 destination 

                键中元素的个数,destination 键中元素的分数是由 aggregate 参数决定的

            1. 当 aggregate 是 SUM (也就是默认值),destination 键中元素的分数是每个参与计算的集合中该元素分数的和

            2.当 aggregate 是 MIN 时,destination 键中元素的分数是参与计算的集合中该元素分数最小值

            3.当 aggregate 是 MAX 是,destination 键中元素的分数是参与计算的集合中该元素分数最大值

         

          zinterstore 命令还能通过 weights 参数设置每个集合的权重,每个集合在参与计算时元素的分数会被乘上该集合的权重

            如:

                

        计算集合间的并集

            zunionstore 

            用法与 zinterstore 命令的用法一样