四、redis数据类型
redis可以理解成一个全局的大字典,key就是数据的唯一标识符。根据key对应的值不同,可以划分成5个基本数据类型。
1. string类型:
字符串类型,是 Redis 中最为基础的数据存储类型,它在 Redis 中是二进制安全的,也就是byte类型。
单个数据的最大容量是512M。
key: 值
2. hash类型:
哈希类型,用于存储对象/字典,对象/字典的结构为键值对。key、域、值的类型都为string。域在同一个hash中是唯一的。
key:{
域(属性): 值,
域:值,
域:值,
域:值,
...
}
3. list类型:
列表类型,它的子成员类型为string。
key: [值1,值2, 值3.....]
4. set类型:
无序集合,它的子成员类型为string类型,元素唯一不重复,没有修改操作。
key: {值1, 值4, 值3, ...., 值5}
5. zset类型(sortedSet):
有序集合,它的子成员值的类型为string类型,元素唯一不重复,没有修改操作。权重值(score,分数)从小到大排列。
key: {
值1 权重值1(数字);
值2 权重值2;
值3 权重值3;
值4 权重值4;
}
针对各种数据类型它们的特性,使用场景如下:
字符串string: 用于保存项目中普通数据,只要键值对都可以保存,例如,保存 session/jwt,定时记录状态,倒计时、验证码、防灌水答案 哈希hash:用于保存项目中的一些结构体/map类型数据,但是不能保存多维结构,例如,商城的购物车,文章信息,json结构数据 列表list:用于保存项目中的列表/切片数据,但是也不能保存多维结构,例如,消息队列,秒杀系统,排队, 无序集合set: 用于保存项目中的一些不能重复的数据,可以用于过滤,例如,候选人名单, 作者名单, 有序集合zset:用于保存项目中一些不能重复,但是需要进行排序的数据,例如:分数排行榜, 海选人排行榜,热搜排行,
4.1. string(字符串)
GET/MGET
SET/SETEX/MSET/MSETNX
INCR/DECR
GETSET
DEL
1. 设置键值
set 设置的数据没有额外操作时,是不会过期的。
设置键为name
值为yuan
的数据
1
2
set name yuan
set name rain
注意:redis中的所有数据操作,如果设置的键不存在则为添加,如果设置的键已经存在则修改。
设置一个键,当键不存在时才能设置成功,用于一个变量只能被设置一次的情况。
一般用于给数据加锁(分布式锁)
1
2
3
4
5
6
7
8
9
127.0.0.1:6379> setnx goods_1 101
(integer ) 1
127.0.0.1:6379> setnx goods_1 102
(integer ) 0
127.0.0.1:6379> del goods_1
(integer ) 1
127.0.0.1:6379> setnx goods_1 102
(integer ) 1
2. 设置键值的过期时间
redis中可以对一切的数据进行设置有效期。以秒为单位
1
setex key seconds value
设置键为goods_1
值为101
过期时间为10秒的数据
3. 关于设置保存数据的有效期
setex 添加保存数据到redis,同时设置有效期,格式:
4. 设置多个键值
1
mset key1 value1 key2 value2 ...
例3:设置键为a1
值为goland
、键为a2
值为java
、键为a3
值为c
1
mset a1 goland a2 java a3 c
5. 字符串拼接值
常见于大文件上传
向键为a1
中拼接值haha
1
2
3
set title "我的"
append title "redis"
append title "学习之路"
6. 根据键获取值
根据键获取值,如果不存在此键则返回nil
获取键name
的值
根据多个键获取多个值
获取键a1、a2、a3
的值
getset:设置key的新值,返回旧值
1
2
3
4
5
6
7
8
9
10
redis> GETSET db mongodb
(nil)
redis> GET db
"mongodb"
redis> GETSET db redis
"mongodb"
redis> GET db
"redis"
7. 自增自减
web开发中的电商抢购、秒杀。游戏里面的投票、攻击计数。系统中计算当前在线人数、
1
2
3
4
5
6
7
8
9
10
11
12
13
14
set id 1
incr id
get id
incr id
get id
set goods_id_1 10
decr goods_id_1
get goods_id_1
decr goods_id_1
get goods_id_1
set age 22
incrby age 2
8. 获取字符串的长度
1
2
set name xiaoming
strlen name
9. 比特流操作
1字节=8比特 1kb = 1024字节 1mb = 1024kb 1gb = 1024mb
1个int8就是一个字节,一个中文:3个字节
签到记录
1
2
3
4
SETBIT
GETBIT
BITCOUNT
BITPOS
终端操作:
1
2
3
4
5
6
7
8
9
10
11
12
SETBIT mykey 7 1
getbit mykey 7
SETBIT mykey 4 1
SETBIT mykey 15 1
BITCOUNT mykey
BITPOS mykey 1
4.2. key操作
redis中所有的数据都是通过key(键)来进行操作,这里我们学习一下关于任何数据类型都通用的命令。
(1)查找键
参数支持简单的正则表达式
查看所有键
例子:
1
2
3
4
5
6
keys *a*
keys a*
keys *a
(2)判断键是否存在
如果存在返回1
,不存在返回0
判断键title
是否存在
(3)查看键的的值的数据类型
查看键的值类型
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
type a1
sadd member_list xiaoming xiaohong xiaobai
type member_list
hset user_1 name xiaobai age 17 sex 1
type user_1
lpush brothers zhangfei guangyu liubei xiaohei
type brothers
zadd achievements 61 xiaoming 62 xiaohong 83 xiaobai 78 xiaohei 87 xiaohui 99 xiaolong
type achievements
(4)删除键以及键对应的值
(5)查看键的有效期
(6)设置key的有效期
给已有的数据重新设置有效期,redis中所有的数据都可以通过expire来设置它的有效期。有效期到了,数据就被删除。
(7)清空所有key
慎用,一旦执行,则redis所有数据库0~15的全部key都会被清除
(8)key重命名
把name重命名为username
1
2
3
set name yuan
rename name username
get username
select切换数据库
1
2
redis的配置文件中,默认有0~15之间的16个数据库,默认操作的就是0号数据库
select <数据库ID>
操作效果:
1
2
3
4
5
6
7
8
9
10
11
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> set name xiaoming
OK
127.0.0.1:6379[1]> select 2
OK
127.0.0.1:6379[2]> set name xiaohei
OK
4.3. list(数组)
队列,列表的子成员类型为string
(1)添加子成员
1
2
3
4
5
6
7
8
9
lpush key value1 value2 ...
rpush key value1 value2 ...
linsert key before 指定元素 value1 value2 ....
linsert key after 指定元素 value1 value2 ....
从键为brother
的列表左侧添加一个或多个数据liubei、guanyu、zhangfei
1
2
3
4
lpush brother liubei
lpush brother guanyu zhangfei xiaoming
从键为brother的列表右侧添加一个或多个数据,xiaohong,xiaobai,xiaohui
1
2
3
4
rpush brother xiaohong
rpush brother xiaobai xiaohui
从key=brother,key=xiaohong的列表位置左侧添加一个数据,xiaoA,xiaoB
1
2
3
4
linsert brother before xiaohong xiaoA
linsert brother before xiaohong xiaoB
从key=brother,key=xiaohong的列表位置右侧添加一个数据,xiaoC,xiaoD
1
2
3
4
linsert brother after xiaohong xiaoC
linsert brother after xiaohong xiaoD
注意:当列表如果存在多个成员值一致的情况下,默认只识别第一个。
1
2
3
4
5
6
127.0.0.1:6379> linsert brother before xiaoA xiaohong
127.0.0.1:6379> linsert brother before xiaohong xiaoE
127.0.0.1:6379> linsert brother after xiaohong xiaoF
(2)获取列表成员
根据指定的索引(下标)获取成员的值,负数下标从右边-1开始,逐个递减
获取brother下标为2以及-2的成员
1
2
3
4
5
6
del brother
lpush brother guanyu zhangfei xiaoming
lindex brother 2
lindex brother -2
移除并获取列表的第一个成员或最后一个成员
获取并移除brother中的第一个成员
(3)获取列表的切片
闭区间[包括stop]
操作:
1
2
3
4
5
6
7
8
del brother
rpush brother liubei guanyu zhangfei xiaoming xaiohong
lrange brother 0 -1
lrange brother 0 1
lrange brother -2 -1
(4)获取列表的长度
获取brother列表的成员个数
(5)按索引设置值
1
2
3
4
lset key index value
修改键为brother
的列表中下标为4
的元素值为xiaohongmao
1
lset brother 4 xiaohonghong
(6)删除指定成员
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
lrem key count value
del brother
rpush brother A B A C A
lrem brother 0 A
["B" ,"C" ]
del brother
rpush brother A B A C A
lrem brother -2 A
["A" ,"B" ,"C" ]
del brother
rpush brother A B A C A
lrem brother 2 A
["B" ,"C" ,"A" ]
4.4. hash(哈希)
专门用于结构化的数据信息。对应的就是map/结构体
结构:
1
2
3
4
5
键key:{
域field: 值value,
域field: 值value,
域field: 值value,
}
(1)设置指定键的属性/域
设置指定键的单个属性
设置键 user_1
的属性name
为xiaoming
1
2
3
4
5
6
7
8
9
10
11
127.0.0.1:6379> hset user_1 name xiaoming
(integer ) 1
127.0.0.1:6379> hset user_1 name xiaohei
(integer ) 0
127.0.0.1:6379> hset user_1 age 16
(integer ) 1
127.0.0.1:6379> hset user:1 name xiaohui
(integer ) 1
127.0.0.1:6379> hset user:1 age 15
(integer ) 1
127.0.0.1:6379> hset user:2 name xiaohong age 16
(2)获取指定键的域/属性的值
获取指定键所有的域/属性
获取键user的所有域/属性
1
2
3
4
5
6
7
127.0.0.1:6379> hkeys user:2
1) "name"
2) "age"
127.0.0.1:6379> hkeys user:3
1) "name"
2) "age"
3) "sex"
获取指定键的单个域/属性的值
hget key field
获取键user:3
属性name
的值
1
2
127.0.0.1:6379> hget user:3 name
"xiaohong"
获取指定键的多个域/属性的值
1
hmget key field1 field2 ...
获取键user:2
属性name
、age
的值
1
2
3
127.0.0.1:6379> hmget user:2 name age
1) "xiaohong"
2) "16"
获取指定键的所有值
获取指定键的所有域值对
1
2
3
4
127.0.0.1:6379> hvals user:3
1) "xiaohong"
2) "17"
3) "1"
(3)获取hash的所有域值对
1
2
3
4
5
6
7
8
9
127.0.0.1:6379> hset user:1 name xiaoming age 16 sex 1
(integer ) 3
127.0.0.1:6379> hgetall user:1
1) "name"
2) "xiaoming"
3) "age"
4) "16"
5) "sex"
6) "1"
(4)删除指定键的域/属性
1
hdel key field1 field2 ...
删除键user:3
的属性sex/age/name
,当键中的hash数据没有任何属性,则当前键会被redis删除
1
hdel user:3 sex age name
(5)判断指定属性/域是否存在于当前键对应的hash中
判断user:2中是否存在age属性
1
2
3
4
5
127.0.0.1:6379> hexists user:3 age
(integer ) 0
127.0.0.1:6379> hexists user:2 age
(integer ) 1
127.0.0.1:6379>
(6)属性值自增自减
1
hincrby key field number
给user:2的age属性在原值基础上+/-10,然后在age现有值的基础上-2
1
2
3
4
5
6
7
8
9
10
127.0.0.1:6379> hincrby user:2 age 10
(integer ) 77
127.0.0.1:6379> hincrby user:2 age 10
(integer ) 87
127.0.0.1:6379> hincrby user:2 age -10
(integer ) 77
127.0.0.1:6379> hincrby user:2 age -10
4.5. set(集合)
无序集合,重点就是去重和无序。
(1)添加元素
1
sadd key member1 member2 ...
向键authors
的集合中添加元素zhangsan
、lisi
、wangwu
1
sadd authors zhangsan lisi wangwu
(2)获取集合的所有的成员
获取键authors
的集合中所有元素
(3)获取集合的长度
获取s2集合的长度
1
2
3
4
sadd s2 a b c d e
127.0.0.1:6379> scard s2
(integer ) 5
(4)随机抽取一个或多个元素
抽取出来的成员被删除掉
1
2
3
4
spop key [count=1]
随机获取s2集合的成员
1
2
3
4
5
6
sadd s2 a c d e
127.0.0.1:6379> spop s2
"d"
127.0.0.1:6379> spop s2
"c"
(5)删除指定元素
删除键authors
的集合中元素wangwu
(6)交集、差集和并集
推荐、(协同过滤,基于用户、基于物品)
1
2
3
sinter key1 key2 key3 ....
sdiff key1 key2 key3 ....
sunion key1 key2 key3 ....
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
del user:1 user:2 user:3 user:4
sadd user:1 1 2 3 4
sadd user:2 1 3 4 5
sadd user:3 1 3 5 6
sadd user:4 2 3 4
127.0.0.1:6379> sinter user:1 user:2
1) "1"
2) "3"
3) "4"
127.0.0.1:6379> sinter user:1 user:3
1) "1"
2) "3"
127.0.0.1:6379> sinter user:1 user:4
1) "2"
2) "3"
3) "4"
127.0.0.1:6379> sinter user:2 user:4
1) "3"
2) "4"
127.0.0.1:6379> sunion user:1 user:2 user:4
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> sdiff user:2 user:3
1) "4"
127.0.0.1:6379> sdiff user:3 user:2
1) "6"
127.0.0.1:6379> sdiff user:1 user:3
1) "2"
2) "4"
4.6. zset(有序集合)
有序集合,去重并且根据score权重值来进行排序的。score从小到大排列。
(1)添加成员
1
zadd key score1 member1 score2 member2 score3 member3 ....
设置榜单achievements,设置成绩和用户名作为achievements的成员
1
2
3
4
5
127.0.0.1:6379> zadd achievements 61 xiaoming 62 xiaohong 83 xiaobai 78 xiaohei 87 xiaohui 99 xiaolan
(integer ) 6
127.0.0.1:6379> zadd achievements 85 xiaohuang
(integer ) 1
127.0.0.1:6379> zadd achievements 54 xiaoqing
(2)获取score在指定区间的所有成员
1
2
3
4
zrangebyscore key min max
zrevrangebyscore key min max
zrange key start stop
zrevrange key start stop
1
zrange achievements 0 -1
(3)获取集合长度
获取users的长度
(4)获取指定成员的权重值
获取users中xiaoming的成绩
1
2
3
4
5
6
127.0.0.1:6379> zscore achievements xiaobai
"93"
127.0.0.1:6379> zscore achievements xiaohong
"62"
127.0.0.1:6379> zscore achievements xiaoming
"61"
(5)获取指定成员在集合中的排名
排名从0开始计算
1
2
zrank key member
zrevrank key member
获取achievements中xiaohei的分数排名,从大到小
1
2
127.0.0.1:6379> zrevrank achievements xiaohei
(integer ) 4
(6)获取score在指定区间的所有成员数量
获取achievements从0~60分之间的人数[闭区间]
1
2
3
4
127.0.0.1:6379> zcount achievements 0 60
(integer ) 2
127.0.0.1:6379> zcount achievements 54 60
(integer ) 2
(7)给指定成员增加增加权重值
1
zincrby key score member
给achievements中xiaobai增加10分
1
2
127.0.0.1:6379> ZINCRBY achievements 10 xiaobai
"93
(8)删除成员
1
zrem key member1 member2 member3 ....
从achievements中删除xiaoming的数据
1
zrem achievements xiaoming
(9)删除指定数量的成员
1
2
3
4
zpopmin key [count]
zpopmax key [count]
例子:
1
2
3
4
5
6
7
8
9
10
11
12
13
127.0.0.1:6379> zpopmin achievements 2
1) "xiaoqing"
2) "54"
3) "xiaolv"
4) "60"
127.0.0.1:6379> zpopmax achievements 2
1) "xiaolan"
2) "99"
3) "xiaobai"
4) "93"
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!