这里说的数据类型是value的数据类型,key的类型都是字符串
五大常见类型
-
String 字符串
string是redis最基本的类型,一个key对应一个value。
string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象 。
string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M
-
List 列表
Redis列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
它的底层实际是个双端链表,最多可以包含 2^32 - 1 个元素 (4294967295, 每个列表超过40亿个元素)
-
Hash 哈希表
hash 是一个 string 类型的 field(字段) 和 value(值) 的映射表,hash 特别适合用于存储对象。
Redis 中每个 hash 可以存储 2^32 - 1 键值对(40多亿)
-
Set 集合
Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,集合对象的编码可以是 intset 或者 hashtable。
Set集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)
集合中最大的成员数为 2^32 - 1
-
ZSet 有序集合
zset 和 set 一样也是string类型元素的集合,且不允许重复的成员
不同的是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序。
zset的成员是唯一的,但分数(score)却可以重复。
zset集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大的成员数为 2^32 - 1
其他五种类型
-
GEO 地理空间
主要用于存储地理位置信息,并对存储的信息进行操作,包括:
- 添加和获取地理位置的坐标
- 计算两个位置之间的距离
- 根据给定的经纬度坐标来获取指定范围内的地理位置集合
-
HyperLogLog 基数统计
是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定且是很小的
每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。
因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
-
bitmap 位图
由0和1状态表现的二进制位的bit数组
-
bitfield 位域
通过bitfield命令可以一次性操作多个比特位域(指的是连续的多个比特位),它会执行一系列操作并返回一个响应数组,这个数组中的元素对应参数列表中的相应操作的执行结果。
说白了就是通过bitfield命令我们可以一次性对多个比特位域进行操作。
-
Stream 流
Stream 是 Redis 5.0 版本新增加的数据结构。
主要用于消息队列(MQ,Message Queue),Redis 本身是有一个 Redis 发布订阅 (pub/sub) 来实现消息队列的功能,但它有个缺点就是消息无法持久化,如果出现网络断开、Redis 宕机等,消息就会被丢弃
简单来说发布订阅 (pub/sub) 可以分发消息,但无法记录历史消息。
而 Redis Stream 提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失
键(Key)命令
-
keys *
查看当前库所有的 key
-
exists key
判断某个 key 是否存在
-
type key
查看 key 的类型
-
del key
删除指定的 key 是什么类型
-
unlink key
非阻塞删除,仅仅将keys从keyspace元数据中删除,真正的删除会在后续异步中操作。
-
ttl key
查看还有多少秒过期,-1 表示永不过期,-2 表示过期
-
expire key 秒钟
位给定的 key 设置过期时间
-
move key dbindex [0-15]
将当前数据库的 key移动到给定的数据库 db 当中
-
select dbindex
切换数据库[0-15], 默认为0
-
dbsize
查看当前数据库 key 的数量
-
flushdb
清空当前库
-
flushall
清空所有库的数据
命令不区分大小写,而key是区分大小写的
String
最常用的两个:
-
set key value
set key value [NX|XX] [GET] [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|KEEPTTL]
-
get key
-
同时设置和获取多个键值
-
获取指定区间范围内的值
getrange:获取指定区间范围内的值,类似between……and的关系
setrange设置指定区间范围内的值
-
数值增减
一定要是数字才能进行加减
-
递增数字
incr key
-
增加指定的整数
incrby key increment
-
递减数值
decr key
-
减少指定的整数
decrby key decrement
-
-
获取字符串长度和内容追加
1 2
STRLEN key APPEND key value
-
分布式锁
什么是分布式锁:分布式锁是一种用于在分布式系统中控制对共享资源访问的机制。其主要目的是确保在多节点环境下,不同的进程或线程能够以互斥的方式访问某个共享资源,以避免数据不一致或资源竞争的问题。基本特性是互斥、容错、和高可用。
setnx key value
setex(set with expire) 键 秒 值/setnx(set if not exist)
setex:设置带过期时间的key,动态设置。
setnx(set if not exist)
setnx:只有在 key 不存在时设置 key 的值。
-
getset(先get再set)
getset:将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
简单一句话,先get然后立即set
应用场景
比如抖音无限点赞某个视频或者商品,点一下加一次
缓存
List
一个双端链表的结构,容量是2的32次方减1个元素,大概40多亿,主要功能有push/pop等,一般用在栈、队列、消息队列等场景。
left、right都可以插入添加;
如果键不存在,创建新的链表;
如果键已存在,新增内容;
如果值全移除,对应的键也就消失了。
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
-
lpush
、rpush
、lrange
-
lpop
、rpop
-
lindex, 按照索引下标获得元素
-
llen
获取列表中元素个数 -
lrem
key 数字N 给定值V1解释(删除N个值等于v1的元素)
-
从left往right删除2个值等于v1的元素,返回的值为实际删除的数量
-
LREM list3 0 值,表示删除全部给定的值。零个就是全部值
-
应用场景
评论系统、分页
Hash
KV模式不变,但V是一个键值对
Map<String,Map<Object,Object>>
-
hset/hget/hmset/hmget/hgetall/hdel
-
hlen
获取某个 key 内的全部数量 -
hexists
key 在key里面的某个值的key -
HINCRBY
key field n为哈希表 key 中 field 键的值加上增量 n
-
hsetnx
不存在就赋值,如果存在就无效
-
hkeys/hvals
应用场景
购物车:
新增商品 → hset shopcar:uid1024 334488 1
新增商品 → hset shopcar:uid1024 334477 1
增加商品数量 → hincrby shopcar:uid1024 334477 1
商品总数 → hlen shopcar:uid1024
全部选择 → hgetall shopcar:uid1024
Set
单值多 value,且不重复
常见操作
|
|
集合运算
-
差集
1 2 3 4
# 差集运算 SDIFF key [key ...] # 将差集结果存入新集合destination中 SDIFFSTORE destination key [key ...]
-
交集
1 2 3 4
# 交集运算 SINTER key [key ...] # 将交集结果存入新集合destination中 SINTERSTORE destination key [key ...]
-
并集
1 2 3 4
# 并集运算 SUNION key [key ...] # 将并集结果存入新集合destination中 SUNIONSTORE destination key [key ...]
应用场景
集合的主要几个特性,无序、不可重复、支持并交差等操作。
因此 Set 类型比较适合用来数据去重和保障数据的唯一性,还可以用来统计多个集合的交集、错集和并集等,当我们存储的数据是无序并且需要去重的情况下,比较适合使用集合类型进行存储。
但是要提醒你一下,这里有一个潜在的风险。Set 的差集、并集和交集的计算复杂度较高,在数据量较大的情况下,如果直接执行这些计算,会导致 Redis 实例阻塞。
在主从集群中,为了避免主库因为 Set 做聚合计算(交集、差集、并集)时导致主库被阻塞,我们可以选择一个从库完成聚合统计,或者把数据返回给客户端,由客户端来完成聚合统计。
-
点赞
Set 类型可以保证一个用户只能点一个赞,这里举例子一个场景,key 是文章id,value 是用户id。
uid:1
、uid:2
、uid:3
三个用户分别对 article:1 文章点赞了。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
# uid:1 用户对文章 article:1 点赞 > SADD article:1 uid:1 (integer) 1 # uid:2 用户对文章 article:1 点赞 > SADD article:1 uid:2 (integer) 1 # uid:3 用户对文章 article:1 点赞 > SADD article:1 uid:3 (integer) 1 # uid:1 取消了对 article:1 文章点赞。 > SREM article:1 uid:1 (integer) 1 # 获取 article:1 文章所有点赞用户 : > SMEMBERS article:1 1) "uid:3" 2) "uid:2" # 获取 article:1 文章的点赞用户数量: > SCARD article:1 (integer) 2 # 判断用户 uid:1 是否对文章 article:1 点赞了: > SISMEMBER article:1 uid:1 (integer) 0 # 返回0说明没点赞,返回1则说明点赞了
-
共同关注
取交集
-
抽奖活动
1 2
# 从集合中随机展现设置的数字个数元素,元素不删除 SRANDMEMBER key [数字]
Zset
Zset 类型(有序集合类型)相比于 Set 类型多了一个排序属性 score(分值),对于有序集合 ZSet 来说,每个存储元素相当于有两个值组成的,一个是有序集合的元素值,一个是排序值。
有序集合保留了集合不能有重复成员的特性(分值可以重复),但不同的是,有序集合中的元素可以排序。
常见操作
|
|
Zset 运算操作(相比于 Set 类型,ZSet 类型没有支持差集运算):
|
|
应用场景
在面对需要展示最新列表、排行榜等场景时,如果数据更新频繁或者需要分页显示,可以优先考虑使用 Sorted Set。