Redis基础篇3-数据存储类型(string和hash)

如有错误,欢迎指正

业务数据的特殊性

作为缓存使用

1.原始业务功能设计

秒杀

618

双11

排队购票

排行榜

2.运营平台监控到的突发高频访问数据

突发时政要闻,被强势关注围观

3.高频,复杂的统计数据

在线人数

4.附加功能

系统功能优化或升级

单服务器升级集群

Session管理

数据存储类型

string  hash   list   set   sorted_set

string

redis自身是一个Map,其中所有的数据都是采用key:value的形式存储

key(字符串)   value数据类型

string基本操作

添加/修改单个数据:

set key value

添加/修改多个数据:

mset key1 value1 key2 value2

获取单个数据:

get key

获取多个数据:

mget key1 key2

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

strlen key

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

append key value

删除单个数据:

del key

string类型数据扩展操作1

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

inor key                       #自增加1
inor key increment             
incrbyfloat key increment

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

decr key
decrby key increment

string 类型作为数值操作

string在reddis内部存储默认为一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算。

redis采用单线程处理所有业务,命令时一个一个执行的,无需考虑并发带来的数据映像

注意:按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis数值上限范围,将报错。

Tips:1.redis 用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性

2.此方案适用于所有数据库,且支持数据库集群

string类型数据扩展操作2

场景1:投票,每四小时只投1票

场景2:电商商家热门期维持3天,3天后自动取消热门

解决方案

设置数据具有指定的生命周期

setex key seconds value

pserex key milliseconds value

Tips 2:redis 控制数据到的生命周期,通过数据是否失效控制业务行为,使用与所有具有时效性限定控制的操作

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

数据操作不成功的反馈与数据正常操作之间的差异

1.表示运行结果是否成功

        (integer)0     =    false   失败

        (integer)1     =    true    成功

2.表示运行结果值

        (integer)3     =    3    3个

        (integer)1     =    1    1个

数据为获取到

(nil)等同于null

数据最大存储量

512MB

业务场景

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

解决方案

1.在redis中大V用户设定用户信息,以用户主键和属性值作为key,后台设定定时刷新策略即可

eg:user:id:3506728370:fans   →  12210947

eg:user:id:3506728370:blogs   →  6164

eg:user:id:3506728370:focuss   →  83

2.在redis中以json格式存储大V用户信息,定时刷新(也可以使用hash类型)

eg:user:id:3506728370 → {id:00789,blogs:789,fans:123456789}

set user:id:00789:fans 123456789           #主键id 值00789 放fans 123456789
set user:id:00789:blogs 789
set user:id:00789:blogs 789
set user:id:00789 {id:00789,blogs:789,fans:123456789}             #json格式

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

key的设置约定

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

        表名:主键名:主键值:字段名

eg1: order :      id   :  29437595:name

eg2: equip:      id   :  390472345:type

eg3: news:      id   :  29437595:title

hash

 新的存储需求:对一系列存储的数据济宁编组,方便管理,典型应用存储对象信息

需要的存储结构:一个存储空间保存多个键值对数据

hash类型:底层使用哈希表结构实现数据存储

hash存储结构优化

如果field数量较少,存储结构优化为类数组结构

如果field数量较多,存储结构使用HashMap机构 

添加/修改数据

hset key field value

添加/修改多个数据

hmset key field1 value1 field2 values2 ...

获取数据

hget key field

hgetall key

获取多个数据

hmget key field1 field2 ...

获取哈希表中字段的数量

hlen key

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

hexists key field

删除数据

hdel key filed1 [field2]

hash类型数据扩展操作1

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

hkeys key

hvals key

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

hincrby key field increment

hincrbyfloat key field increment

hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil)

每个hash可以存储 2的32次方-1个键值对

hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。单hash设计初衷不是为了存储大量对象而设计的,不可滥用,更不可将hash作为对象列表使用

hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈

业务场景1

电商网站购物车设计与实现

业务分析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

hmset 001 g01 100 g02 200               #两个购物车
hmset 002 g02  1 g04 7 g05 100
hgetall 001                             #查看购物车

当前设计是否加速了购物车呈现?

当前仅仅是将数据存储到了redis中,并没有加速的作用,商品信息还需要二次查询数据库

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

2.field1专用于保存购买数量

        命名格式:商品id:nums

        保存数据:数值

3.(独立调用)field2专用于保存购物车中显示的信息,包含文字描述,图片地址,所属商家信息等

       命名格式:商品id:info

       保存数据:json

hsetnx key field value

Tips4:

redis 应用于购物车数据存储设计

业务场景2

以商家id作为key

将参与抢购的商品id作为field

将参与抢购的商品id作为对应的value

抢购时使用降值得方式控制产品数量

实际业务中还有超卖等实际问题

Tips5:

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

string讲究整体性,以读为主,一次性的将数据以一次性操作

hash讲究更新操作比较灵活,群组概念,更改内部数量操作提倡使用hash

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值