Redis的五种数据类型、⽅法、底层数据结构
1、字符串string
2、列表list
3、散列hash
4、集合set
5、有序集合sorted set
字符串string:
字符串类型是Redis中最为基础的数据存储类型,是⼀个由字节组成的序列,他在Redis中是⼆进制安全的,这便意味着该类型可以接受任何格式的数据,如JPEG图像数据货Json对象描述信息等,是标准的key-value,⼀般来存字符串,整数和浮点数。Value最多可以容纳的数据长度为512MB
应⽤场景:很常见的场景⽤于统计⽹站访问数量,当前在线⼈数等。incr命令(++操作)
列表list:
Redis的列表允许⽤户从序列的两端推⼊或者弹出元素,列表由多个字符串值组成的有序可重复的序列,是链表结构,所以向列表两端添加元素的时间复杂度为0(1),获取越接近两端的元素速度就越快。这意味着即使是⼀个有⼏千万个元素的列表,获取头部或尾部的10条记录也是极快的。List中可以包含的最⼤元素数量是4294967295。
应⽤场景:1.最新消息排⾏榜。2.消息队列,以完成多程序之间的消息交换。可以⽤push操作将任务存在list中(⽣产者),然后线程在⽤pop操作将任务取出进⾏执⾏。(消费者)
散列hash:
Redis中的散列可以看成具有String key和String value的map容器,可以将多个key-value存储到⼀个key中。每⼀个Hash可以存储4294967295个键值对。
应⽤场景:例如存储、读取、修改⽤户属性(name,age,pwd等)
集合set:
Redis的集合是⽆序不可重复的,和列表⼀样,在执⾏插⼊和删除和判断是否存在某元素时,效率是很⾼的。集合最⼤的优势在于可以进⾏交集并集差集操作。Set可包含的最⼤元素数量是4294967295。
应⽤场景:1.利⽤交集求共同好友。2.利⽤唯⼀性,可以统计访问⽹站的所有独⽴IP。3.好友推荐的时候根据tag求交集,⼤于某个threshold(临界值的)就可以推荐。
有序集合sorted set:
和set很像,都是字符串的集合,都不允许重复的成员出现在⼀个set中。他们之间差别在于有序集合中每⼀个成员都会有⼀个分数(score)与之关联,Redis正是通过分数来为集合中的成员进⾏从⼩到⼤的排序。尽管有序集合中的成员必须是唯⼀的,但是分数(score)却可以重复。
应⽤场景:可以⽤于⼀个⼤型在线游戏的积分排⾏榜,每当玩家的分数发⽣变化时,可以执⾏zadd更新玩家分数(score),此后在通过zrange获取⼏分top ten的⽤户信息。
最后,还有个对key的通⽤操作,所有的数据类型都可以使⽤的
=========
zset
zset底层存储结构
zset底层的存储结构包括ziplist或skiplist,在同时满⾜以下两个条件的时候使⽤ziplist,其他时候使⽤skiplist,两个条件如下:有序集合保存的元素数量⼩于128个
有序集合保存的所有元素的长度⼩于64字节
redis配置⽂件中⽤来控制zset到底是使⽤ziplist(压缩双向链表)还是skiplist(跳表)的参数:
zset-max-ziplist-entries 128
zset-max-ziplist-value 64
zset-max-ziplist-entries zset使⽤ziplist存储的时候,最⼤限制存储entries的个数
zset-max-ziplist-value zset使⽤ziplist存储的时候,每个节点最⼤存储字节数
违反上述两个限制条件,均会导致zset将ziplist的数据结构切换为skiplist数据结构
⽽zset使⽤ziplist的原因,主要是出于在零散数据量少的时候,节省内容的占⽤
当ziplist作为zset的底层存储结构时候,每个集合元素使⽤两个紧挨在⼀起的压缩列表节点来保存,第⼀个节点保存元素的成员,第⼆个元素保存元素的分值。
当skiplist作为zset的底层存储结构的时候,使⽤skiplist按序保存元素及分值,使⽤dict来保存元素和分值的映射关系。
操作单个zset的redis命令
1、添加,如果值存在添加,将会重新排序。zadd
127.0.0.1:6379>zadd myZSet 1 zlh ---添加分数为1,值为zlh的zset集合
127.0.0.1:6379>zadd mySet 2 Tom 3 Jim ---添加2条zset集合,分别为分数为2、3,值为tom、jim的集合。
2、查看zset集合的成员个数。zcard
127.0.0.1:6379>zcard myZSet ---输出zset的成员个数为3
3、查看Zset指定范围的成员,withscores为输出结果带分数。zrange
127.0.0.1:6379>zrange mZySet 0 -1 ----0为开始,-1为结束,输出顺序结果为: zlh tom jim
127.0.0.1:6379>zrange mZySet 0 -1 withscores ---输出带分数的结果为:zlh 1 tom 2 jim 3
4、获取zset成员的下标位置,如果值不存在返回null。zrank
127.0.0.1:6379>zrank mZySet Jim ---Jim的在zset集合中的下标为2
5、获取zset集合指定分数之间存在的成员个数。zcount
127.0.0.1:6379>zcount mySet 1 3 ---输出分数>=1 and 分数 <=3的成员个数为3,因为分数是可以重复的,所以这个命令是有道理的。
6、删除指定的⼀个成员或多个成员。zrem
127.0.0.1:6379>zrem myZSet zlh --删除值为zlh的zset成员
127.0.0.1:6379>zrem myZSet Tom Jim ---删除值为Tom和Jim的两个zset成员
7、获取指定值的分数。zscore
127.0.0.1:6379>zadd myZset 1 zlh 1 tom 2 jim 3 xdd 4 pmm ---由于上⾯的数据被删除完了,这⾥添加5条⽰范数据再。
127.0.0.1:6379>zscore myZset zlh ---输出值为zlh的分数为1
8、给指定元素的分数进⾏增减操作,负值为减,正值为加。zincrby
127.0.0.1:6379>zscore myZset tom ----输出tom的分数为1
127.0.0.1:6379>zincrby myZset 4 tom ---tom的分数值加4,输⼊分数值为5
127.0.0.1:6379>zscore myZset tom ---输出tom的分数值为5
9、根据指定分数的范围获取值。zrangebysocre
127.0.0.1:6379>zrangebyscore myZset 1 5 ---输出分数>=1 and <=5的成员值为:zlh jim xdd pmm tom
127.0.0.1:6379>zrangebyscore myZset (1 5 ----输出分数>1 and <=5的成员值为:jim xdd pmm tom
127.0.0.1:6379>zrangebyscore myZset 2 5 limit 1 2 ---检索分数为2到5之间的数据,然后从下标为1的数据开始往后输出2个数据,包含下标为1的数据。结果为:xdd pmm
127.0.0.1:6379>zrangebyscore myZset -inf +inf limit 2 3 ----+inf表⽰最后⼀个成员,-inf表⽰第⼀个成员,意思是:检索所有数据,然后从下标为2的数据开始再往后输出2个数据。结果为:xdd pmm tom
10、倒序,从⾼到底排序输出指定范围的数据。zrevrange,zrevrangebyscore
redis支持的数据结构127.0.0.1:6379>zrevrange myZset 2 3 ---先倒序排列数据,输出下标为>=2 and <=3的数据为xdd jim,这⾥注意的是倒序之后下标也反过来了。
127.0.0.1:6379>zrevrange myZset 2 4 withscores ---输出结果为:xdd 3 jim 2 zlh 1
127.0.0.1:6379>zrevrangebyscore myZset 5 1 limit 3 2 ----输出结果为:jim zlh 。获取score <=5 and >=1,从下标为为3开始获取2条数据。
127.0.0.1:6379>zrevrangebyscore myZset 4 2 ----分数>=2 and <=4 的数据倒序输出:pmm xdd jim
11、根据坐标,分数范围删除数据。zremrangebyscore,zremrangebyrank
127.0.0.1:6379>zremrangebyscore myZset 1 2 ---删除分数>=1 and <=2的数据
127.0.0.1:6379>zrange myZset 0 -1 ----输出结果为 xdd pmm tom
127.0.0.1:6379>zremrangebyrank myZset 0 2 ---删除下标>=0 and <=2的zset元素
127.0.0.1:6379>zrange myZset 0 -1 --输出结果为:empty list or set 。没数据啦。
操作多个zset的redis命令
1、求多个zset的并集
127.0.0.1:6379>zadd myZset 1 zlh 2 jim 3 tom ---添加3个数据
127.0.0.1:6379>zadd youZset 1 zlh 2 xdd 3 pmm ---添加3个数据
127.0.0.1:6379>zunionzstore heZset 2 myZset youZset ----将myzset和youzset的并集添加到hezset中。
2、求多个zset的交集
127.0.0.1:6379>zinterstore sheZset 2 myZset youZset ----将myzset和youZset 的交集添加到sheZset中。
===图解redis五种数据结构底层实现===========
redis有五种基本数据结构:字符串、hash、set、zset、list。但是你知道构成这五种结构的底层数据结构是怎样的吗? 今天我们来花费五分钟的时间了解⼀下。 (⽬前redis版本为3.0.6)
动态字符串SDS
SDS是"simple dynamic string"的缩写。 redis中所有场景中出现的字符串,基本都是由SDS来实现的
所有⾮数字的key。例如 set msg"hello world" 中的key msg.字符串数据类型的值。例如`` set msg "hello world"中的msg的值"hello wolrd"⾮字符串数据类型中的“字符串值”。例如 RPUSH fruits"apple""banana""cherry"中的"apple" "banana" "cherry"SDS长这样:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论