一.String操作
1. String类型的基本操作
- 添加/修改数据
set key value
- 获取数据
get key
- 删除数据
del key
- 添加/修改多个数据
mset key1 value1 key2 value2 ...
- 获取多个数据
mget key1 key2 ...
- 获取数据字符个数(字符串长度)
strlen key
- 追加信息到原始信息后部(如果原始信息存在就追加, 否则新建)
append key value
2.数值增减操作
- 设置数值数据增加指定范围的值
incr key
incrby key increment
incrbyfloat key increment
- 设置数值数据减少指定范围的值
decr key
decrby key increment
- string作为数值操作
1>String在redis内部存储默认是一个字符串, 当遇到增减类操作incr, decr时会转成数值型进行计算.
2>redis所有的操作都是原子性的,采用单线程处理所有业务, 命令是一个一个执行的,因此无需考虑并发
带来的数据影响
3> (注意) 按数值进行操作的数据,如果原始数据不能转为数值, 或超过了redis数值上限范围,将报错 - 应用1
redis用于控制数据库表主键id, 为数据表主键提供生成策略,保障数据库表的主键唯一性
此方案适用于所有数据库,且支持数据库集群
3.数据时效性设置
- 设置数据具有指定的生命周期
setex key seconds value
psetex key milliseconds value
- 应用2
redis控制数据的生命周期, 通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作
4. String类型数据操作的注意事项
- 数据操作不成功的反馈和数据正常操作之间的差异
1> 表示运行结果是否成功
(Integer)0 → false 失败
(Integer)1 → true 成功
2> 表示运行结果值
(Integer)3 → 3 3个
(Integer)1 → 1 1个 - 数据未获取到
(nil)等同于null - 数据最大存储量
512MB - 数值计算最大范围(java中long的最大值)
5.String类型应用场景
- 在Redis中为大V用户设定用户信息, 以用户主键和属性值作为key,后台设定定时刷新策略即可
eg: user:id :5344:fans → 123233
eg: user:id :5344:blogs → 6454 - 在Redis中以json格式存储大V用户信息, 定时刷新(也可以使用hash类型)
eg: user:id :5344 → {id:25344,name:春晚,fans:24343,blogs:6164,focus:83} - 应用3
redis应用于各种结构型和非结构型高热度数据访问加速 - key的设置约定
数据库中的热点数据key命名惯例
表名 : 主键名 : 主键值 : 字段名
eg: order : id : 213213 : name
二. Hash类型
- 新的存储需求: 对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
- 需要的存储结构: 一个存储空间保存多个键值对数据
- hash类型: 底层使用哈希表结构实现数据存储
- hash存储结构优化
1> 如果field数量较少,存储结构优化为类数组结构
2> 如果field数量较多, 存储结构使用HashMap结构
1.hash类型数据的基本操作
- 添加/修改数据
hset key field value
- 获取数据
hget key field
hgettall key
- 删除数据
hdel key field1 [field2]
- 添加/修改多个数据
hmset key field1 value1 field2 value2 ...
- 获取多个数据
hmget key field1 field2 ...
- 获取哈希表中字段的数量
hlen key
- 获取哈希表中是否存在指定的字段
hexists key field
2.hash类型数据扩展操作
- 获取哈希表中所有的字段名或字段值
hkeys key
hvals key
- 设置指定字段的数值数据增加指定范围的值
hincrby key field increment
hincrbyfloat key field increment
3.hash类型数据操作的注意事项
- hash类型下的value只能存储字符串, 不允许存储其他数据类型, 不存在嵌套现象. 如果数据未获取到,对应值为(nil)
- hash类型十分贴近对象的数据存储形式, 并且可以灵活添加删除对象属性. 但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
- hgetall操作可以获取全部属性, 如果内部field过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈
4.hash类型应用场景1
- 业务场景
电商网站购物车设计与实现 - 业务分析
1>仅分析购物车的redis存储模型
添加,浏览,更改数量,删除,清空
2>购物车于数据库间持久化同步(不讨论)
3>购物车于订单建关系(不讨论)
提交购物车: 读取数据生成订单
商家临时价格调整: 隶属于订单级别
4>未登录用户购物车信息存储(不讨论)
cookie存储 - 解决方案
1>以客户id作为key,每位客户创建一个hash存储结构存储对应的购物车信息
2>将商品编号作为field,购买数量作为value进行存储
3>添加商品:追加全新的field与value
4>浏览:遍历hash
5>更改数量:自增/自减,设置value值
6>删除商品: 删除field
7>清空: 删除key - 当前设计是否加速了购物车的呈现
当前仅仅是将数据存储到了redis中,并没有起到加速的作用, 商品信息还需要二次查询数据库
1>每条购物车中的商品记录保存为两条field
2>field1专用于保存购买数量
命名格式: 商品id:nums
保存数据: 数值
3>field2专用于保存购物车中显示的信息, 包含文字描述,图片地址,所属商家信息等 [独立hash]
命名格式: 商品id:info
保存数据: json
hsetnx key field value
//这条命令可用于判断hash中的field是否存在有值, 如果当前key值对应的field有值,不进行操作,如果当前key中没有值,
//进行添加
- 应用4
redis应用于购物车数据存储设计
5.hash类型应用场景2
- 业务场景
- 解决方案
1>以商家id作为key
2>将参与抢购的商品id作为field
3>将参与抢购的商品数量作为对应的value
4>抢购时使用降值的方式控制产品数量 - 应用5
redis应用于抢购,限购类,限量发放优惠券,激活码等业务的数据存储设计
三.list类型
- 数据存储需求: 存储多个数据, 并对数据进入存储空间的顺序进行划分
- 需要的存储结构: 一个存储空间保存多个数据,且通过数据可以体现进入顺序
- list类型: 保存多个数据, 底层使用双向链表存储结构实现
1.list类型数据基本操作
- 添加/修改数据
//从左添加
lpush key value1 [value2] ...
//从右添加
rpush key value1 [value2] ...
- 获取数据
//查看key对应的数据 start 开始索引 stop 结束索引 stop为-1, 可以看全部数据
lrange key start stop
//获取指定索引的值 index 为索引
lindex key index
//获取元素个数
llen key
- 获取并移除数据
//从左移除
lpop key
//从右移除
rpop key
2.list阻塞数据获取
规定时间内获取并移除数据
//从左删除获取 timeout为规定时间 key值可以有多个
blpop key1 [key2] timeout
//从右删除获取
brpop key1 [key2] timeout
3.list类型数据操作注意事项
- list中保存的数据都是string类型的, 数据总容量是有限的
- list具有索引的概念, 但是操作数据时通常以队列的形式进行入队出队操作, 或以栈的形式进行入栈出栈操作
- 获取全部数据操作结束索引设置为-1
- list可以对数据进行分页操作, 通常第一页的信息来自于list,第二页及更多的信息通过数据库的形式加载
4.list扩展操作删除数据
- 解决方案
移除指定数据
//count 删除几个 value 想要移除的值
lrem key count value
- 应用6
redis应用于具有操作先后顺序的数据控制
5.list实现日志消息队列
- 解决方案
1> 依赖list的数据具有顺序的特征对信息进行管理
2>使用队列模型解决多路信息汇总合并的问题
3>使用栈模型解决最新消息的问题 - 应用7
redis应用于最新消息展示
四.set类型
- 新的存储需求: 存储大量数据,在查询方面提供更高的效率
- 需要的存储结构: 能够保存大量的数据, 高效的内部存储机制, 便于查询
- set类型:与hash存储结构完全相同,仅存储键, 不存储值(nil),并且值是不允许重复的
1.set类型数据的基本操作
- 添加数据
//member 成员
sadd key member1 [member2]
- 获取全部数据
smembers key
- 删除数据
srem key member1 [member2]
- 获取集合数据总量
scard key
- 判断集合中是否包含指定数据
sismember key member
2.set操作随机数据
- 业务分析
1> 系统分析出各个分类的最新或最热点信息条目并组织成set集合
2>随机挑选其中的部分信息
3>配合用户关注信息分类中的热点信息组织成展示的全信息集合 - 解决方案
1> 随机获取集合中指定数量的数据 (原集合数据不变)
//count 指定数量
srandmember key [count]
2>随机获取集合中的某个数据并将该数据移出集合(原集合数据改变)
spop key
- 应用8
redis应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,热卖旅游路线,应用APP推荐,大V推荐等
3.set数据交并差操作
- 解决方案
1>求两个集合的交,并,差集
//交集
sinter key1 [key2]
//并集
sunion key1 [key2]
//差集
sdiff key1 [key2]
2>求两个集合的交,并,差集并存储到指定集合中
//交集
sinterstore destination key1 [key2]
//并集
sunionstore destination key1 [key2]
//差集
sdiffstore destination key1 [key2]
3> 将指定数据从原始集合中移动到目标集合中
smove source destination member
- 应用9
redis应用于同类信息的关联搜索, 二度关联搜索,深度关联搜索
显示共同关注(一度)
显示共同好友(一度)
由用户A出发,获取到好友用户B的好友信息列表(一度)
由用户A出发,获取到好友用户B的购物清单列表(二度)
由用户A出发,获取到好友用户B的游戏充值列表(二度)
4.set实现权限校验
- 解决方案
1> 依赖set集合数据不重复的特征,依赖set集合hash存储结构特征完成数据过滤与快速查询
2>根据用户id获取用户所有角色
3>根据用户所有角色获取用户所有操作权限放入set集合
4>根据用户所有角色获取用户所有数据全选放入set集合 - 应用10
redis应用于同类型不重复数据的合并操作
5.set实现网站访问量统计
- 解决方案
1> 利用set集合的数据去重特征,记录各种访问数据
2> 建立String类型数据, 利用incr统计日访问量(PV)
3>建立set模型, 记录不同cookie数量(UV)
4>简历set模型, 记录不同IP数量(IP) - 应用11
redis应用于同类型数据的快速去重
6.set实现黑白名单
- 解决方案
1> 基于经营战略设定问题用户发现,鉴别规则
2>周期性更新满足规则的用户黑名单,加入set集合
3>用户行为信息达到后与黑名单进行对比, 确认行为去向
4>黑名单过滤IP地址: 应用于开放游客访问权限的信息源
5>黑名单过滤设备信息: 应用于限定访问设备的信息源
6>黑名单过滤用户: 应用于基于访问权限的信息源 - 应用12
redis应用于基于黑名单与白名单设定的服务控制
五.sorted_set类型 (sset)
- 新的存储需求: 数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
- 需要的存储结构: 新的存储模型, 可以保存可排序的数据
- sorted_set类型: 在set的存储结构基础上添加可排序字段
1.sorted_set类型数据的基本操作
- 添加数据
zadd key score1 member1 [score2 member2]
- 获取全部数据
// 查看全部 开始索引start为0 结束索引stop为 1
//正序
zrange key start stop [withscores]
//反序
zrevrange key start stop [withscores]
- 删除数据
zrem key member [member ...]
- 按条件获取数据
zrangebyscore key min max [withscores] [limit]
zrevrangebyscore key max min [withscores]
- 条件删除数据
zremrangebyrank key start stop
zremrangebyscore key min max
注意:
1> min与max用于限定搜索查询的条件
2> start与stop用于限定查询范围, 作用于索引, 表示开始和结束索引
3> offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量
- 获取集合数据总量
zcard key
zcount key min max
- 集合交,并操作
zinterstore destination numkeys key [key ...]
zunionstore destination numkeys key [key ...]
2.sorted_set类型数据操作的注意事项
- score保存的数据存储空间是64位, 如果是整数范围是-9007199254740992~9007199254740992
- score保存的数据也可以是一个双精度的double值, 基于双精度浮点数的特征,可能丢失精度, 使用时要慎重
- sorted_set 底层存储还是基于set结构的, 因此数据不能重复, 如果重复添加相同的数据, score值将被反复覆盖, 保留最后一次修改的结果
3.sorted_set实现排行榜
- 业务分析
为所有参与排名的资源建立排序依据 - 解决方案
1> 获取数据对应的索引(排名)
zrank key member
zrevrank key member
2> score值获取与修改
zscore key member
zincrby key increment member
- 应用13
redis应用于计数器组合排序功能对应的排名
4.sorted_set实现时效性任务管理
- 解决方案
1> 对于基于时间线限定的任务管理,将处理时间记录为score值, 利用排序功能区分处理的先后顺序
2> 记录下一个要处理的时间,当到期后处理对应任务,移除redis中的记录, 并记录下一个要处理的时间
3> 当新任务加入时, 判断并更新当前下一个要处理的任务时间
4> 为提升sorted_set的性能, 通常将任务根据特征存储成若干个sorted_set. 例如1小时内, 周内, 月内, 季内,年度等, 操作时逐级提升, 将即将操作的若干个任务纳入1小时内处理的队列中
5> 获取当前系统时间
time
- 应用14
redis应用于定时任务执行顺序管理或任务过期管理
5.sorted_set带有权重的任务管理
- 应用15
redis应用于即时任务/消息队列执行管理
六.数据类型案例
1.按次结算的服务控制
- 应用16
redis应用于限时按次结算的服务控制
2.微信接收消息顺序控制
- 应用17
redis应用于基于时间顺序的数据操作,而不关注具体时间
七.应用场景总结