Redis基础之五种数据类型操作和应用场景详解

一.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应用于基于时间顺序的数据操作,而不关注具体时间

七.应用场景总结

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值