yaycici
还是喜欢网易博客的年代,现在改成lofter之后,几乎没再用了。
2016-09-18

redis五种基本数据结构

1、String  

常用命令:  

除了get、set、incr、decr mget等操作外,Redis还提供了下面一些操作:  

1 SET key value 

此命令用于在指定键设置值

2 GET key 

键对应的值。

3 GETRANGE key start end 

得到字符串的子字符串存放在一个键

4 GETSET key value

设置键的字符串值,并返回旧值

5 GETBIT key offset

返回存储在键位值的字符串值的偏移

6 MGET key1 [key2..]

得到所有的给定键的值

7 SETBIT key offset value

设置或清除该位在存储在键的字符串值偏移

8 SETEX key seconds value

键到期时设置值

9 SETNX key value

设置键的值,只有当该键不存在

10 SETRANGE key offset value

覆盖字符串的一部分从指定键的偏移

11 STRLEN key

得到存储在键的值的长度

12 MSET key value [key value ...]

设置多个键和多个值

13 MSETNX key value [key value ...] 

设置多个键多个值,只有在当没有按键的存在时

14 PSETEX key milliseconds value

设置键的毫秒值和到期时间

15 INCR key

增加键的整数值一次

16 INCRBY key increment

由给定的数量递增键的整数值

17 INCRBYFLOAT key increment

由给定的数量递增键的浮点值

18 DECR key

递减键一次的整数值

19 DECRBY key decrement

由给定数目递减键的整数值

20 APPEND key value

追加值到一个键

  

应用场景:  

String是最常用的一种数据类型,普通的key/value存储都可以归为此类,value其实不仅是String,  

也可以是数字,也可以是可序列化的任意对象。

  

实现方式:  

decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。  


2、Hash

常用命令:  

hget,hset,hgetall 等。  

1 DEL key field2 [field2] 

删除一个或多个哈希字段

2 HEXISTS key field 

判断一个哈希字段存在与否

3 HGET key field 

获取存储在指定的键散列字段的值

4 HGETALL key 

让所有的字段和值在指定的键存储在一个哈希

5 HINCRBY key field increment 

由给定数量增加的哈希字段的整数值

6 HINCRBYFLOAT key field increment 

由给定的递增量哈希字段的浮点值

7 HKEYS key 

获取所有在哈希字段

8 HLEN key 

获取哈希字段数

9 HMGET key field1 [field2] 

获得所有给定的哈希字段的值

10 HMSET key field1 value1 [field2 value2 ] 

设置多个哈希字段的多个值

11 HSET key field value 

设置哈希字段的字符串值

12 HSETNX key field value 

设置哈希字段的值,仅当该字段不存在

13 HVALS key 

获取在哈希中的所有值


应用场景:  

          这里同时需要注意,Redis提供了接口(hgetall)可以直接取到全部的属性数据,但是如果内部Map的成员很多,那么涉及到遍历整个内部Map的操作,由于Redis单线程模型的缘故,这个遍历操作可能会比较耗时,而另其它客户端的请求完全不响应,这点需要格外注意。  


实现方式:  

Redis Hash对应Value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap;当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。  


3、List

常用命令:  

    lpush,rpush,lpop,rpop,lrange,BLPOP(阻塞版)等。  

1 BLPOP key1 [key2 ] timeout 

取出并获取列表中的第一个元素,或阻塞,直到有可用

2 BRPOP key1 [key2 ] timeout 

取出并获取列表中的最后一个元素,或阻塞,直到有可用

3 BRPOPLPUSH source destination timeout 

从列表中弹出一个值,它推到另一个列表并返回它;或阻塞,直到有可用

4 LINDEX key index 

从一个列表其索引获取对应的元素

5 LINSERT key BEFORE|AFTER pivot value 

在列表中的其他元素之后或之前插入一个元素

6 LLEN key 

获取列表的长度

7 LPOP key 

获取并取出列表中的第一个元素

8 LPUSH key value1 [value2] 

在前面加上一个或多个值的列表

9 LPUSHX key value 

在前面加上一个值列表,仅当列表中存在

10 LRANGE key start stop 

从一个列表获取各种元素

11 LREM key count value 

从列表中删除元素

12 LSET key index value 

在列表中的索引设置一个元素的值

13 LTRIM key start stop 

修剪列表到指定的范围内

14 RPOP key 

取出并获取列表中的最后一个元素

15 RPOPLPUSH source destination 

删除最后一个元素的列表,将其附加到另一个列表并返回它

16 RPUSH key value1 [value2] 

添加一个或多个值到列表

17 RPUSHX key value 

添加一个值列表,仅当列表中存在


应用场景:  

         Redis list的应用场景非常多,也是Redis最重要的数据结构之一。  

         可以实现最新消息排行、反向查找和便利等功能。Lists的另一个应用就是消息队列,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。  

  

实现方式:  

         Redis list的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。  

  

4、Set  

常用命令:  

    sadd,srem,spop,sdiff ,smembers,sunion 等。  

 1 ZADD key score1 member1 [score2 member2] 

添加一个或多个成员到有序集合,或者如果它已经存在更新其分数

2 ZCARD key 

得到的有序集合成员的数量

3 ZCOUNT key min max 

计算一个有序集合成员与给定值范围内的分数

4 ZINCRBY key increment member 

在有序集合增加成员的分数

5 ZINTERSTORE destination numkeys key [key ...] 

多重交叉排序集合,并存储生成一个新的键有序集合。

6 ZLEXCOUNT key min max 

计算一个给定的字典范围之间的有序集合成员的数量

7 ZRANGE key start stop [WITHSCORES] 

由索引返回一个成员范围的有序集合。

8 ZRANGEBYLEX key min max [LIMIT offset count] 

返回一个成员范围的有序集合(由字典范围)

9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 

按分数返回一个成员范围的有序集合。

10 ZRANK key member 

确定成员的索引中有序集合

11 ZREM key member [member ...] 

从有序集合中删除一个或多个成员

12 ZREMRANGEBYLEX key min max 

删除所有成员在给定的字典范围之间的有序集合

13 ZREMRANGEBYRANK key start stop 

在给定的索引之内删除所有成员的有序集合

14 ZREMRANGEBYSCORE key min max 

在给定的分数之内删除所有成员的有序集合

15 ZREVRANGE key start stop [WITHSCORES] 

返回一个成员范围的有序集合,通过索引,以分数排序,从高分到低分

16 ZREVRANGEBYSCORE key max min [WITHSCORES] 

返回一个成员范围的有序集合,按分数,以分数排序从高分到低分

17 ZREVRANK key member 

确定一个有序集合成员的索引,以分数排序,从高分到低分

18 ZSCORE key member 

获取给定成员相关联的分数在一个有序集合


应用场景:  

        Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。此外,Redis还为集合提供了求交集、并集、差集等操作。 

  

实现方式:  

         set 的内部实现是一个 value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。  


5、Sorted set  

  常用命令:  

    zadd,zrange,zrem,zcard等  

  1 ZADD key score1 member1 [score2 member2] 

添加一个或多个成员到有序集合,或者如果它已经存在更新其分数

2 ZCARD key 

得到的有序集合成员的数量

3 ZCOUNT key min max 

计算一个有序集合成员与给定值范围内的分数

4 ZINCRBY key increment member 

在有序集合增加成员的分数

5 ZINTERSTORE destination numkeys key [key ...] 

多重交叉排序集合,并存储生成一个新的键有序集合。

6 ZLEXCOUNT key min max 

计算一个给定的字典范围之间的有序集合成员的数量

7 ZRANGE key start stop [WITHSCORES] 

由索引返回一个成员范围的有序集合。

8 ZRANGEBYLEX key min max [LIMIT offset count] 

返回一个成员范围的有序集合(由字典范围)

9 ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT] 

按分数返回一个成员范围的有序集合。

10 ZRANK key member 

确定成员的索引中有序集合

11 ZREM key member [member ...] 

从有序集合中删除一个或多个成员

12 ZREMRANGEBYLEX key min max 

删除所有成员在给定的字典范围之间的有序集合

13 ZREMRANGEBYRANK key start stop 

在给定的索引之内删除所有成员的有序集合

14 ZREMRANGEBYSCORE key min max 

在给定的分数之内删除所有成员的有序集合

15 ZREVRANGE key start stop [WITHSCORES] 

返回一个成员范围的有序集合,通过索引,以分数排序,从高分到低分

16 ZREVRANGEBYSCORE key max min [WITHSCORES] 

返回一个成员范围的有序集合,按分数,以分数排序从高分到低分

17 ZREVRANK key member 

确定一个有序集合成员的索引,以分数排序,从高分到低分

18 ZSCORE key member 

获取给定成员相关联的分数在一个有序集合

19 ZUNIONSTORE destination numkeys key [key ...] 

添加多个集排序,所得排序集合存储在一个新的键

20 ZSCAN key cursor [MATCH pattern] [COUNT count] 

增量迭代排序元素集和相关的分数


  应用场景:  

         Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。  

        另外还可以用Sorted Sets来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。  

        需要精准设定过期时间的应用。比如可以把sorted set的score值设置成过期时间的时间戳,可以通过过期时间排序,定时清除过期数据。

  

  实现方式:  

        Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。  


评论
©yaycici | Powered by LOFTER