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,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。