Redis数据类型

目录

数据存储类型介绍

业务数据的特殊性

Redis 数据类型(5种常用)

Redis 数据类型之String

String 类型

String类型数据的扩展操作

String 类型的注意事项

key的设置约定

Redis 数据类型之hash

hash类型概念

hash类型数据的基本操作

hash类型数据扩展操作

hash类型数据操作的注意事项

hash类型应用场景购物车

Hash实现抢购

Redis 数据类型之hash

概述

list类型数据基本操作

list 类型数组扩展操作

list类型数据操作注意事项

list应用

Redis 数据类型之set

概述

基本操作

set类型数据的扩展操作

Set类型数据操作的注意事项

set类型应用场景

Redis 数据类型之sorted_set

概述

sorted_set类型数据的基本操作

sorted_set 类型数据的扩展操作

sorted_set 类型数据操作的注意事项

sorted_set类型应用场景

数据类型实践案例


数据存储类型介绍

业务数据的特殊性

作为缓存使用

  1. 原始业务功能设计
    秒杀
    618活动
    双十一活动
    排队购票
  2. 运营平台监控到的突发高频访问数据
    突发市政要闻,被强势关注围观
  3. 高频、复杂的统计数据
    在线人数
    投票排行榜

附加功能
系统功能优化或升级

  • 单服务器升级集群
  • Session管理
  • Token管理

Redis 数据类型(5种常用)

可以把这五种数据类型结合Java中的相关数据结构来理解

  • string --> String
  • hash --> Hashmap
  • list --> LinkList
  • set --> HashSet
  • sorted_set --> TreeSet

Redis 数据类型之String

redis 数据存储格式

  • redis自身是一个Map,其中所有的数据都是采用key:value的形式存储
  • 数据类型指的是存储的数据的类型,也就是value部分的类型,key部分永远都是字符串

String 类型

  • 存储的数据:单个数据,最贱的数据存储类型,也是最常用的数据存储类型
  • 存储数据的格式:一个存储空间保存一个数据
  • 存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用

String 类型数据的基本操作

  • 添加/修改数据

set key value

  • 获取数据

get key

  • 删除数据

del key

  • 添加/修改多个数据

mset key1 valueq key2 value2 …

  • 获取多个数据

mget key1 key2 …

  • 获取数据字符个数(字符串长度)

strlen key

  • 追加信息到原始信息后部(如果原始信息存在就追加,否则新建)

append key value

单数据操作与多数据操作的选择之惑

原则上来说,多指令操作比单操作指令的速度要快,因为发送指令和返回结果都是需要时间的,多指令操作只需要一次中间的的传输就可以,但也不能盲目追求多指令,如果一次发送的数据过多,容易造成阻塞,因为Redis是单线程模式,比如说,有一亿条数据指令,可以进行切割,一次一百万条,发100次,这样来寻求最优。

String类型数据的扩展操作

一、String作为数值操作

  • string在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算
  • redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。
  • 注意:按数值进行操作的数据,如果原始数据不能转成数值,或超过了redis数值上线范围,将会报错。9223372036854775807 (java中long型数据最大值,Long.MAX_VALUE)

业务场景
大型企业级应用中,分表操作是基本操作,使用多张表存储同类型数据,但是对应的主键id必须保证统一性,不能重复。Oracle数据库具有sequence设定,可以解决该问题,但是MySQL数据库并不具有类似的机制,那么如何解决?

解决方案

  • 设置数值数据增加指定范围的值

incr key
incrby key increment
incrbyfloat key increment

  • 设置数值数据减少指定范围的值

decr key
decrby key increment

 

Tips1:

  • Redis用于控制数据库表主键ID,为数据库表主键提供生成策略,保证数据库表的主键唯一性
  • 此方案适用于所有数据库,且支持数据库集群。

二、String 数据时效性设置

业务场景

场景一:“最强女生”,启动海选投票,只能通过微信投票,每个微信号每4个小时只能投1票。

场景二:电商商家开启热门商品推荐,热门商品不能一直处于热门期,每种商品热门期维持3天,3天后自动取消热门

场景三:新闻网站会出现热点新闻,热点新闻最大的特征是对时效性,如何自动控制热点新闻的时效性

解决方案

  • 设置数据具有指定的声明周期

setex key seconds value
psetex key milliseconds value

设置tel键值为1,有效时间为10秒,过期之后就擦除了

Tips 2:

  • redis 控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作

String 类型的注意事项

  • 数据操作不成功的反馈与数据正常操作之间的差异
    1、表示运行结果是否成功
     (integer)0–>false 失败
     (integer)1–>true 成功
    2、表示运行结果值
     (integer)3–>3 3个
     (integer)1–>1 1个
  • 数据未获取到
    (nil)等同于null
  • 数据最大存储量
    512MB
  • 数值计算最大范围(java中的long的最大值) :9223372036854775807

三、String类型应用场景

业务场景
主页高频访问信息显示控制,例如新浪微博大V主页显示粉丝数与微博数量

Tips 2:

  • Redis应用于各种结构性和非结构型高热度数据访问加速

key的设置约定

  • 数据库中的热点数据key命名惯例

 

Redis 数据类型之hash

hash类型概念

类型存在原因
对象类数据的存储如果具有较为频繁的更新需求操作会显得笨重。

 

特性

  • 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
  • 需要的内存结构:一个存储空间保存多少个键值对数据
  • hash类型:底层使用哈希表结构实现数据存储

hash类型数据的基本操作

  • 添加/修改数据

hset key field value

  • 获取数据

hget key field
hgetall key

  • 删除数据

hdel key field1 [field2]

  • 添加/修改多个数据

hmset key field1 value1 field2 calue2

  • 获取多个数据

hmget key field1 field2 …

  • 获取哈希表中字段的数量

hlen key

  • 获取哈希表中是否存在指定的字段

hexists key field

hash类型数据扩展操作

  • 获取哈希表中所有的字段名和字段值

hkeys key
hvals key

  • 设置指定字段的数值数据增加指定范围的值

hincrby key field increment
hincrbyfloat key field increment

hash类型数据操作的注意事项

  • hash类型下的value只能存储字符串,不允许存储其他类型数据,不存在嵌套现象。如果数据未获取到,对应的值为(nil)
  • 每个hash可以存储232-1个键值对
  • hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初中不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
  • hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈

hash类型应用场景购物车

解决方案

  • 以客户ID作为key,每位客户创建一个hash存储结构存储对应的购物车信息
  • 将商品编号作为field,购买数量作为value进行存储
  • 添加商品:追加全新的field与value
  • 浏览:遍历hash
  • 更改数量:自增/自减,设置value值
  • 删除商品:删除field
  • 清空:删除key

当前设计是否加速了购物车的呈现?
当前仅仅是将数据存储到redis中,并没有起到加速的所用,商品信息还需要二次查询数据库

一种解决思路是:

  • 每条购物车中的商品记录保存成两条field

  • field1 专用于保存购买数量
    1、命名格式:商品id:nums
    2、保存数据:数值

  • field2 专用于保存购物车中显示的信息,包含文字描述,图片地址,所属商家信息等
    1、命名格式:商品id:info
    2、保存数据:json

但是这样问题又出现了,大量的info信息重复,所以我们可以将field2的内容变成一个固定的独立hash,专门找个地方保存。

 

  • 修改数据,如果有失败,如果没有创建

hsetnx key field value

Hash实现抢购

解决方案

  • 以商家id作为key
  • 将参与抢购的商品id作为field
  • 将参与抢购的商品数量作为对应的value
  • 抢购时使用降至的方式控制产品数量

Tips5

  • Redis应用于抢购、限购类、限量发放优惠券、激活码等业务的数据存储设计。

Redis 数据类型之hash

概述

  • 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
  • 需要的存储数据:一个存储空间保存多个数据,且通过数据可以体现进入顺序
  • list类型:保存多个数据,底层使用双向链表存储结构实现

list类型数据基本操作

  • 添加/修改数据

lpush key value1 [value2] …
rpush key value1 [value2] …

  • 获取数据

lrange key start stop     //当不知道list中有多少元素又想查询所有元素时,可以用lrange key start -1命令
lindex key index
llen key

  • 删除并移除数据

lpop key    //lpop key 对应lpush key value,先进先出
rpop key

list 类型数组扩展操作

扩展一:

  • 规定时间内获取并移除数据

blpop key1 [key2] timeout
brpop key1 [key2] timeout

阻塞式获取,获取值如果还没有的时候可以等,等待时间为timeout,如果有值就可以获取到。

扩展二:

微信朋友圈点赞,要求按照点赞顺序显示点赞好友信息,如果取消点赞,移除对应好友信息
在这里插入图片描述

  • 移除指定数据,剩余元素顺序不变

lrem key count value

 

Tips6:

  • redis应用于具有操作线后顺序的数据控制

list类型数据操作注意事项

  • list 中保存的数据都是string类型的,数据总容量式由西安的,最多232-1个元素(4294967295)
  • list具有索引的概念,但是操作数据时候通常以队列的形式进行入队出队操作,或以栈的形式进入栈出栈的操作
  • 获取全部数据操作结束索引设置为-1
  • list 可以对数据进行分页操作,通过第一页的信息来自list,第2页及更多的信息通过数据库的形式加载

list应用

业务场景

  • twitter、新浪微博、腾讯微博中个人用于的关注列表需要按照用户的关注顺序进行展示,粉丝列表需要将最近关注的粉丝列在前面
  • 新闻、资讯类网站如何将最新的新闻或资讯按照发生的事件顺序展示
  • 企业运营过程中,系统将产生出大量的运营数据,如何保障堕胎服务器操作日志的统一顺序输出?

解决方案

  • 依赖list的数据具有顺序的特征对信息进行管理
  • 使用队列模型解决多路信息汇总合并的问题
  • 使用栈模型解决最新消息的问题

Redis 数据类型之set

概述

  • 新的存储需求:存储大量的数据,在查询方面提供更高的效率
  • 休要的存储结构:能够保存大量的数据,搞笑的内部存储机制,便于查询
  • set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值式不允许重复的

基本操作

  • 添加数据

sadd key menber1 [member2]

  • 获取全部数据

smembers key

  • 删除数据

srem key member1 [member2]

  • 获取集合数据总量

scard key

  • 判断集合中是否包含指定数据

sismember key member

set类型数据的扩展操作

业务场景一
每位用户首次使用进入头条时候会设置3项爱好的内容,但是后期为了增加用户的活跃度,兴趣点,必须让用户对其他信息类别逐渐产生兴趣,增加客户留存度,如何实现?

业务分析

  • 系统分析出各个分类的最新或最热点信息条目并组织成set集合
  • 随机挑选其中部分信息
  • 配合用户关注信息分类中的热点信息组织展示的全信息集合
    解决方案
  • 随机获取集合中指定数量的数据

srandmember key [count]

  • 随机获取集合中的某个数据并将该数据移出集合

spop key

Tips8:

  • redis应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,热点旅游线路,应用APP推荐,大V推荐等

业务场景二

解决方案

  • 求两个集合的交、并、差集

sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]

  • 求两个集合的交、并、差集并存储到指定集合中

sinterstore destination key1 [key2]
sunionstore destination key1 [key2]
sdiffstore destination key1 [key2]

  • 将指定数据从原始集合移动到目标集合中

smove source destination member

 

Tips9: 

  • redis应用于同类信息的关联搜索,二度关联搜索,深度关联搜索
  • 显示共同关注(一度)
  • 显示共同好友(一度)
  • 由用户A出发,获取到好友用户B的好友信息列表(一度)
  • 由用户A出发,获取到好友用户B的购物清单列表(二度)
  • 由用户A出发,获取到好友用户B的游戏充值列表(二度)

Set类型数据操作的注意事项

  • set类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份
  • set虽然与hash的存储结构相同,但是无法启用hash中存储值的空间

业务场景举例

 

解决方案

  • 依赖set集合数据不重复的特征,依赖set集合hash存储结构特征完成数据过滤与快速查询
  • 根据用户id获取用户所有角色
  • 根据用户所有角色获取用户所有操作权限放入set集合
  • 根据用户所有觉得获取用户所有数据全选放入set集合

校验工作redis提供基础数据还是提供校验结果? ------最好是只提供基础数据
Tips 10:

  • redis应用于同类型不重复数据的合并操作

set类型应用场景

业务场景一

解决方案

  • 利用set集合的数据去重特征,记录各种访问数据
  • 建立string类型数据,利用incr统计日访问量(PV)
  • 建立set模型,记录不同cookie数量(UV)
  • 建立set模型,记录不用IP数量(IP)

业务场景二(黑白名单)

解决方案

  • 基于经营战略设定问题用户发现、鉴别规则
  • 周期性更行满足规则的用户黑名单,加入set集合
  • 用户行为信息达到后与黑名单进行比比对,确认行为去向
  • 黑名单过滤IP地址:应用于开放游客访问权限的信息源
  • 黑名单过滤设备信息:应用于限定访问设备的信息源
  • 黑名单过滤用户:应用于基于访问权限的信息源

Tips 12:

  • redis应用于基于黑名单与白名单设定的服务控制

Redis 数据类型之sorted_set

概述

  • 新的存储需求:根据排序有利于数据的有效显示,需要提供一种可以根据自身特征进行排序的方式
  • 需要的存储结构:新的存储模型,可以保存可排序的数据
  • sorted_set类型:在set的存储结构基础上添加可排序字段

sorted_set类型数据的基本操作

  • 添加数据

zadd key score1 member1 [score2 member2]

  • 获取全部数据

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

注意

  • min与max用于限定搜索查询的条件

  • start与stop用于限定查询范围,作用于索引,表示开始和结束索引

  • offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量

  • 获取集合数据总量

zcard key
zcount key min max

  • 集合交、并操作

zinterstore destination numkeys key [key …]
zunionstore destination numkeys key [key …]

sorted_set 类型数据的扩展操作

业务场景

解决方案

  • 获取数据对应的索引(排名)

zrank key member
zrevrank key member

  • score 值获取与修改

zscore key member
zincrby key increment member

Tips 13:

  • redis 应用于计数器组合排序功能对应的排名

sorted_set 类型数据操作的注意事项

  • score 保存的数据存储空间是64位,如果是整数范围是在这里插入图片描述
  • score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时侯要慎重
  • sorted_set底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反复覆盖,保留最后一次修改的结果,但也是返回0,也就是说,添加失败,但是修改成功(set只是添加失败)

业务场景

å¨è¿éæå¥å¾çæè¿°

解决方案

  • 对于基于时间线限定的任务处理,将处理时间记录位score值,利用排序功能区分处理的先后顺序
  • 记录下一个要处理的事件,当到期后处理对应的任务,移除redis中的记录,并记录下一个要处理的时间
  • 当新任务加入时,判定并更新当前下一个要处理的任务时间
  • 为提升sorted_set的性能,通常将任务根据特征存储成若干个sorted_set.例如1小时内,1天内,年度等,操作时逐渐提升,将即将操作的若干个任务纳入到1小时内处理队列中
  • 获取当前系统时间

time

Tips 14

  • redis应用于定时任务执行顺序管理或任务过期管理

sorted_set类型应用场景

业务场景

å¨è¿éæå¥å¾çæè¿°

解决方案

  • 对于带有权重的任务,优先处理权重高的任务,采用score记录权重即可

å¨è¿éæå¥å¾çæè¿°

Tips 15:

  • redis应用于即时任务/消息队列执行管理

数据类型实践案例

业务场景一:计数器

å¨è¿éæå¥å¾çæè¿°

解决方案

  • 设计计数器,记录调用次数,用于控制业务执行次数。以用户id作为key,使用此时作为value
  • 在调用前获取次数,判断是否超过限定次数,不超过次数的情况下,每次调用计数+1,业务调用失败,计数-1
  • 为了计数器设置生命周期为指定周期,例如1秒/分钟,自动清空周期内使用次数。

Tips 16:

  • redis应用于限时按次结算的服务控制

业务场景二:微信对话

å¨è¿éæå¥å¾çæè¿°

业务分析

解决方案

  • 依赖list的数据具有顺序的特征对消息进行管理,将list结构作为使用
  • 对指定与普通会话分别创建独立的list分别管理
  • 当某个list中接收到用户消息后,将消息发送方的id从list的一侧加入list(此处设定左侧)
  • 多个相同id发出的消息反复入栈会出现问题,在入栈之前无论是否具有当前id对应得消息,先删除对应id
  • 推送消息时先推送顶置会话list,再推送普通会话list,推送完成的list清除所有数据
  • 消息的数量,也就是微信用户对话数量采用计数器的思想另行记录,伴随list操作同步更新

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值