redis数据类型

403 阅读7分钟

问题现象

  • 海量用户

  • 高并发

1、redis简介

概念:

​ Redis(REmote DIctionary Server)是用C语言开发的一个开源的高性能键值对(key-value)数据库。

特征:

  1. 数据间没有必然的关联关系

  2. 内部采用单线程机制进行工作

  3. 高性能。官方提供测试数据,50个并发执行100000个请求,读的速度是110000次/s,写的速度是81000次/s。

  4. 多数据类型支持

    • 字符串类型    string               java(String)

    • 列表类型        list                    java(LinkedList)

    • 散列类型        hash                 java(HashMap)

    • 集合类型         set                   java(HashSet)

    • 有序集合类型   sorted_set      java(TreeSet)

  5. 持久化支持。可以进行数据灾难恢复。

redis的应用:

  • 为热点数据加速查询(主要场景),如热点商品、热点新闻、热点资讯、推广类等高访问量信息等

  • 任务队列,如秒杀、抢购、购票排队等。

  • 即时信息查询,如各位排行榜、各类网站访问统计、公交到站信息、在线人数信息(聊天室、网站)、设备信号等

  • 时效性信息控制,如验证码控制、投票控制等

  • 分布式数据共享,如分布式集群架构中的session分离

  • 消息队列

  • 分布式锁

2、redis的下载与安装

2.1、Windows版(不建议用)

2.2、Linux版

帮助命令查询:


3、redis数据类型

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

  • 数据类型指的是存储的数据的类型,也就是value部分的类型,key部分永远都是字符串

string类型

  • 存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型

  • 存储数据的格式:一个存储空间保存一个数据

  • 存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用

基本操作

添加/修改数据

  set key value

获取数据

    get key

删除数据

    del key

添加/修改多个数据

    mset key1 value1 key2 value2 ...

获取多个数据

    mget key1 key2 ...

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

    strlen key

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

    append key value

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

    incr key  incrby key increment  
    incrbyfloat key increment

tips:

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

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

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

      decr key  decrby key increment

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

    setex key seconds value  
    psetex key milliseconds value

string类型数据操作的注意事项
  • 数据操作不成功的反馈与数据正常操作之间的差异

    • 表示运行结果是否成功

      • (integer)0 -> false 失败

      • (integer)1 -> true 成功

    • 表示运行结果值

      • (integer)3 -> 3 3个

      • (integer)1 -> 1 1个

  • 数据未获取到

    • (nil)等同于null

  • 数据最大存储量

    • 512M

  • 数值计算最大范围(java中的long的最大值)

    • 9223372036854775807

string类型应用场景

1、业务场景:

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

​解决方案:

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

    ​ 用户id:20200703

    • 粉丝数:user:id:20200703:fans -> 12210992

    • 微博数量:user:id:20200703:blogs -> 9190 

    • 关注数量:user:id:20200703:focuss -> 83

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

    •     user:id:20200703   ->              
                         {id:20200703,name:春晚,fans:12210992,blogs:9190,focuss:83}
key的设置约定
  • 数据库中的热点数据key命名惯例

          表名   : 主键名 :  主键值   : 字段名    
    order  :  id   : 20200703  : name    
    order  :  id   : 20200703  : total    
    order  :  id   : 20200703  : price

hash类型

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

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

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


基本操作

添加/修改数据

    hset key field value [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

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

    hkeys key  kvals key

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

    hincrby key  field increment  
    hincrbyfloat key field increment

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

  • 每个hash可以存储 232 - 1 个键值对

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

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

hash类型应用场景

1、业务场景

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

解决方案:

  • 以客户id作为key,每位客户创建一个hash存储结构存储对应的购物车信息

  • 将商品编号作为field,购买数量作为value进行存储

  • 添加商品:追加全新的field与value

  • 浏览:遍历hash

  • 更改数量:自增/自减,设置value值

  • 删除商品:删除field

  • 清空:删除key

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

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

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

  • field1专用于保存购买数量

    • 命名格式:商品id:nums

    • 保存数据:数值

  • field2专用于保存购物车中显示信息,包含文字描述,图片地址,所属商品信息等(抽取出来做独立hash,相当于把商品信息独立保存。)

    • 命名格式:商品id:info

    • 保存数据:json

    • hsetnx key field value

2、业务场景

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

解决方案:

  • 以商家id作为key

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

  • 将参与抢购的商品数量作为对应的value

  • 抢购时使用降值的方式控制产品数量(实际业务中会有超卖等实际问题,这里暂不做考虑)

3、其他业务场景

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



后续内容继续更新中。。。