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
2
3
4
5
6
7
# 适用场景
# 1)投票的有效时长
可以指定数据的生命周期,来控制数据是什么时候失效,用过数据失效控制对应的业务行为,适用于具有时效性限定控制操作。
setnx key seconds value # 设置 key 对应 value 值的有效时长是 seconds
# 2)大 V 用户信息的数据存储情况:粉丝数、博文数等
增加一个关注的粉丝,使用 incr
直接增加:
set user:id:12:fans 34
incr user:id:12:fans
2
Redis 用于各种数据结构和非结构高热度数据流访问。
这里说明一下数据库中热点数据 key 命名惯例:使用 :
分割数据层次:
(热点数据 key 命名惯例)
# 3)分布式锁
# Hash
对存储的数据进行编组,典型的应用存储对象信息。一个存储空间可以保存多个键值对数据。底层是 hash 表的实现。
(Hash 存储结构)
value 值只存储字符串,每个 hash 可以存储 2³²-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
2
3
4
5
6
7
8
9
10
11
# 适用场景
# 1)电商网站购物车
购物车信息,可以容易增删改查,管理数量等。
# 2)商家信息管理
应用于抢购,发放消费券(发完为止)等数据存储设计。
# List
存储多个数据,对数据进入存储空间的顺序要进行区分。数据主要要体现顺序,底层使用双向链表实现。
list 保存的数据都是 string 类型的,最多有 2³²-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
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 功能。
(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
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 不存储数据,只用于排序。
(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
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. 带权重的消息队列 |
(完)