Redis 的数据结构
Redis 支持的五种数据结构:String(字符串)、Hash(哈希)、List(列表)、Set(集合)、sorted set(有序集合)
数据结构 | 简介 | 特性 | 应用场景 |
String | 二进制安全 |
1、Redis的String结构包含任何数据类型(比如jpg图片或者序列化对象) 2、一个键最大能存储512M |
-- |
Hash | 元素为Key-value对的集合 | 适合存储对象,可以很好的更新Key的某一项属性值 | 存储、读取、修改用户的属性 |
List | 双向列表 | 增删快、提供操作某一段元素的API |
1、最新消息排行等功能(比如朋友圈的时间线) 2、消息队列 |
Set | Hash表实现,元素不重复 |
1、set集合提供了求交集、并集、差集等操作 2、添加、删除,查找的复杂度都是O(1) |
1、共同好友 2、利用唯一性进行去重统计(统计访问网站的所有独立ip) |
sorted set | 将Set中的元素增加一个权重参数score,元素按score有序排列 | 数据插入集合时候,已经按照score排序 |
1、排行榜 2、带权重的消息队列 |
String(字符串)
- Redis中最基本的数据类型
- String是二进制安全的,即redis 的 string结构可以包含任何数据(比如jpg图片或者序列化的对象)
- string 类型的值最大能存储 512MB
设置 Value 的值
- set key_name value:设置key对应的值
- set name Weiking
- mset key_name1 Value1...key_nameN ValueN:用于设置一组或者多组key和对应的值
- mset Weiking 27 James 35
- setex key_name secones value:设置Key的值和过期时间(单位秒)
- setex age 10 27
- psetex key_name milliseconds value:设置Key的值和过期时间(单位毫秒)
- psetex sex 10000 man
- setrange setrange key_name offset value:修改value部分元素(修改的位置从offset开始,offset从0开始)
- set say "hello world"
- setrange say 6 redis
- Append key_name value:在value后面添加元素
- append say !!!
查询 Value 的值
- get key_name:用于获取指定key的值
- get say
- mget key_name1 ...key_nameN:用于返回多个Key对应的的值(返回的是值的列表)
- mget say name
- getrange key_name start end:用于截取 Key 的元素(start:起始位置;end:结束位置)
- getrange say 0 5
其他命令
- strlen key_name:用于获取 Value 的长度
- strlen say
- incrby key_name number:将 Value 的数值加上指定的增量(如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再加上指定的增量)
- incrby age 27
- incrbyfloat key_name number:将 Value 的数值加上指定的浮点数增量
- incrbyfloat age 12.1
- decrby key_name number:将 Value 的数值减去指定的增量
- decrby age 7
Hash(哈希)
- hash 是一个键值(key=>value)对集合
- hash 是一个 string 类型的 field 和 value 的映射表
- hash 特别适合用于存储对象
- hash 最多可以存储40多亿个键值对(2的32次方- 1)
设置 Value 的值
- hmset/hset key_name field1 value1 ... fieldN valueN:将一个或者多个field-value对添加到到哈希表中
- hset Weiking age 27 sex man
- hmset James age 35 sex man
查询 Value 的值
- hget key_name field:返回哈希表中指定字段的值
- hget James age
- hmget key_name field1 ... fieldN:返回哈希表中一个或者多个字段的值
- hmget James age sex
- hgetall key_name:哈希表中所有的字段和对应的值
- hgetall James
- hkeys key_name:获取哈希表中所有的字段名称
- hkeys James
- hvals key_name:获取哈希表中所有的字段的值
- hvals James
其他命令
- hdel key_name field1 ... fieldN:删除哈希表 Key 中的一个或者多个字段
- hdel Weiking age sex
- hexists key_name field:查看哈希表的指定字段是否存在
- hexists James age
- hlen key_name:用于获取哈希表字段的数量
- hlen James
- hincrby key_name field number:给哈希表中指定的字段加上增量值(增量值可以是正数也可以是负数。正数表示增加;负数表示减去)
- hincrby James age 5
- hincrby James age -10
- hincrbyfloat key_name field numbe:给哈希表中指定的字段加上浮点数增量值
- hincrbyfloat James age 9.99
List(列表)
- List 是简单的字符串列表,按照写入顺序排序(消息队列)
- List 是一个双向列表,可以将一个元素添加到列表的头部或者尾部
- List 最多可以存储40多亿个元素(2的32次方- 1)
设置 Value 的值
- lpush key_name value1 value2 ... valueN:将一个或多个值插入到列表头部
- lpush bigdata Spark
- lpush bigdata Hadoop Hive Hbase Redis
- rpush key_name value1 value2 ... valueN:将一个或多个值插入到列表尾部
- rpush bigdata Kafka
- linsert key_name after/before old_value new_value:将一个值插入到列表指定元素的前面或者后面
- linsert bigdata before Hadoop HDFS
- lset key_name index value:通过索引来设置元素的值
- lset bigdata 3 Yarn
查询 Value 的值
- lrange key_name start end:查询列表中指定区间内的元素
- lrange bigdata 0 1000
- lindex key_name index:通过索引获取列表中的元素
- lindex bigdata 6
其他命令
- llen key_name:查看列表的长度
- llen bigdata
- lpop key_name:移除列表中的第一个元素(返回值为移除的元素)
- lpop bigdata
- rpop key_name:移除列表中最后一个元素(返回值为移除的元素)
- rpop bigdata
- blpop key_name timeout:移除列表中第一个元素;list中没有元素会阻塞列表,直到等待超时或者发现可弹出元素为止(返回值为key_name和移除的元素)
- blpop bigdata 10
- brpop key_name timeout:移除列表中最后一个元素;list中没有元素会阻塞列表,直到等待超时或者发现可弹出元素为止(返回值为key_name和移除的元素)
- brpop bigdata 10
- brpoplpush old_key new_key timeout:从列表中取出最后一个元素放入到一个新的列表中(如果list中没有元素会阻塞列表,直到等待超时或者发现可弹出元素为止)
- brpoplpush bigdata tools 10
- ltrim key_name start end:对列表进行修剪,保留区间内的元素,删除区间外的元素
- ltrim bigdata 1 3
- lrem key_name count value:移除列表中指定的元素
- count>0:从头部开始移除指定的元素,移除的数量为 count
- count<0:从尾部开始移除指定的元素,移除的数量为 count 的绝对值
- count=0:从列表中移除所有值为value的元素
- lrem bigdata 0 Hbase
Set(集合)
- Set 是 string 类型的无序的集合;且不允许重复的元素
- Set 是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)
- Set 集合提供了求交集、并集、差集等操作
- Set 最多可以存储40多亿个元素(2的32次方- 1)
设置 Value 的值
- sadd key_name member1 member2 ... memberN:将一个或者多个元素添加到集合中
- sadd bigdata Hadoop
- sadd bigdata Hive Hive Hbase Redis Kafka Kafka Spark
查询 Value 的值
- smembers key_name:查询集合中所有的元素
- smembers bigdata
- srandmember key_name [count]:随机查询集合中 count 个元素(默认查询一个元素)
- srandmember bigdata
- srandmember bigdata 3
交集、并集和差集操作
- sinter key_name1 ... key_nameN:查询所有集合的交集(不存在的 key 被视为空集)
- sinter bigdata tools
- sinterstore destination_key key_name1 ... key_nameN:将所有集合的交集保存到destination_key集合中
- sinterstore final bigdata tools
- sunion key_name1 ... key_nameN:查询所有集合的并集
- sunion bigdata tools
- sunionstore destination_key key_name1 ... key_nameN:将所有集合的并集保存到destination_key集合中
- sunionstore final bigdata tools
- sdiff key_name1 ... key_nameN:查看第一个集合和其他集合之间的差集(第一个集合-第二个集合-第n个集合)
- sdiff bigdata tools
- sdiffstore destination_key key_name1 ... key_nameN:将给定集合间的差集保存到destination_key集合中(如果指定的集合 destination_key 已存在,则会被覆盖)
- sdiffstore final bigdata tools
其他命令
- scard key_name:查询集合中元素的数量
- scard bigdata
- sismember key_name value:判断元素是否在集合中
- sismember bigdata Spark
- srem key_name value1 ... valueN:移除集合中一个或者多个元素
- srem bigdata Spark
- spop key_name [count]: 随机删除集合中count个元素(默认删除一个元素)
- spop bigdata
- spop bigdata 2
- smove old_key new_key value:将元素从旧集合移到新集合中(smove是原子操作)
- smove bigdata new_bigdata Redis
sorted set(有序集合)
- zset 是 string 类型有序的集合
- zset 中每一个元素都会关联一个 float 类型的分数
- zset 中的元素是唯一的,但是元素所对应的分数是可以重复的
- Redis 通过分数来为zset集合中的元素进行从小到大的排序
- zset 是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)
- zset 最多可以存储40多亿个元素(2的32次方- 1)
设置 Value 的值
- zadd key_name score1 value1 ... scoreN valueN:将一个或多个元素及其分数值加到有序集合中(分数值可以是整数值或浮点数)
- zadd bigdata 100 Flink 100 Spark 50 mapreduce 100 Hdfs 90 Hbase 80 Hive
查询 Value 的值
- zrange key_name start stop [withscores]:查询有序集合中指定区间内的元素(按照分数从小到大顺序排序)
- zrange bigdata 0 100
- zrange bigdata 0 100 withscores
- zrevrange key_name start stop [withscores]:查询有序集合中指定区间内的元素(按照分数从大到小顺序排序)
- zrevrange bigdata 0 100
- zrevrange bigdata 0 100 withscores
- zrangebyscore key_name min max [withscores] [limit offset count]:查询指定分数区间内的元素(按照分数从小到大顺序排序)
- min和max:分数区间的最大值和最小值(取值分别-inf和+inf:查询所有的元素)
- withscores:表示会返回元素和其分数
- limit offset count:指定返回结果的数量及区间(类似sql中select limit offset, count)
- zrangebyscore bigdata -inf +inf withscores limit 0 3
- zrangebyscore bigdata 0 1000 withscores limit 0 3
- zrevrangebyscore key_name max min [withscores] [limit offset count]:查询指定分数区间内的元素(按照分数从大到小顺序排序)
- zrevrangebyscore bigdata inf -inf withscores
- zscore key_name value:查询有序集合中指定元素的分数
- zscore bigdata Spark
- zrank key_name value:查询有序集合中指定元素的索引(按照分数从小到大顺序排序)
- zrank bigdata Spark
- zrevrank key_name value:查询有序集合中指定元素的索引(按照分数从大到小顺序排序)
- zrevrank bigdata Spark
交集、并集操作
- zinterstore destination_key numberskey key_name1 ... key_namen [weights weight1 ...weightn] [aggregate sum|min|max]:将所有集合的交集保存到destination_key集合中
- numberskey:指定有序集合的数量
- weights weight1 ...weightn:每个有序集合都对应一个乘法因子;将有序集合中的元素的分数值都乘以乘法因子(不指定该参数,默认乘法因子为1)
- aggregate:指定交集的结果集中分数值的的聚合方式
- sum:将各个集合中对应的元素乘以乘法因子的和作为结果集中元素的分数值(为默认参数)
- min:将各个集合中对应的元素乘以乘法因子后的最小值作为结果集中元素的分数值
- max:将各个集合中对应的元素乘以乘法因子后的最大值作为结果集中元素的分数值
- 实例:
- zinterstore final 2 bigdata tools weights 5 1
- zinterstore final 2 bigdata tools weights 5 1 AGGREGATE min
- zinterstore final 2 bigdata tools weights 5 1 AGGREGATE max
- zunionstore destination_key numbersKey key_name1 ... key_nameN weights weight1 ...weightN AGGREGATE SUM|MIN|MAX:将所有集合的并集保存到destination_key集合中
- zunionstore final 2 bigdata tools weights 5 1 AGGREGATE max
其他命令
- zcard key_name:计算有序集合中元素数量
- zcard bigdata
- zcount key_name min max:计算有序集合中指定分数区间的元素数量
- zcount bigdata 0 100
- zcount bigdata -inf +inf
- zrem key_name value1 ... valueN:删除有序集合中一个或多个元素
- zrem bigdata Spark
- zremrangebybank key_name start end:删除有序集合中指定区间内的元素
- zremrangebyrank bigdata 0 2
- zremrangebyscore key_name min max:删除有序集合中指定分数间的元素
- zremrangebyscore bigdata 50 90
- zincrby key_name number values:修改有序集合中元素的分数值(number大于0表示增加,小于0表示减小;number可以是整数可以是浮点数)
- zincrby bigdata 100 Flink