Redis五种数据类型和原理和基本操作
redis五种数据结构
说明:
对于Redis来说,它可以存储五种基本数据类型,
redis中所有数据结构都以唯⼀的key字符串作为名称,然后通过这个唯⼀的key来获取对应的value
不同的数据类型数据结构差异就在于value的结构不⼀样
⽽现在的版本中的五种类型是:String(字符串)、Hash、List(列表)、Set(集合)、SortedSet(zSet:有序集合)
⼀、string(字符串)
1)value的数据结构(数组)
字符串是Redis中最常⽤的类型,是⼀个由字节组成的序列,它在Redis中是⼆进制安全的,这便意味着该类型可以接受任何格式的数据,Value最多可以容纳的数据长度为512MB。
字符串value数据结构类似于数组,采⽤与分配内存空间来减少内存频繁分配
如果字符串长度操作1MB时,扩容时最多扩容1MB空间,字符串最⼤长度为 512MB
2)字符串的使⽤场景(缓存)
字符串⼀个常见的⽤途是缓存⽤户信息,我们将⽤户信息使⽤JSON序列化成字符串
取⽤户信息时会经过⼀次反序列化的过程
注意:redis中的Key和Value是区分⼤⼩写的,命令是不区分⼤⼩写的, redis是单线程 不适合存储⼤容量的数据。⾃增的value是可以转成数字的。
基本操作:
⾃加:incr
⾃减:decr
加: incrby
减: decrby
set key value
往key中存⼊⼀个值(value)
get key
获取键为key的值
⼆、list(列表)
1)value的数据结构(双向链表)
Redis的列表允许⽤户从序列的两端推⼊或者弹出元素,列表由多个字符串值组成的有序可重复的序列,获取越接近两端的元素速度就越快。这意味着即使是⼀个有⼏千万个元素的列表,获取头部或尾部的10条记录也是极快的。List中可以包含的最⼤元素数量是4294967295(接近43亿)。
列表的数据结构是双向链表,这意味着插⼊和删除的时间复杂度是0(1),索引的时间复杂度位0(n)
当列表弹出最后⼀个元素后,该数据结构会被⾃动删除,内存被回收
2)列表的使⽤场景(队列、栈)
应⽤场景:1.最新消息排⾏榜。2.消息队列,以完成多程序之间的消息交换。可以⽤push操作将任务存在list中(⽣产者),然后线程在⽤pop操作将任务取出进⾏执⾏(消费者)。
基本操作:
1、redis的LIST结构(想象成java中的List),是⼀个双向链表结构,可以⽤来存储⼀组数据;从这个列表的前端和后端取数据效率⾮常⾼;
2、list的常⽤操作:
RPUSH:在⼀个list最后添加⼀个元素
RPUSH firends “stef”
LPUSH:在⼀个list最前⾯添加⼀个元素
LPUSH firends “stea”
LTRIM key start stop:剪裁⼀个列表,剩下的内容从start到stop;
LTRIM friends 0,3 =>只剩下前4个数据;
LRANGE key start stop:获取列表中的⼀部分数据,两个参数,第⼀个参数代表第⼀个获取元素的位置(0)开始,第⼆个值代表截⽌的元素位置,如果第⼆个参数为-1,截⽌到列表尾部==>LRANGE firends 0 -1
LLEN key: 返回⼀个列表当前长度==>LLEND friends
LPOP:移除list中第⼀个元素,并返回这个元素==>LPOP friends
RPOP:移除list中最后⼀个元素,并返回这个元素==>RPOP friends
三、hash
1)value的数据结构(HashMap)
redis中的字典也是HashMap(数组+列表)的⼆维结构
相当于是⼀个key中存在多个map。Redis中的散列可以看成具有String key和String value的map容器,可以将多个key-value存储到⼀个key中。每⼀个Hash(字典)可以存储4294967295(接近43亿)个键值对。
不同的是redis的字典的值只能是字符串
2)hash的使⽤场景(缓存)
hash结构也可以⽤来缓存⽤户信息,与字符串⼀次性全部序列化整个对象不同,hash可以对每个字段进⾏单独存储
这样可以部分获取⽤户信息,节约⽹络流量
hash的缺点是:hash结构的存储消耗要⾼于单个字符串(消耗内存)
基本操作:
hset:添加hash数据
hget:获取hash数据
hmget:获取多个hash数据
四、set(集合)
1)value的数据结构(字典)
Redis的集合是⽆序且不可重复的,此处的⽆序是数据不能重复。和列表⼀样,在执⾏插⼊和删除以及判断是否存在某元素时,效率是很⾼的。集合最⼤的优势在于可以进⾏交集并集差集操作。Set可包含的最⼤元素数量是4294967295(接近43亿)。
redis中的集合相当于⼀个特殊的字典。
当集合中的最后⼀个元素被移除后,数据结构会被⾃动删除,内存被回收
2)set使⽤场景(有唯⼀性)
set结构可以⽤来存储某个活动中中奖的⽤户ID,因为有去重功能,可以保证同⼀⽤户不会中奖两次
利⽤交集求共同好友。
利⽤唯⼀性,可以统计访问⽹站的所有独⽴IP。
基本操作:
sadd:添加数据
scard:查看set数据中存在的元素个数
sismember:判断set数据中是否存在某个元素
srem:删除某个set数据中的元素
五、zset(有序集合)
有顺序,不能重复!!此处的不能重复是索引为唯⼀的,数据却可以重复。
1)value的数据结构(跳跃列表)
它可以给每⼀个value赋予⼀个score,代表这个value的唯⼀
和Set很像,都是字符串的集合,都不允许重复的成员出现在⼀个set中。他们之间差别在于有序集合中每⼀个成员都会有⼀个分数(score)与之关联,Redis正是通过分数来为集合中的成员进⾏从⼩到⼤的排序。尽管有序集合中的成员必须是唯⼀的,但是分数(score)却可以重复。
zset内部实现⽤的是⼀种叫做“跳跃列表”的数据结构
zset最后⼀个元素被移除后,数据结构就会被⾃动删除,内存也会被回收
2)zset应⽤场景
粉丝列表:value(粉丝ID),score(关注时间),这样可以轻松按关注事件排序
学⽣成绩:value(学⽣ID),score(考试成绩),这样可以轻松对成绩排序
可以⽤于⼀个⼤型在线游戏的积分排⾏榜,每当玩家的分数发⽣变化时,可以执⾏zadd更新玩家分数(score),此后在通过zrange 获取⼏分top
ten的⽤户信息。
基本操作:
zadd zset1 9 a 8 c 10 d 1 e (添加元素 zadd key score member )
(ZRANGE key start stop [WITHSCORES])(查看所有元素:zrange key 0 -1
withscores)
如果要查看分数,加上withscores.
zrange zset1 0 -1 (从⼩到⼤)
zrevrange zset1 0 -1 (从⼤到⼩)
zincrby zset2 score member (对元素member 增加 score)
zadd:添加
zcard:查询
zrange:数据排序
六、总结⼀下五种类型的作⽤
1. String(缓存)
2. List(消息队列)
3. hash(缓存⽤户信息,可以对每个字段进⾏单独存储)
redis支持的五种数据类型4. Set(set类似list,特殊之处是set可以⾃动排重:两个⼈微博的共同好友)
5. ZSet(sorted set可以通过⽤户额外提供⼀个优先级(score)的参数来为成员排序,并且是插⼊有序的,即⾃动排序。)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论