Redis的数据类型及使用场景

1,448 阅读7分钟

Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sorted set:有序集合)

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

image.png

String类型

String 是 Redis 最基本的类型,一个 key 对应一个 value

String 类型是二进制安全的。意思是 Redis 的 String 可以包含任何数据。比如jpg图片或者序列化的对象

String 类型是 Redis 最基本的数据类型,String 类型的值最大能存储 512MB

image.png

image.png

image.png

image.png

image.png

建议:对于单数据与多数据操作的选择,小编个人认为,数据量较少(50条数据),可以选择不进行拆分,单条指令一次发送(50条);如果数据量十分庞大(1亿条数据),可以选择进行拆分成多条指令完成,一条指令发送(100万条),发100次。需要均衡发送时长和执行时长之间的关系,选择对性能影响最小的数据发送量

注意:一个键最大能存储512MB,了解即可,通常情况下不会有那么大的key,不要去试探阀值,没什么实际意义

使用场景

1.大型企业级应用中,分表操作,使用多张表存储同类型数据,解决主键可能重复问题(通过incr,decr操作,不常用)

2.限时业务的运用,通过设置过期时间,到时间后redis会删除它。可以运用在限时的优惠活动信息、手机验证码等业务场景

3.常规计数: 微博数, 粉丝数等

4.一些查询数据,不做频繁的改动的数据(对象,列表等),使用json字符串存入redis等

注意:

1)String在redis内部默认就是一个字符串,当遇到incr,decr时会转成数值型进行计算

2)redis的所有操作都是原子性的,采用单线程处理所有业务,,命令是一个一个执行的,因此无需考虑并发带来的数据影响

3)按数值进行操作的数据,如果原始数据不能转换成数值,或者超过了redis数值上限范围,将会报错

  • 最小值:Long.MIN_VALUE=-9223372036854775808 (-2^63)
  • 最大值:Long.MAX_VALUE=9223372036854775807 (2^63-1)

Hash类型

Redis hash 是一个键值(key=>value)对集合;是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象

一个存储空间,保存多个键值对数据

底层使用哈希表结构实现数据存储

image.png

Hash存储结构优化:

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

image.png

image.png

image.png

使用场景

1.存储一些结构化的数据,比如用户的昵称、年龄、性别、积分等,存储一个用户信息对象数据。(对对象的属性进行修改,删除操作更加方便)

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

3.商家推出抢购,限购,限量发放优惠券等业务的数据存储等

注意:

1)Hash类型下的value只能存储字符串,不允许其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil),程序中相当于null

2)每个 hash 可以存储 2^32 -1 键值对(40多亿)

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

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

List类型

存储多个数据,并对数据进入存储空间的顺序进行区分

一个存储空间保存多个数据,并且通过数据可以体现进入顺序

保存多个数据,底层使用双向链表存储结构实现

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)

image.png

image.png

image.png

image.png

image.png

使用场景

1.点赞、好友等相互关系的存储

2.新闻,资讯类网站将最新的新闻资讯按照发生时间的顺序展示

3.企业运营过程中,系统产生大量的运营数据,保障多台服务器对操作日志的统一顺序输出

4.应用于具有操作先后顺序的数据控制

5.任务队列等

注意:

1)List中保存的数据都是String类型的,列表最多可存储 2^32-1 元素 (4294967295, 每个列表可存储40多亿)

2)List具有索引的概念,但是操作数据时常以队列的形式进入队列,出队列的操作,或以栈的形式进出栈操作

3)获取全部数据操作结束索引设置为-1

4)List可以对数据进行分页操作,通常第一页的信息来自于List,第二页及更多信息通过数据库的形式加载

Set类型

存储大量的数据,在查询方面提供更高的效率

能够保存大量的数据,高效的内部存储机制,便于查询

与Hash存储结构完全相同,仅存储键,不存储值(nil),并且不允许重复

Set是string类型的无序集合,和列表一样,在执行插入和删除和判断是否存在某元素时,效率是很高的

image.png

image.png

image.png

image.png

image.png

使用场景

1.随机推荐类的信息检索,例如热点歌单推荐,热点新闻推荐,热卖旅游路线,大V推荐等

2.利用交集求共同好友

3.利用唯一性,可以统计访问网站的所有独立IP

4.好友推荐的时候根据tag求交集,大于某个threshold(临界值的)就可以推荐

5.应用于同类信息的关联搜索,二度关联搜索,深度关联搜索

注意:

1)Set类型不允许数据重复,如果添加的数据在Set中已经存在,将只保留一份

2)Set虽然与Hash的存储结构相同,但是无法启用Hash中存储值的空间

3)集合中最大的成员数为 2^32 - 1(4294967295, 每个集合可存储40多亿个成员)

Sortet_Set类型

数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式

新的存储模型,可以保存可排序的数据

在Set的存储结构基础上添加可排序字段

zset和set一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序

zset的成员是唯一的,但分数(score)却可以重复

image.png

image.png

image.png

image.png

image.png

使用场景

1.需要一个有序的并且不重复的集合列表时

2.应用于计数器组合排序功能对应的排名

3.各类排行榜,榜单信息的数据存储,获取排行榜名次

注意:

1)min与max用于限定搜索查询的条件

2)start与stop用于限定查询范围,作用于索引,表示开始和结束索引

3)offset与count用于限定查询范围,作用于查询结果,表示开始位置和数据总量

4)score保存的数据存储空间是64位,如果是整数,范围是-9007199254740992~9007199254740992

5)scorce保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时要慎重

6)sorted_set底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反复覆盖,只保留最后一次修改的结果

今天的分享就到这里啦,希望能给您带来帮助!!!