本文介绍Redis的五种主要数据类型,并通过概念、特征、用途以及命令操作几个方面入手,帮助快速掌握基础操作。
文章目录
1.常用数据类型
Redis是一个Key-value
的数据库,key一般是String类型,但value的数据类型多种多样,这里主要介绍常用数据类型。
数据类型 | 描述 |
---|---|
String | hello world |
Hash | {name: "Jack", age: 21} |
List | [A -> B -> C -> C] |
Set | {A, B, C} |
SortedSet | {A: 1, B: 2, C: 3} |
2.常用命令操作
表中命令具体用法可以通过help [command]
查看,如图所示
1️⃣ 通用命令
通用指令是部分数据类型的,都可以使用的指令,常见的指令如下
命令 | 描述 |
---|---|
KEYS | 查看符合模板的所有key |
DEL | 删除一个指定的key |
EXISTS | 判断key是否存在 |
EXPIRE | 给一个key设置有效期,有效期到期时该key会自动删除 |
TTL | 查看一个KEY的剩余有效期 |
2️⃣ String类型
String类型,也就是字符串类型,是Redis最简单的存储类型。其value是字符串,通过字符串的格式不同,可以分为string
、int
、float
三类。
String
:普通字符串。
int
:整数类型,可以做自增、自减操作。
float
:浮点类型,可以做自增、自减操作。
String类型底层都是字节数组形式存储,只不过是编码方式不同。字符串类型最大空间不能超过512MB。
String类型常见命令
命令 | 描述 |
---|---|
SET | 添加或者修改已经存在的一个String类型的键值对 |
GET | 根据key获取String类型的value |
MSET | 批量添加多个String类型的键值对 |
MGET | 根据多个key获取多个String类型的value |
INCR | 让一个整型的key自增1 |
INCRBY | 让一个整型的key自增并指定步长,例如:incrby num 2 让num值自增2 |
INCRBYFLOAT | 让一个浮点类型的数字自增并指定步长 |
SETNX | 添加一个String类型的键值对,前提是这个key不存在,否则不执行 |
SETEX | 添加一个String类型的键值对,并且指定有效期 |
3️⃣ Hash类型
Hash类型,也叫散列,其Value是一个无序字典,类似于Java中的HashMap结构。
String结构是将对象序列化为JSON字符串后存储,当需要修改对象某个字段时很不方便,而Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD:
使用String存储
KEY | VALUE |
---|---|
sky:user:1 | {“id”:1, “name”: “Jack”, “age”: 21} |
sky:user:2 | {“id”:2, “name”: “Rose”, “age”: 18} |
使用Hash存储
Hash类型的常见命令
命令 | 描述 |
---|---|
HSET | 添加或者修改hash类型key的field的值 |
HGET | 获取一个hash类型key的field的值 |
HMSET | 批量添加多个hash类型key的field的值 |
HMGET | 批量获取多个hash类型key的field的值 |
HGETALL | 获取一个hash类型的key中的所有的field和value |
HKEYS | 获取一个hash类型的key中的所有的field |
HINCRBY | 让一个hash类型key的字段值自增并指定步长 |
HSETNX | 添加一个hash类型的key的field值,前提是这个field不存在,否则不执行 |
4️⃣ List类型
Redis中的List类型与Java中的ListedList类型,可以看作是一个双向链表结构。可以支持正向检索与反向检索。
特征与LinkedList类似,有着有序
、元素可以重复
、插入和删除快
、查询速度一般
。
使用场景:朋友圈点赞列表,评论等。
List类型常见命令
命令 | 描述 |
---|---|
LPUSH | 向列表左侧插入一个或多个元素 |
LPOP | 移除并返回列表左侧的第一个元素,没有则返回nil |
RPUSH | 向列表右侧插入一个或多个元素 |
RPOP | 移除并返回列表右侧的第一个元素 |
LRANGE | 返回一段角标范围内的所有元素 |
BLPOP | 与LPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil |
BRPOP | 与RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil |
拓展:List模拟栈,队列,阻塞队列
使用List结构模拟一个栈:入口和出口在同一边
使用List结构模拟一个队列:入口和出口在不同边
使用List结构模拟一个阻塞队列:入口和出口在不同边,且出队采用BLPOP
与BRPOP
5️⃣ Set类型
Redis的Set结构与java中的HashSet类似,可以看作是value为null的HashMap。
特征:因为也是hash表,具备与HashSet类似的特征,如无序
、元素不可重复
、查找快
,且多了一个功能支持交集、并集、差集
等功能。
使用场景:好友列表,共同好友等。
Set类型常见命令
命令 | 描述 |
---|---|
SADD | 向set中添加一个或多个元素 |
SREM | 移除set中的指定元素 |
SCARD | 返回set中元素的个数 |
SISMEMBER | 判断一个元素是否存在于set中 |
SMEMBERS | 获取set中的所有元素 |
SINTER | 求key1与key2的交集 |
6️⃣ SortedSet类型
Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表。
特征:可排序
、元素不重复
、查询速度快
使用场景:排行榜等功能(可排序性)
SortedSet类型常见指令
命令 | 描述 |
---|---|
ZADD | 添加一个或多个元素到sorted set,如果已经存在则更新其score值 |
ZREM | 删除sorted set中的一个指定元素 |
ZSCORE | 获取sorted set中的指定元素的score值 |
ZRANK | 获取sorted set中的指定元素的排名 |
ZCARD | 获取sorted set中的元素个数 |
ZCOUNT | 统计score值在给定范围内的所有元素的个数 |
ZINCRBY | 让sorted set中的指定元素自增,步长为指定的increment值 |
ZRANGE | 按照score排序后,获取指定排名范围内的元素 |
ZRANGEBYSCORE | 按照score排序后,获取指定score范围内的元素 |
ZDIFF | 求差集 |
ZINTER | 求交集 |
ZUNION | 求并集 |
所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可
升序获取sorted set 中的指定元素的排名:ZRANK key member
降序获取sorted set 中的指定元素的排名:ZREVRANK key memeber
3.拓展知识点
key的结构
问题:Redis没有像Mysql那样,拥有着Table的概念,所以我们如何区分不同类型的key呢?
Redis的key允许多个单词形成层级结构,多个单词之间可以用:
隔开,因此我们有着对应的存储格式。这个格式并非固定,可以根据需求增加或删除词条。
存储格式:[项目名]:[业务名]:[类型]:[id]
示例:sky:user:1
Value同样如此,如果Value是Java对象,可以将对象序列化为JSON字符串后存储,使用格式:
KEY | VALUE |
---|---|
sky:user:1 | {“id”:1, “name”: “Jack”, “age”: 21} |
sky:user:2 | {“id”:2, “name”: “Rose”, “age”: 18} |
🎉 总结
通过本文的学习,您已经掌握了:
- ✅ Redis五种主要数据类型的核心概念和特性
- ✅ 每种数据类型的典型使用场景和应用
- ✅ 通用命令和各数据类型的常用操作命令
- ✅ key的层级结构设计和最佳实践
下一步: 学习如何在Java中使用Redis
本文为Redis学习笔记,持续更新中…
如果我的内容对你有帮助,希望可以收获你的点赞、评论、收藏。