美文网首页
Redis数据类型

Redis数据类型

作者: 山巅自相见 | 来源:发表于2020-11-09 09:08 被阅读0次

redis数据类型(5种常用):string、list、hash、set、sorted_set
redis自身是一个Map,其中所有的数据都是采用key:value的形式储存,数据类型指的是储存的数据的类型,也就是value部分的类型,key部分永远都是字符串

String类型

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


image.png
String类型数据的基本操作

添加/修改数据:set key value
获取数据:get key
删除数据:del key 在redis中,操作如果是以成功失败为标识的话,(Integer)1:删除成功 (Integer)0:删除失败
添加/修改多个数据:mset key1 value1 key2 value2 ...
获取多个数据:mset key1 key2...
获取数据字符个数(字符串长度):strlen key
追加信息到原始信息后部(如果原始信息存在就追加,否则新建):append key value

String类型数据的扩展操作

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

incr key(将Value的值+1)
incrby key increment(将value的值添加指定数值)
incrbyfloat key increment(将value的值添加指定带小数点的值)

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

decr key(将value的值-1)
kecrby key increment(将value的值减少指定范围)

String作为数值操作

string在redis内部储存默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算。
redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响
注意:按数值进行操作,如果原始数据不能转换成数值,或超过了redis数值上线范围,将报错。(最大值也就是Java中long型数据最大值:9223372036854775807)
Tips1:
  redis用于控制数据库表主键id,为数据库主键提供生成策略,保障数据库表的主键唯一性
  此方案适用于所有数据库,且支持数据库集群

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

setex key seconds value(seconds :设置时间值,单位是秒)
psetex key milliseconds value
Tips2:
  redis控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作

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

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

1、表示运行结果是否成功
      (Integer)0 --> false 失败
      (Integer)1 --> true 成功
2、表示运行结果
      (Integer)1 --> 1 1个
      (Integer)3 --> 3 3个
###数据未找到:(nil)等同于null
###数据最大储存量:512MB
###数值计算最大范围(Java中的long的最大值):9223372036854775807

在redis中为大V用户设定信息,以用户主键和属性值作为key,后台设定定时刷新策略即可
user:id:111222333:fans--> 12345648
user:id:111222333:blogs--> 138468
在redis中以json格式出巡大V用户信息,定时刷新(也可以使用hash类型)
user:id:111222333 --> {id:111222333, name:春晚, fans:111222333, blogs:41852}
Tips3:redis应用于各种结构性和非结构性高热度数据访问加速

key的设置约定

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


image.png
hash类型

储存的困惑

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


image.png

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


image.png

hash存储结构优化

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

####hash类型数据类型的基本操作
  key相当于表名,filed相当于字段名,value相当于数据
  添加/修改数据:hset key filed value
  获取数据:hget key filed
                        hgetall key(获取所有filed value,单数是filed,双数是value)
  删除数据:hdel key filed1 [filed2]

  添加/修改多个数据:hmset key filed1 value1 filed2 value2 ...
  获取多个数据:hmget key filed1 filed2 ...
  获取哈希表中字段的数量:hlen key
  获取哈希表中是否存在指定的字段:hexists key filed(返回的是/否)
#####hash类型数据扩展操作
  获取哈希表中所有的字段名:hkeys key
  获取哈希表中所有的字段值:hvals key
  设置指定字段的数值数据加指定范围的值:hincrby key filed increment/hincrbyfloat key filed increment
hash类型数据操作的注意事项

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

hash类型应用场景

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

##业务分析
  1、进分析购物车的redis储存模型:添加、浏览、更改数量、删除、清空
  2、购物车于数据库间关系(不讨论)
  3、购物策划与订单间关系(不讨论)
    提交购物车:读取数据生成订单
    商家临时价格调整:隶属于订单级别
  4、未登录用户购物车信息储存(不讨论)
    cookie储存
##解决方案
  1、以客户id作为key,每位客户创建一个hash储存结构储存对应的购物车信息
  2、将商品编号作为filed,购买数量作为value进行储存
  3、添加商品:追加全新的filed与value
  4、浏览:遍历hash
  5、更改数量:自增/自减,设置value值
  6、删除商品:删除filed
  7、清空:删除key
##当前设计是否加速了购物车的呈现
  当前仅仅是将数据存储到了redis中,并没有起到加速的作用,商品信息还需要二次查询数据库
    ●每条购物车中的商品记录保存成两条field
    ●field1专用于保存购买数量
      命名格式:商品id:nums
      保存数据:数值
    ●field2专用于保存购物车中显示的信息,包含文字描述,图片地址,所属商家信息等
      命名格式:商品id:info
      保存数据: json
hsetnx key filed value(如果没有filed,就会添加新的filed;如果已有filed,什么都没发生)
image.png
list类型

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


image.png

list类型数据基本操作

添加/修改数据

lpush key value1 [value2] ...
rpush key value1 [value2] ...
由下图可见,lpush是从后向前(从右往左)添加数据,索引值从后向前越来越大;rpush从前往后(从左向右)添加数据,索引值从前往后越来越大
image.png

获取数据

lrange key start stop(start:开始索引值,shop:结束索引值)
lindex key index(查看指定数据index:索引值)
llen key(数据的数量)

获取并移除数据

lpop key
rpop key
由下图可见,lpop是从前往后删除据,而rpop是从后往前删除据
image.png

list类型数据扩展操作

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

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

相关文章

网友评论

      本文标题:Redis数据类型

      本文链接:https://www.haomeiwen.com/subject/poocbktx.html