基于第0章的学习,我们已经知道Redis的数据形式为Key-Value形式。
此文讲解的数据类型是:Key-Value中的Value的数据类型。请读者务必理解这一点后学习。
Redis命令不区分大小写,Key值区分大小写。
1 Redis数据类型概览
1.1 概览
1.2 基本介绍
1. String(字符串)
- 基本介绍: 存储的是文本或二进制数据,最大存储容量为 512MB。
- 底层结构: 简单动态字符串 SDS(Simple Dynamic String)。
- 应用场景: 缓存、计数器、分布式锁。
2. Hash(哈希表)
- 基本介绍: 存储键值对集合,适合存储对象属性。
- 底层结构: 基于哈希表实现。
- 应用场景: 存储对象、缓存存储、实时更新数据。
3. List(列表)
- 基本介绍: 双向链表,可进行头尾插入和删除操作。
- 底层结构: 双向链表。
- 应用场景: 消息队列、实时排行榜。
4. Set(集合)
- 基本介绍: 存储唯一值的无序集合。
- 底层结构: 基于哈希表实现。
- 应用场景: 数据去重、共同好友查找。
5. Sorted Set(有序集合)
- 基本介绍: 类似 Set,但每个元素都关联一个分数,可按分数排序。
- 底层结构: 结合了哈希表和跳跃表。
- 应用场景: 实时排行榜、范围查询。
6. HyperLogLog(基数)
- 基本介绍: 用于估算集合中的基数(基数:不重复元素的个数)。
- 底层结构: 基于概率统计算法实现。
- 应用场景: 统计UV(独立访客数)、大数据场景中的基数统计。
7. Geo(地理位置)
- 基本介绍: 存储地理空间信息,如经纬度坐标。
- 底层结构: 使用 ZSET 结构存储地理位置信息。
- 应用场景: 地理位置信息查询、附近的人功能。
8. Bitmap(位图)
- 基本介绍: 位数组,可进行位操作。
- 底层结构: 使用字符串实现。
- 应用场景: 用户在线状态统计、周/月/年签到、布隆过滤器等。
9. Streams(流)
- 基本介绍: 类似消息队列,但支持更丰富的操作。
- 底层结构: 内部使用列表和哈希表实现。
- 应用场景: 消息队列、事件日志等。
10. Bitfield(位域)
- 基本介绍: 允许用户对字符串指定偏移量的位进行操作。
- 底层结构: 使用字符串实现,支持对位进行原子级别的操作。
- 应用场景: 适用于位操作相关的需求,比如统计、压缩数据等。
2 数据类型学习的前置相关命令
官方命令查询网址:Commands | Redis
中文Redis命令查询网址:http://www.redis.cn/commands.html
2.1 Key相关命令
1.SET key value
- 用法:
SET mykey "Hello"
- 作用: 设置指定 key 的值.
2.SETNX key value
- 用法:
SETNX mykey "Hello"
- 作用: 当 key 不存在时,为 key 设置值.
3.MSET key value [key value ...]
- 用法:
MSET key1 "Hello" key2 "World"
- 作用: 同时设置多个 key 的值.
4.SETEX key seconds value
- 用法:
SETEX mykey 10 "Hello"
- 作用: 设置指定 key 的值,并在指定的秒数后过期。 Redis 将在给定的秒数后自动删除 key.
5.GET key
- 用法:
GET mykey
- 作用: 获取指定 key 的值.
6.MGET key [key ...]
- 用法:
MGET key1 key2
- 作用: 获取多个 key 的值.
7.DEL key [key ...]
- 用法:
DEL mykey
- 作用: 删除一个或多个 key.
8.EXISTS key
- 用法:
EXISTS mykey
- 作用: 检查给定 key 是否存在.
9.EXPIRE key seconds
- 用法:
EXPIRE mykey 10
- 作用: 设置 key 的过期时间(秒).
10.TTL key
- 用法:
TTL mykey
- 作用: 获取 key 的剩余过期时间(秒).
11.TYPE key
- 用法:
TYPE mykey
- 作用: 返回 key 所储存的值的类型.
12.KEYS pattern
- 用法:
KEYS user*
- 作用: 查找所有符合给定模式的 key.
13.RENAME key newkey
- 用法:
RENAME mykey newkey
- 作用: 修改 key 的名称.
14.RANDOMKEY
- 用法:
RANDOMKEY
- 作用: 随机返回数据库中的一个 key.
15. INCR key
- 用法:
INCR counter
- 作用: 将 key 中储存的数字值增一。
16. DECR key
- 用法:
DECR counter
- 作用: 将 key 中储存的数字值减一。
17. INCRBY key increment
- 用法:
INCRBY counter 5
- 作用: 将 key 所储存的值加上给定的增量值。
18. DECRBY key decrement
- 用法:
DECRBY counter 3
- 作用: 将 key 所储存的值减去给定的减量值。
19.UNLINK key
- 用法:
UNLINK key
- 作用: 使用
UNLINK
命令来实现非阻塞删除。与DEL
命令不同,UNLINK
以非阻塞的方式进行删除操作。当键被删除时,Redis会将键移动到一个专门的异步删除队列中,并在后台异步地释放这些键所占用的内存空间,这样就不会阻塞其他操作。 使用非阻塞删除可以确保在执行删除操作时,不会因为大量的删除操作而导致Redis服务器性能下降或者出现阻塞情况,保证了系统的稳定性和可靠性。
2.2 数据库相关命令
MOVE key dbindex [0-15)
- 用法:
MOVE mykey 1
- 作用: 将指定 key 移动到指定的数据库中。数据库索引从 0 到 15,表示 16 个不同的数据库。
SELECT dbindex
- 用法:
SELECT 1
- 作用: 选择指定数据库,使得接下来的操作都在该数据库中执行。
DBSIZE
- 用法:
DBSIZE
- 作用: 返回当前数据库的 key 的数量。
FLUSHDB
- 用法:
FLUSHDB
- 作用: (慎用!)清空当前数据库中的所有 key。
FLUSHALL
- 用法:
FLUSHALL
- 作用: (慎用!实际开发中基本不使用!)清空所有数据库中的所有 key。
3 数据类型详解
3.1 Redis字符串(String)
1.set 和 get
set k1 v1;
get k1;
2.mset 、mget和msetnx
mset k1 a k2 b; #批量创建
mget k1 k2; #批量获取
msetnx k3 c k4 d #若不存在,则批量创建 注意:具有原子性:一败则败,要成都成
msetnx:如果不存在才创建,如果该key存在,则执行失败,不更新
3.getrange 和 setrange
getrange key leftlimit rightlimit
获取指定区间范围内的值,类似between......and的关系 从零到负一表示全部
getrange key 0 8;
其中
0是要获取的区间的左值
8是要获取的区间的右值 此值填-1表示一直到结尾
setrange key值 具体值
设置指定区间范围内的值
setrange key 2 abc
其中
2表示从哪个索引(包括该索引)开始修改
abc表示要设置什么值
4.数值递增
注意:只能针对数值类型!
INCR key #key对应value+1
INCRBY key increment #key对应value +increment
DECR key #key对应value-1
DECRBY key decrement #key对应value-decrement
5.获取字符串长度和内容追加
STRLEN Key #获取key对应value 的长度
APPEND key value #在key对应value后面追加值
6.分布式锁
set key value [EX seconds] [PX milliseconds] [NX XX]
- EX: key在多少秒之后过期
- PX: key在多少毫秒之后过期
- NX: 当key不存在的时候,才创建key,效果等同于setnx
- XX: 当key存在的时候,覆盖key
7.getset
先get 在set
getset key newvalue #结果会返回原来的value ,然后在把新的value赋上
String类型应用场景
incr key :比如抖音无限点赞某个视频或者商品,点一下加一次
访问量,阅读量等等
3.2 Redis列表(list)
形式 key - list
单值多Value
List底层是一个双端链表结构,头尾处均可插入,中间也可以但性能比头尾插入稍差。
left、right都可以插入添加;
如果键不存在,创建新的链表;
如果键已存在,新增内容;
如果值全移除,对应的键也就消失了。
3.2.1常用命令汇总
1.BRPOPLPUSH source destination timeout
- 从一个列表中弹出一个值,将该值插入到另一个列表的头部,并返回该值。如果列表为空,则会阻塞列表直到等待超时或发现可弹出元素为止。
2.LINDEX key index
- 通过索引获取列表中的元素。
3.LINSERT key BEFORE|AFTER pivot value
- 在列表中某个元素之前或之后插入新元素。
4.LEN key
- 获取列表的长度。
5.LPOP key
- 移除并获取列表的第一个元素。
6.LPUSHX key value
- 将一个或多个值插入到已存在的列表头部。
7.LRANGE key start stop
- 获取列表中指定范围内的元素。
8.LREM key count value
- 移除列表中与指定值相等的元素。
9.LSET key index value
- 通过索引设置列表中元素的值。
10.LTRIM key start stop
- 对列表进行修剪,保留指定范围内的元素,其余删除。
11.RPOP key
- 移除并获取列表的最后一个元素。
12.RPOPLPUSH source destination
- 移除源列表的最后一个元素,并将该元素添加到目标列表的头部,然后返回该元素。
13.RPUSH key value1 [value2 ...]
- 在列表末尾添加一个或多个值。
14.RPUSHX key value
- 为已存在的列表末尾添加值。
3.2.2 实战演示
1.lpush rpush lrange
lpush list1 1 2 3 4 #从左边压入value
rpush list2 1 2 3 4 #从右边压入value
lrange list 0 -1 #获取指定索引范围的list
2.value的弹出
分头尾两种弹出,弹出是真实的,弹出后原list就不再有该value 了
lpop list #从左边弹出list的一个value
rpop list #从右边弹出...
3.按索引下标获取元素、列表元素个数
lindex list 2
llen list
4.删除n个value为指定值的元素
lrem list value
5.截取并保留指定范围的元素
ltrim list 0 3 #删去0 1 2索引的元素数据 也就是说删除的机制是包左不包右 [0,3)
6.弹出list1的尾部元素 到 list2的头部
rpoplpush list1 list2
7.在list的某值的前或后插入一值
linsert list before v1 v0 #在v1前面插入v0
linsert list after v1 v2 #在v1后面插入v2
List类型应用场景
订阅消息:涉及头部添加(新的消息会插入在头部)
中间值添加(获取订阅消息时,总有不同博主,发布时间总是会不同,这就涉及到排序插入问题)
3.3Redis哈希(Hash)
有Java基础的话可以理解为 Map< String, Map<Sring,Object> >
3.3.1常用命令汇总
HGET key field
//获取存储在哈希表中指定字段的值
HGETALL key
//获取在哈希表中指定 key 的所有字段和值
HINCRBY key field increment
//为哈希表 key 中的指定字段的整数值加上增量increment。
HINCRBYFLOAT key field increment
//为哈希表 key 中的指定宇段的浮点数值加上增量increment。
HKEYS key
//获取所有哈希表中的字段
HLEN key
//获取哈希表中字段的量
HMGET key field1 field2
//获取所有给定字段的值
HMSET key field1 value1 [feld2 value2 ...]
//同时将多个field-value (域-值)对设置到哈希表 key 中。
HSET key field value
//将哈希表 key 中的字段field 的值设为 value.
HSETNX key field value
//只有在字段feld 不存在时,设置哈希表字段的值
HVALS key
//获取哈希表中所有值
HSCAN key cursor [MATCH pattern][COUNT count
//迭代哈希表中的键值对。
3.3.2实战演示
hset key field value:设置哈希表 key 中指定字段的值。
hget key field:获取哈希表 key 中指定字段的值。
hmset key field1 value1 [field2 value2 ...]:同时设置多个哈希表字段的值。
hmget key field1 [field2 ...]:获取哈希表 key 中一个或多个指定字段的值。
hgetall key:获取哈希表 key 中所有字段和值。
hdel key field1 [field2 ...]:删除哈希表 key 中一个或多个字段。
hlen key:获取哈希表 key 中字段的数量。
hexists key field:检查哈希表 key 中是否存在指定的字段。
hkeys key:获取哈希表 key 中所有字段的名称。
hvals key:获取哈希表 key 中所有字段的值。
hincrby key field increment:为哈希表 key 中的指定字段增加整数值。
hincrbyfloat key field increment:为哈希表 key 中的指定字段增加浮点数值。
hsetnx key field value:只在哈希表 key 中不存在指定的字段时,设置字段的值
3.3.3 应用场景
购物车:整个购物车是一个hash key值可能是yonghuid value值就是购物车内的所有商品
选择全部 hgetall user01
查看某商品 hget user01 product1
商品加一 hincrby user01 product1 1
3.4 Redis集合(Set)
3.4.1常用命令汇总
SDIFF key1 [key2] //返回给定所有集合的差集。
SDIFFSTORE destination key1 [key2] //返回给定所有集合的差集并存储在 destination 中。
SINTER key1 [key2] //返回给定所有集合的交集。
SINTERSTORE destination key1 [key2] //返回给定所有集合的交集并存储在 destination 中。
SISMEMBER key member //判断 member 元素是否是集合 key 的成员。
SMEMBERS key //返回集合中的所有成员。
SMOVE source destination member //将 member 元素从 source 集合移动到 destination 集合。
SPOP key //移除并返回集合中的一个随机元素。
SRANDMEMBER key [count] //返回集合中一个或多个随机数。
SREM key member1 [member2] //移除集合中一个或多个成员。
SUNION key1 [key2] //返回所有给定集合的并集。
SUNIONSTORE destination key1 [key2] //所有给定集合的并集存储在 destination 集合中。
SSCAN key cursor [MATCH pattern][COUNT count] //迭代集合中的元素。
3.4.2 实战演示
SADD key member [member ...]
:添加元素到集合中。
SMEMBERS key
:遍历集合中的所有元素。
SISMEMBER key member
:判断元素是否在集合中。
SREM key member [member ...]
:删除元素。
SCARD key
:获取集合里面的元素个数。
SRANDMEMBER key [count]
:从集合中随机返回指定数量的元素,元素不被移除。
SPOP key [count]
:从集合中随机弹出一个或多个元素。
SMOVE key1 key2 member
:将 key1 中已存在的某个值移动到 key2。
集合运算(如并集、交集、差集等)通过 SUNION
、SINTER
、SDIFF
等命令来实现。
SDIFF key1 [key2]
:返回给定所有集合的差集。
SDIFFSTORE destination key1 [key2]
:返回给定所有集合的差集并存储在 destination 中。
SINTER key1 [key2]
:返回给定所有集合的交集。
SINTERSTORE destination key1 [key2]
:返回给定所有集合的交集并存储在 destination 中。
SUNION key1 [key2]
:返回所有给定集合的并集。
SUNIONSTORE destination key1 [key2]
:所有给定集合的并集存储在 destination 集合中。
3.4.3 应用场景
抽奖:
随机弹出
srandmember set 3 (不删除)
spop set 3(删除)
总人数
scard set
微信朋友圈,共同好友点赞可见功能:
sinter set1 set2 把朋友圈点赞的所有人和你的好友set取交集就知道哪些应该可见了
推送可能是认识的人:
比如 检测到A、B两个人共同好友比较多
就可以
使用sdiff A B 来把结果集推给B
使用sdiff B A 来把结果集推给A
3.5 Redis有序集合Zset(sorted set)
就是在set的基础上 在value的前面多维护一个score
zset1 score1 v1 score2 v2
3.5.1 Zset常用命令
ZADD key score1 member1 [score2 member2]
// 向有序集合添加一个或多个成员,或者更新已存在成员的分数
ZCARD key // 获取有序集合的成员数
ZCOUNT key min max // 计算在有序集合中指定区间分数的成员数
ZINCRBY key increment member // 有序集合中对指定成员的分数加上增量 increment
ZINTERSTORE destination numkeys key [key .
// 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中
ZLEXCOUNT key min max // 在有序集合中计算指定字典区间内成员数量
ZRANGE key start stop [WITHSCORES] // 通过索引区间返回有序集合成指定区间内的成员
ZRANGEBYLEX key min max [LIMIT offset count // 通过字典区间返回有序集合的成员
ZRANGEBYSCORE key min max [WITHSCORESIILIMITI // 通过分数返回有序集合指定区间内的成员
ZRANK key member // 返回有序集合中指定成员的索引
ZREM key member[member . // 移除有序集合中的一个或多个成员
ZREMRANGEBYLEX key min max // 移除有序集合中给定的字典区间的所有成员
ZREMRANGEBYRANK key start stop // 移除有序集合中给定的排名区间的所有成员
ZREMRANGEBYSCORE key min max // 移除有序集台中给定的分数区间的所有成员
ZREVRANGE key start stop WITHSCORESI // 返回有序集中指定区间内的成员,通过索引,分数从高到底
ZREVRANGEBYSCORE key max min [WITHSCORES //返回有序集中指定分数区间内的成员分数从高到低排序
ZREVRANK key member // 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序
ZSCORE key member // 返回有序集中,成员的分数值
ZUNIONSTORE destination numkeys key [key
// 计算给定的一个或多个有序集的并集,并存储在新的 key 中
ZSCAN key cursor[MATCH pattern] [COUNT count
// 迭代有序集合中的元素( 包括元素成员和元素分值 )
3.5.2 实战演示
添加元素和该元素的分数: ZADD key score member [score member ...]
按照元素分数从小到大的顺序返回索引从start到stop之间的所有元素: ZRANGE key start stop [WITHSCORES]
按照元素分数从大到小的顺序返回索引从start到stop之间的所有元素: ZREVRANGE key start stop [WITHSCORES]
获取指定分数范围的元素: ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
获取元素的分数: ZSCORE key member
获取集合中元素的数量: ZCARD key
删除元素: ZREM key member [member ...]
增加某个元素的分数: ZINCRBY key increment member
获得指定分数范围内的元素个数: ZCOUNT key min max
从键名列表中的第一个非空排序集中弹出一个或多个元素,它们是成员分数对: ZPOPMIN key [count]
获得元素在排序集中的排名(从小到大): ZRANK key member
获得元素在排序集中的排名(从大到小): ZREVRANK key member
3.5.3 应用场景
商品实时销量排行榜:
获取销量全部排行榜 zrange rank 0 -1 withscores
获取销量前十排行榜 zrange rank 0 9 withscores
销量增加1 zincrby rank 1 product1