Redis hash

摘要:
如果未获得数据,则对应的值是每个哈希可以存储2^32-1个键值。哈希类型非常接近对象的数据存储形式,您可以灵活地添加或删除对象属性。

目录

hash 类型

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

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

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

    Redis hash第1张

    hash 存储优化:

    • 如果 field 数量较少,存储结构优化为类数组结构
    • 如果 field 数量较多,存储结构使用 HashMap 结构

hash 类型数据的基本操作

  • 添加/修改数据

    hset key field value

  • 获取数据

    hget key field
    hgetall key
    
  • 删除数据

    hdel key field1 [field2]

  • 添加/修改多个数据

    hmset key field1 value1 field2 value2 ...

  • 获取多个数据

    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 可以存储 2^32 - 1 个键值对
  • hash 类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但 hash 设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将 hash 作为对象列表使用
  • hgetall 操作可以获取全部属性,如果内部 field 过多,遍历整体数据效率就会很低,有可能成为数据访瓶颈

hash 类型应用场景

1、业务场景

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

1.1、业务分析

  • 仅分析购物车的 redis 存储模型

    ​ 添加、浏览、更改数量、删除、清空

  • 购物车与数据库间持久化同步(不讨论)

  • 购物车与订单间关系(不讨论)

    • 提交购物车:读取数据生成订单
    • 商家临时价格调整:隶属于订单级别
  • 未登录用户购物车信息存储(不讨论)

    • cookie 存储

1.2、解决方案

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

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

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

  • field1 专用于保存购买数量

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

    • 命名格式:商品 id:info
    • 保存数据:json

    hsetnx key field value 如果 key 有值则操作失败返回 0

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

2、业务场景

双 11 活动日,销售手机充值卡的商家对移动、联通、电信的30元、50元、100元商品推出抢购活动,每种商品抢购上限 1000 张

2.1 解决方案

  • 以商家 id 作为 key
  • 将参与抢购的商品 id 作为 field
  • 将参与抢购的商品数量作为对应的 value
  • 抢购时使用降值得方式控制产品数量
  • 实际业务中还有超卖等问题,这里不讨论

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

3、业务场景

string 存储对象 (json) 与 hash 存储对象

  • string 存储对象,常用于对数据进行过整体操作,比如:一次性更新全部数据,或一次性获取全部数据,偏向于只读操作
  • hash 存储对象,相对来说更新操作比较灵活

免责声明:文章转载自《Redis hash》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇mysql8 安装,并且配置远程登录iOS系统原生 二维码的生成、扫描和读取(高清、彩色)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

redis 中文存储乱码问题

在redis 中存储中文,读取会出现乱码(其实不是乱码,只是不是我们存的中文显示) 1 redis> set test "我们" 2 OK 3 redis> get test 4 "xe6x88x91xe4xbbxac" 如何在get时取到它的中文呢?只需要在redis-cli 后面加上--raw redis> get...

五,自定义监控项并创建图形

目录 五,zabbix自定义监控项 一,为什么要自定义监控项 二,自定义监控项中的基础概念 三,自定义监控项配置 1,自定义监控项基本格式 2,在agent上自定义监控项 3,web页面添加监控项 4,为该监控项创建一个图形 五,zabbix自定义监控项 一,为什么要自定义监控项 有的时候zabbix提供的监控项目,不能满足我们生产环境下...

redis Lua学习与坑

1.在写lua脚本往redis中添加zadd 有序集合的时候一直报 "value isnotavalid float"的错误,经过查询相关资料,最后发现,是顺序写反了。 相关代码 --[错误代码] redis.call('zadd',@TimeOrderKey,objRecord.ActivityID,@TimeScore);--[应该时间在前,value...

redis实现消息队列

业务需求 本文是以laravel框架来介绍redis队列,具体用法你可以参考http://www.cnblogs.com/lengthuo/p/7277260.html最近接受一个很简单的东西,(说起来很简单,硬是搞了2天。)我们业务中的一些定时是在晚上执行,但是有的定时必须推送微信消息给用户,为了不影响客户的休息,我们之后想把发去推迟这个任务。对于我们...

Redis开启AOF导致的删库事件

事件背景 Redis主从开启AOF,错误操作导致数据被清空。 Redis主要作用:缓存、队列。 事故过程 Redis搭建了主从,持久化方式为RDB,RDB没有定时备份,且AOF都没有开启。 考虑到开启AOF会使Redis安全性更高,所以尝试先在从机做测试,没问题后再上主机。 Redis开启AOF的方式非常简单,打开Redis的conf文件,找到【appe...

LINUX系统配置

LINUX系统配置 Linux 安装jdk方法; Linux Tomcat 安装与配置 Linux redis 安装与配置 (例1) Linux redis安装配置(例2) NGINX 安装 Linux 安装jdk方法 JDK安装 tar.gz为解压后就可使用的版本,这里我们将jdk-7u3-linux-i586.tar.g...