Redis 数据类型


# Redis 数据类型

Redis 支持 5 种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及 zset(sorted set:有序集合)。

# String

最简单的数据存储类型。一个存储空间只保存一个数据,若字符串是数字按照数字处理。Redis 所有的操作是原子性的,采用单线程处理所有的业务,命令是一个一个执行的,因此无需考虑高并发带来的数据影响。

原子性:指一个操作序列就像一个操作一样不可分割,要么完整的被执行,要么完全不执行(银行转账:A 帐户成功扣款必然 B 账户成功入款,否则两个账户都回归原始状态)。

最大存储量:512MB

# 常用操作

set key value        # 赋值
get key              # 获取指定 key 的 value
del key              # 删除指定 key
incr key             # 给指定 key 的值加一
decr key             # 给指定的 key 的值减一
incrby key increment # 给指定的 key 的值加 increment
decrby key decrement # 给指定的 key 的值减 decrement
1
2
3
4
5
6
7

# 适用场景

# 1)投票的有效时长

可以指定数据的生命周期,来控制数据是什么时候失效,用过数据失效控制对应的业务行为,适用于具有时效性限定控制操作。

setnx key seconds value  # 设置 key 对应 value 值的有效时长是 seconds
1

# 2)大 V 用户信息的数据存储情况:粉丝数、博文数等

增加一个关注的粉丝,使用 incr 直接增加:

set user:id:12:fans 34
incr user:id:12:fans
1
2

Redis 用于各种数据结构和非结构高热度数据流访问。

这里说明一下数据库中热点数据 key 命名惯例:使用 : 分割数据层次:

表名:news:主键名:id:主键值:202202:字段名:title:

(热点数据 key 命名惯例)

# 3)分布式锁

# Hash

对存储的数据进行编组,典型的应用存储对象信息。一个存储空间可以保存多个键值对数据。底层是 hash 表的实现。

keyfield1value1field2value2field3value3

(Hash 存储结构)

value 值只存储字符串,每个 hash 可以存储 232-1 个键值对。

# 常用操作

hset key field value   # 为指定的 key 设置一个含有 field、value 的值
hmset key field1 value1 field2 value2 # 给指定的 key 设置多个含有 field、value 的值
hget key field         # 获取指定 key、field 的值
hmget key field field2 # 获取多个 key、field 的值
hgetall key            # 获取 key 下所有 field 的值,若内部 field 过多,遍历整体数据效率会很耗时
hdel key field1 field2 # 删除指定 key 下指定 field 的值(可以单个或者多个)
hdel key               # 删除指定 key 下所有 field 的值
hexists key field      # 查看指定 key 的 field 是否存在
hlen key               # 查看指定 key 下 field 的个数
hkeys key              # 获取指定 key 下所有的 field
hvals key              # 获取指定 key 下所有的 value
1
2
3
4
5
6
7
8
9
10
11

# 适用场景

# 1)电商网站购物车

购物车信息,可以容易增删改查,管理数量等。

# 2)商家信息管理

应用于抢购,发放消费券(发完为止)等数据存储设计。

# List

存储多个数据,对数据进入存储空间的顺序要进行区分。数据主要要体现顺序,底层使用双向链表实现。

list 保存的数据都是 string 类型的,最多有 232-1 个数据。list 有索引的概念。

# 常用操作

# 给指定的 key 从头部开始添加 value,如果 key 不存在则会自动创建
lpush key value1 value2
# 给指定的 key 从尾部开始添加 value,如果 key 不存在同样自动创建
rpush key value1 value2

# 获取指定 key 从开始位置到结束位置的值,从 0 开始 -1 为最后一位
lrange key 0 -1

# 将指定 key 头部的值弹出,如果 key 不存在返回 nil,如果存在返回头部元素
lpop key
# 将指定 key 尾部的值弹出,如果 key 不存在返回 nil,如果存在返回尾部元素
rpop key

# 获取指定 key 链表的长度,如果 key 不存在返回 0
llen key

# 给指定 key 从头部开始添加 value,只有 key 存在才能添加,不存在返回 0,并且只能添加一个值
lpushx key value
# 给指定 key 从尾部开始添加 value,同上
rpushx key value

# 删除指定 key 的指定值
# 如果 index 大于 0 则删除 index 位置上与 value 相等的值
# 小于 0 则从尾部开始
# 等于 0 则删除链表中所有与 value 相等的值
lrem key index value
# 给指定位置上的 value 修改为指定值,如果角标不存在则报错((error) ERR index out of range)
lset key index value

# 给指定 key 链表中指定 value 前添加一个新 value,从头开始
linsert key before value newValue
# 给指定 key 链表中指定 value 前添加一个新 value,从尾开始
linsert key after value newValue

# 将指定 key 的尾部元素弹出压入 key2 的头部,如果两个 key 相同,则在同一个链表中执行尾弹头压的操作
rpoplpush key key2
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

# 适用场景

# 1)朋友圈点赞,按照点赞顺序显示好友

应用于具有操作先后顺序的数据控制。

# 2)分页操作

通常第一页信息来自 list,其他页信息来自数据库进行加载。

# Set

存储大量数据,在查询方面提供更好的查询效率。与 hash 的存储结构相同,不同的是,只存储 field 值,不存储 value 值。Set 不允许数据重复,也不能启动 value 功能。

keyfield1nilfield2nilfield3nil

(Set 存储结构)

# 常用操作

# 给指定 key 中添加数据,元素不重复
sadd key value1 value2
# 获取指定 key 中的元素
smembers key
# 删除指定 key 中的指定 value
srem key members value1 value2
# 获取某个 key,将该数据移除
spop key

# 判断指定 key 中的指定 value 值是否存在,存在返回 1,不存在返回 0 或者该 key 本身
sismember key value

# 获取 key 自身元素中与 key2 不相同的元素(差集)
sdiff key key2
# 获取 key 与 key2 中相同的元素(交集)
sinter key key2
# 将 key 与 key2 元素合并返回,不包括相同元素(并集)
sunion key key2

# 获取指定 key 中元素的个数
scard key
# 随机获取指定 key 中的一个元素
srandmember key

# 将 key1 与 key2 的差集存储到 key 中
sdiffstore key key1 key2
# 将 key1 与 key2 的交集存储到 key 中
sinterstore key key1 key2
# 将 key1 与 key2 的并集存储到 key 中
sunionstore key key1 key2
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

# 适用场景

# 1)应用于同类消息的关联搜索

  • 显示共同好友/关注(一度)
  • 由用户A出发,获取共同好友B的好友列表(一度)
  • 由用户A出发,获取共同好友B的购物清单/游戏充值列表(二度)

# 2)随机推荐类信息检索,例如推荐热点音乐、新闻等

# 3)不同类型不重复数据的合并操作,如权限配置

# 4)应用于同类型数据的快速去重,如访问量统计

# 5)基于黑名单与白名单设定服务控制(利用 set 的去重性)

# Sorted Set

需求:数据排序有利于数据的展示,需要提供一种根据自身特征进行排序。在 set 的基础上添加 score 排序字段。score 不存储数据,只用于排序。

keyfield1nilfield2nilfield3nil23457score

(Sorted Set 存储结构)

# 常用操作

# 将 score name 存储到指定的 key 中
# 如果有相同的 name 则覆盖之前的,返回值为新加入的元素,之前存在的不算
zadd key score name score2 name

# 获取指定 key 中 name 的 score
zscore key name
# 获取指定 key 中成员数量
zcard key
# 删除指定 key 中指定 name、name2 的值,可以指定多个
zrem key name name2

# 获取指定 key 中起始位置到结束位置的元素
# 不加 withscores 则只返回 name,加上将 score 一并返回,从小到大
zrange key start end withscores
# 获取指定 key 中起始位置到结束位置元素以从大到小的顺序返回,包含两端
zrevrange key start end withscores

# 按照指定的排名范围删除元素,排名为分数从小到大,排名从 0 开始
zremrangebyrank key start end
# 按照指定的分数范围删除元素,包含min和max
zremrangebyscore key min max

# 返回指定 key 中指定分数范围的元素从小大
zrangebyscore key min max withscores
# 返回指定 key 中指定分数范围中指定角标范围的元素,start 和 end 是索引
zrangebyscore key min max withscores limit start end

# 将指定 key中指定 name 的元素的分数在原有基础上加 score,并返回增加后的分数
zincrby key score name
# 返回指定 key 中指定分数范围中元素的个数,包括起始和结束
zcount key min max
# 返回指定 key 中指定 name 元素的排名(从小到大),起始位置从 0 开始
zrank key name
# 返回指定 key 中指定 name 元素的排名(从大到小),起始位置从 0 开始
zrevrank key name
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

# 适用场景

# 1)为所有参与排名的资源建立排序依据。

TOP10(歌曲,电影)。

# 2)定时任务执行顺序管理或者过期管理。

会员制度(月、季度、年),time 获取系统当前时间。

# 总结

类型 简介 特性 场景
String(字符串) 二进制安全 可以包含任何数据,比如 jpg 图片或者序
列化的对象,一个键最大能存储 512M
---
Hash(字典) 键值对集合,
即编程语言中的 Map 类型
适合存储对象,并且可以像数据库中
update 一个属性一样只修改某一项属性值(Memcached 中需要取出整个字符串
反序列化成对象修改完再序列化存回去)
存储、读取、修改用户属性
List(列表) 链表(双向链表) 增删快,提供了操作某一段元素的 API 1. 最新消息排行等功能
(比如朋友圈的时间线)
2. 消息队列
Set(集合) 哈希表实现,元素不重复 1. 添加、删除、查找的复杂度都是 O(1)
2. 为集合提供了求交集、并集、差集等操作
1. 共同好友
2. 利用唯一性,统计访问网站
的所有独立 ip
3. 好友推荐时,根据 tag 求交集,大于某个阈值就可以推荐
Sorted Set(有序集合) 将 Set 中的元素增加一
个权重参数 score,元素按 score 有序排列
数据插入集合时,已经进行天然排序 1. 排行榜
2. 带权重的消息队列

(完)