Redis 数据类型
文章目录
- Redis 数据类型
- 1. String类型
- 2. key的层级结构
- 3. Hash类型
- 4. List类型
- 5. Set类型
- 6. SortedSet类型
1. String类型
String类型是redis中最常用的存储类型,即字符串类型,同时根据字符串的格式不同,可以将value分为三类:
- string:普通字符串
- int:整数类型,可进行自增、自减操作
- float:浮点型,可进行自增、自减操作
无论是整数类型还是浮点型,最后都是以字符串的形式表现出来:
KEY | VALUE |
---|---|
msg | Hello World |
num | 25 |
score | 97.5 |
对于String类型,它有以下常见的命令:
-
SET:添加或修改已经存在的一个String类型的键值对
操作命令如下:
set age 25
注:如果key原本就存在,则set命令会使新添加的相同key的value覆盖之前的值
-
GET:根据key获取String类型的value
操作命令如下:
get age
-
MSET:批量添加多个String类型的键值对
操作命令如下:
mset k1 v1 k2 v2 k3 v3
-
MGET:根据多个key获取多个String类型的value
操作命令如下:
mget k1 k2 k3
-
INCR:让一个整型的key自增1
操作命令如下:
incr age
-
INCRBY:让一个整型的key自增并指定步长
操作命令如下:
incrby age 10
-
INCRBYFLOAT:让一个浮点型的数字自增并指定步长
操作命令如下:
#先设置一个浮点型key
set score 80.5
#之后设置自增命令
incrbyfloat score 5.5
-
SETNX:添加一个String类型的键值对,前提是这个key不存在,否则不执行
操作命令如下:
setnx name2 XiaoMa
如果添加的key存在,则不执行:
-
SETEX:添加一个String类型的键值对,并指定有效期
操作命令如下:
setex name3 20 Mike
2. key的层级结构
Redis的key允许有多个单词形成层级结构,多个单词之间用":
"隔开,如下:
项目名:业务名:类型:id
假设我们的项目名为Test,有user和product两种不同类型的数据,可以这样定义key:
- user相关的key:Test:user:1
- product相关的key:Test:product:2
如果Value是一个对象,则可以将对象序列化为JSON字符串后存储:
KEY | VALUE |
---|---|
Test:user:1 | {“id”:1, “name”:“Jack”, “age”:25} |
Test:product:2 | {“id”:1, “name”:“荣耀70”, “price”: 2550} |
通过图形化界面工具也可看到,刚刚构建的键值对也以层级的形式被构造出来:
3. Hash类型
Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap
结构。
Hash结构可以将对象中的每个字段独立存储,可以针对单个字段作CRUD,即每个key中可以有多个字段,如:
对于Hash类型,它有以下常见命令:
-
HSET:添加或修改hash类型key的field的值
操作命令如下:
hset Test:user:2 name Wangwu
-
HGET:获取一个hash类型key的field的值
操作命令如下:
hget Test:user:2 name
-
HMSET:给指定hash类型的key批量添加多个field的值
操作命令如下:
hmset Test:user:3 name Zhangsan age 20
-
HMGET:获取指定hash类型的key的多个field的值
操作命令如下:
hmget Test:user:3 name age
-
HGETALL:获取一个hash类型的key中的所有的field和value
操作命令如下:
hgetall Test:user:2
-
HKEYS:获取一个hash类型的key中的所有field
操作命令如下:
hkeys Test:user:2
-
HVALS:获取一个hash类型的key中的所有value
操作命令如下:
hvals Test:user:2
-
HINCRBY:让一个hash类型key的字段值(整型)自增长并指定步长
操作命令如下:
hincrby Test:user:2 age 5
-
HSETNX:添加一个hash类型的key的field值,前提是这个field不存在,否则不执行
操作命令如下:
hsetnx Test:user:2 sex man
如果设置的field已存在,则无法执行:
4. List类型
Redis中的List类型与Java中的LinkedList
类似,可以看做是一个双向链表结构。即可以支持正向检索也可以支持反向检索,特征也与LinkedList类似:
- 有序
- 元素可重复
- 插入和删除快
- 查询速度一般
它的结构图如下:
对于List类型,它有以下常见命令:
-
LPUSH:向列表左侧插入一个或多个元素
操作命令如下:
lpush user1 1 2 3
通过图形化界面也能看出,
LPUSH
最先插入的元素为末位: -
LPOP:移除指定数量元素并返回从列表左侧弹出的元素,没有则返回
nil
操作命令如下:
lpop user1
-
RPUSH:向列表右侧插入一个或多个元素
操作命令如下:
rpush user1 4 5 6
通图形化界面也能看出,
RPUSH
最先插入的元素为首位: -
RPOP:移除指定数量元素并返回从列表右侧弹出的元素,没有则返回
nil
操作命令如下:
rpop user1 1
-
LRANGE:返回一段角标分为内的所有元素
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
操作命令如下:
lrange user1 1 3
-
BLPOP & BRPOP:与LPOP和RPOP类似,只不过在没有元素时等待指定时间,而不是直接返回nil
操作命令如下:
先获取一个空的列表,并指定等待时间
blpop user2 100
此时开启一个新的会话并向user2列表中添加元素:
再回到之前的会话就能看到刚刚阻塞中的user2已经获取到了元素(注:只能pop出一个元素):
5. Set类型
Redis的Set结构与Java中的HashSet类似,可以看作是一个value为null的HashMap,因为也是一个hash表,因此具备与HashSet类似的特征:
- 无序
- 元素不可重复
- 查找快
- 支持交集、并集、差集等功能(可用于好友列表等业务中)
对于Set类型,它有以下常见命令:
-
SADD:向set走添加一个或多个元素
操作命令如下:
给zs添加好友lisi、wangwu、zhaoliu
sadd zs lisi wangwu zhaoliu
-
SMEMBERS:获取set中的所有元素
操作命令如下:
smembers zs
-
SREM:移除set中的指定元素
操作命令如下:
srem zs lisi
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
-
SCARD:返回set中的元素个数
操作命令如下:
scard zs
-
SISMEMBER:判断一个元素是否存在于set中
操作命令如下:
sismember zs wangwu
-
SINTER:获取两个集合的交集
操作命令如下:
先再创建一个set ls,它的元素有wangwu、zhaoliu、tianqi
sadd ls wangwu zhaoliu tianqi
之后求zs 和 ls 的交集
sinter zs ls
-
SDIFF:获取两个集合的差集
操作命令如下:
sdiff zs ls
-
SUNION:获取两个集合的并集
操作命令如下:
sunion zs ls
6. SortedSet类型
Redis中的SortedSet是一个可排序的set集合,其中每个元素都带有一个socre属性,可以基于score属性对元素排序(默认为升序),底层的实现是一个跳表加hash表,它具备以下特性:
- 可排序(可用于实现排行榜等业务功能)
- 元素不重复
- 查询速度快
对于SortedSet类型,它有以下常见命令:
-
ZADD:添加一个或多个元素到sorted set,如果已经存在则更新其score值
操作命令如下:
zadd stus 85 Jack 89 Lucy 82 Rose 95 Tom 78 Jerry 92 Amy 76 Miles
通过图形化界面可以看出,添加的元素默认以
升序
的方式排列 -
ZREM:删除sorted set中的一个指定元素
操作命令如下:
zrem stus Lucy
-
ZSCORE:获取sorted set中的指定元素的score值
操作命令如下:
zscore stus Rose
-
ZRANK:获取sorted set中的指定元素的排名
操作命令如下:
zrank stus Tom
注:这里获取到的排名是升序排名,想要获取降序排名的话需要使用ZREVRANK,即在Z后面添加
REV
:操作命令如下:
zrevrank stus Tom
-
ZCARD:获取sorted set中的元素个数
操作命令如下:
zcard stus
-
ZCOUNT:统计score值在给定范围内内的所有元素的个数
操作命令如下:
zcount stus 70 80
-
ZINCRBY:让sorted set中的指定元素自增,步长为指定的
increment
值操作命令如下:
zincrby stus 5 Tom
-
ZRANGE:按照score排序后,获取指定排名范围内的元素
操作命令如下:
zrange stus 0 2
若需要获取降序排列后的元素,则使用ZREVRANGE:
zrevrange stus 0 2
-
ZRANGEBYSCORE:按照score排序后,获取指定score范围内的元素
操作命令如下:
zrangebyscore stus 70 90
若需要获取降序排列后的元素,可以使用ZREVRANGEBYSCORE:
操作命令如下:
zrevrangebyscore stus 90 70
以上就是Redis常用的数据类型了!!