本文主要是介绍Redis5种数据类型,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、String(字符串)
在任何一种编程语言里,字符串String
都是最基础的数据结构, 那你有想过Redis
中存储一个字符串都进行了哪些操作嘛?
在Redis
中String
是可以修改的,称为动态字符串
(Simple Dynamic String
简称 SDS
),说是字符串但它的内部结构更像是一个 ArrayList
,内部维护着一个字节数组,并且在其内部预分配了一定的空间,以减少内存的频繁分配。
Redis
的内存分配机制是这样:
-
当字符串的长度小于 1MB时,每次扩容都是加倍现有的空间。
-
如果字符串长度超过 1MB时,每次扩容时只会扩展 1MB 的空间。
这样既保证了内存空间够用,还不至于造成内存的浪费,字符串最大长度为 512MB
1、应用场景:
存储key-value键值对,这个比较简单不细说了
2、字符串(String)常用的命令:
set [key] [value] 给指定key设置值(set 可覆盖老的值)get [key] 获取指定key 的值del [key] 删除指定keyexists [key] 判断是否存在指定keymset [key1] [value1] [key2] [value2] ...... 批量存键值对mget [key1] [key2] ...... 批量取keyexpire [key] [time] 给指定key 设置过期时间 单位秒setex [key] [time] [value] 等价于 set + expire 命令组合setnx [key] [value] 如果key不存在则set 创建,否则返回0incr [key] 如果value为整数 可用 incr命令每次自增1incrby [key] [number] 使用incrby命令对整数值 进行增加 number
二、list(列表)
Redis
中的list
和Java
中的LinkedList
很像,底层都是一种链表结构, list
的插入和删除操作非常快,时间复杂度为 0(1),不像数组结构插入、删除操作需要移动数据。
像归像,但是redis
中的list
底层可不是一个双向链表那么简单。
当数据量较少的时候它的底层存储结构为一块连续内存,称之为ziplist(压缩列表)
,它将所有的元素紧挨着一起存储,分配的是一块连续的内存;当数据量较多的时候将会变成quicklist(快速链表)
结构。
可单纯的链表也是有缺陷的,链表的前后指针 prev
和 next
会占用较多的内存,会比较浪费空间,而且会加重内存的碎片化。在redis 3.2之后就都改用ziplist+链表
的混合结构,称之为 quicklist(快速链表)
。
1、应用场景:
由于list它是一个按照插入顺序排序的列表,所以应用场景相对还较多的,例如:
-
消息队列:
lpop
和rpush
(或者反过来,lpush
和rpop
)能实现队列的功能 -
朋友圈的点赞列表、评论列表、排行榜:
lpush
命令和lrange
命令能实现最新列表的功能,每次通过lpush
命令往列表里插入新的元素,然后通过lrange
命令读取最新的元素列表。
2、list操作的常用命名:
127.0.0.1:6379> lpush summer xiaxinyu
(integer) 1
127.0.0.1:6379> lpush summer 30
(integer) 2
127.0.0.1:6379> lpush summer "java engineer"
(integer) 3
127.0.0.1:6379> lrange summer 0 10
1) "java engineer"
2) "30"
3) "xiaxinyu"
三、hash (字典)
Redis
中的 Hash
和 Java的 HashMap
更加相似,都是数组+链表
的结构,当发生 hash 碰撞时将会把元素追加到链表上,值得注意的是在 Redis
的 Hash
中 value
只能是字符串.
Hash
和String
都可以用来存储用户信息 ,但不同的是Hash
可以对用户信息的每个字段单独存储;String
存的是用户全部信息经过序列化后的字符串,如果想要修改某个用户字段必须将用户信息字符串全部查询出来,解析成相应的用户信息对象,修改完后在序列化成字符串存入。而 hash可以只对某个字段修改,从而节约网络流量,不过hash内存占用要大于 String
,这是 hash
的缺点。
1、应用场景:
- 购物车:
hset [key] [field] [value]
命令, 可以实现以用户Id
,商品Id
为field
,商品数量为value
,恰好构成了购物车的3个要素。 - 存储对象:
hash
类型的(key, field, value)
的结构与对象的(对象id, 属性, 值)
的结构相似,也可以用来存储对象。
2、hash常用的操作命令:
127.0.0.1:6379> HMSET summer name "xiaxinyu" description "java engineer" age 30 colleage "sz university"
OK
127.0.0.1:6379> HGETALL summer
1) "name"
2) "xiaxinyu"
3) "description"
4) "java engineer"
5) "age"
6) "30"
7) "colleage"
8) "sz university"
127.0.0.1:6379> HGET summer name
"xiaxinyu"
四、set(集合)
Redis
中的 set
和Java
中的HashSet
有些类似,它内部的键值对是无序的、唯一 的。它的内部实现相当于一个特殊的字典,字典中所有的value都是一个值 NULL。当集合中最后一个元素被移除之后,数据结构被自动删除,内存被回收。
1、应用场景:
- 好友、关注、粉丝、感兴趣的人集合:
sinter
命令可以获得A和B两个用户的共同好友;sismember
命令可以判断A是否是B的好友;scard
命令可以获取好友数量;- 关注时,
smove
命令可以将B从A的粉丝集合转移到A的好友集合
- 首页展示随机:美团首页有很多推荐商家,但是并不能全部展示,set类型适合存放所有需要展示的内容,而
srandmember
命令则可以从中随机获取几个。 - 存储某活动中中奖的用户ID ,因为有去重功能,可以保证同一个用户不会中奖两次。
2、set的常用命令:
127.0.0.1:6379> sadd lang java
(integer) 1
127.0.0.1:6379> sadd lang c#
(integer) 1
127.0.0.1:6379> sadd lang javascript
(integer) 1
127.0.0.1:6379> sadd lang java
(integer) 0
127.0.0.1:6379> SMEMBERS lang
1) "c#"
2) "javascript"
3) "java"
127.0.0.1:6379> scard lang
(integer) 3
五、zset(有序集合)
zset
也叫SortedSet
一方面它是个 set
,保证了内部 value 的唯一性,另方面它可以给每个 value 赋予一个score
,代表这个value的排序权重。它的内部实现用的是一种叫作“跳跃列表
”的数据结构。
1、应用场景:
zset
可以用做排行榜,但是和list
不同的是zset
它能够实现动态的排序,例如: 可以用来存储粉丝列表,value 值是粉丝的用户 ID,score 是关注时间,我们可以对粉丝列表按关注时间进行排序。
zset
还可以用来存储学生的成绩, value
值是学生的 ID, score
是他的考试成绩。 我们对成绩按分数进行排序就可以得到他的名次。
2、zset有序集合的常用操作命令:
127.0.0.1:6379> zadd lang 1 java
(integer) 1
127.0.0.1:6379> zadd lang 2 c#
(integer) 1
127.0.0.1:6379> zadd lang 3 javascript
(integer) 1
127.0.0.1:6379> zadd lang 3 javascript
(integer) 0
127.0.0.1:6379> zadd lang 4 grovy
(integer) 1
127.0.0.1:6379> zrange lang 0 10
1) "java"
2) "c#"
3) "javascript"
4) "grovy"
127.0.0.1:6379> zrange lang 0 10 withscores
1) "java"
2) "1"
3) "c#"
4) "2"
5) "javascript"
6) "3"
7) "grovy"
8) "4"
127.0.0.1:6379> zrange lang 2 3 withscores
1) "javascript"
2) "3"
3) "grovy"
4) "4"
这篇关于Redis5种数据类型的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!