Redis支持五种数据类型:String(字符串),Hash(哈希),List(列表),Set(集合)及Zset(sorted set:有序集合)
数据类型指的是存储的数据的类型,也就是value的部分,key部分永远都是字符串
String类型
String 是 Redis 最基本的类型,一个 key 对应一个 value
String 类型是二进制安全的。意思是 Redis 的 String 可以包含任何数据。比如jpg图片或者序列化的对象
String 类型是 Redis 最基本的数据类型,String 类型的值最大能存储 512MB
建议:对于单数据与多数据操作的选择,小编个人认为,数据量较少(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 特别适合用于存储对象
一个存储空间,保存多个键值对数据
底层使用哈希表结构实现数据存储
Hash存储结构优化:
- 如果field数量较少,存储结构优化为数组结构
- 如果field数量较多,存储结构使用HashMap结构
使用场景
1.存储一些结构化的数据,比如用户的昵称、年龄、性别、积分等,存储一个用户信息对象数据。(对对象的属性进行修改,删除操作更加方便)
2.电商网站购物车的设计与实现
3.商家推出抢购,限购,限量发放优惠券等业务的数据存储等
注意:
1)Hash类型下的value只能存储字符串,不允许其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil),程序中相当于null
2)每个 hash 可以存储 2^32 -1 键值对(40多亿)
3)Hash类型十分贴近对象的数据存储形式,并且可以灵活的添加/删除对象属性。但是,Hash的初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将Hash作为对象列表使用
4)hgetall操作可以获取全部属性,如果内部field过多,遍历整体数据效率就会很低,有可能成为数据访问瓶颈
List类型
存储多个数据,并对数据进入存储空间的顺序进行区分
一个存储空间保存多个数据,并且通过数据可以体现进入顺序
保存多个数据,底层使用双向链表存储结构实现
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)
使用场景
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类型的无序集合,和列表一样,在执行插入和删除和判断是否存在某元素时,效率是很高的
使用场景
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)却可以重复
使用场景
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值将被反复覆盖,只保留最后一次修改的结果