redis数据类型(5种常用):string、list、hash、set、sorted_set
redis自身是一个Map,其中所有的数据都是采用key:value的形式储存,数据类型指的是储存的数据的类型,也就是value部分的类型,key部分永远都是字符串
String类型
储存的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
存储数据的格式:一个存储空间保存一个数据
存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用
![](https://img.haomeiwen.com/i20580632/060b4f040ec07811.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命名惯例
![](https://img.haomeiwen.com/i20580632/32e7470fcbbf1f8c.png)
hash类型
储存的困惑
对象类数据的存储如果具有较频繁的更新需求操作会显得笨重
![](https://img.haomeiwen.com/i20580632/8fa265c582a9f0c9.png)
新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
需要的存储结构:一个存储空间保存多个键值对数据
hash类型:底层使用哈希表结构实现数据存储
![](https://img.haomeiwen.com/i20580632/9992f4ba0b300d9e.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,什么都没发生)
![](https://img.haomeiwen.com/i20580632/acafe09dd787fd29.png)
list类型
●数据存储需求:存储多个数据,并对数据进入储存空间的顺序进行区分
●需要的储存结构:一个储存空间保存多个数据,且通过数据可以体现进入顺序
●list类型:保存多个数据,底层使用双向链表储存结构实现
![](https://img.haomeiwen.com/i20580632/5fdcf051876ac8d6.png)
list类型数据基本操作
添加/修改数据
lpush key value1 [value2] ...
rpush key value1 [value2] ...
由下图可见,lpush是从后向前(从右往左)添加数据,索引值从后向前越来越大;rpush从前往后(从左向右)添加数据,索引值从前往后越来越大
![](https://img.haomeiwen.com/i20580632/c9adc497a048e372.png)
获取数据
lrange key start stop(start:开始索引值,shop:结束索引值)
lindex key index(查看指定数据index:索引值)
llen key(数据的数量)
获取并移除数据
lpop key
rpop key
由下图可见,lpop是从前往后删除据,而rpop是从后往前删除据
![](https://img.haomeiwen.com/i20580632/c2b4e2fb19565e3e.png)
list类型数据扩展操作
规定时间内获取并移除数据
blpop key1 [key2] timeout
brpop key1 [key2] timeout
网友评论