redis五种数据类型以及对应的场景

文章目录

  • 简介
  • 一、五种类型简介
    • 前言:redis内部如何管理这几个类型
    • (一)String类型
    • (二)Hash类型
    • (三)List类型
    • (四)Set 类型
    • (五)Sorted set 类型
    • 五种类型总结:
    • 关于key的一些统一操作:
    • 五种数据类型的基础命令:
  • 二、五种数据类型的应用场景大致总结
    • 文末总结:

简介

redis数据库存放数据的形式】key-value;
redis的五种数据类型】String、Hash、List、Set、Zset(Sorted set);
(⚠️这里说的数据类型都是指value,key都是string类型的)

一、五种类型简介

前言:redis内部如何管理这几个类型

redis五种数据类型以及对应的场景_第1张图片
如图,redis核心对象redisObject有n个属性,核心属性type和encoding,type存储了redis中value中的具体类型,encoding存储了具体的编码方式。下文中的String类型如果存储数字类型的字符串的时候,可以进行数字运算,即当value类型为String时,encoding可能对应不止一种,存储数字类型的字符串时,encoding = int,存储普通字符串时,encoding = raw

(一)String类型

使用场景:
常规key-value缓存应用。
常规计数:微博数、粉丝数

String类型注意事项:

  1. String在redis内部存储默认就是一个字符串,当遇到增减类操作incr,decr时会转成数值型进行计算;
  2. redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响;
  3. 按数值进行操作的数据,如果原始数据不能转成数值,或超过了redis数值上线范围,将会报错。9223372036854775807 (java中long型数据最大值,Long.MAX_VALUE) ;
  4. value最大能储存512MB

String运行结果:
1、表示运行结果是否成功:
(integer)0 –> false 失败
(integer)1 –> true 成功
2、表示运行结果值
 (integer)3 –> 3 3个
 (integer)1 –> 1 1个
3、数据未获取到:(nil)等同于null

(二)Hash类型

value是一个key-value的格式,这里为了区分redis的key,value中的key被叫做field
redis五种数据类型以及对应的场景_第2张图片

使用场景: 特别适合存储对象:存储部分变更数据,如用户信息等。

Hash类型注意事项:

  1. Hash类型下的value只能存储字符串(field对应的value),不允许存储其他类型数据,不存在嵌套现象。如果数据未获取到,对应的值为(nil)
  2. 每个hash可以存储232-1个键值对
  3. hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计不是为了存储大量对象的,切记不可滥用,更不可以将hash作为对象列表使用
  4. Hash对应value内部实际就是一个HashMap,实际这里会有2种不同实现,这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap,当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。

(三)List类型

存储多个数据,并对数据进入存储空间的顺序进行区分,底层使用双向链表存储结构实现

使用场景:
Twitter/微博 的关注列表、粉丝列表等(根据关注顺序展示的列表)
最新消息排行
消息队列(用push操作将任务存在List中,工作线程再用pop操作将任务取出来执行)

List类型注意事项:

  • List 中保存的数据都是String类型的,数据总容量式是有限的,最多2的32次方-1个元素(4294967295,约四十多亿)
  • List具有索引的概念,但是操作数据时候通常以队列的形式进行入队出队操作,或以栈的形式进入栈出栈的操作
  • 获取全部数据操作结束索引设置为-1
  • List 可以对数据进行分页操作,通过第一页的信息来自list,第2页及更多的信息通过数据库的形式加载

(四)Set 类型

与List存储结构完全相同,值是不允许重复的

使用场景:
Set提供的是一个类似List,即列表的功能,区别在于可以排重,所以当需要存储一个列表数据又不希望出现重复数据,Set是好选择;
提供了判断某个成员是否在一个Set集合内(List没有);
微博中共同关注、共同好友(将一个人的关注放入一个set集合,他的好友放入一个set集合,利用set的交集、差集、并集等功能实现);

(五)Sorted set 类型

和set一样,数据不重复的集合,区别在于Sorted Set额外提供了一个代表优先级(score)的参数来为成员排序;
Sorted Set 成员不可重复,但是score可以重复

使用场景:
存储一个班级同学的成绩:value可以是学生的学号;score就可以是他的考试得分,这样数据进入集合的时候,就可以进行一个天然排序;
做带权重的队列:普通消息score为1,重要消息score为2,工作线程可以按score的倒序来获取任务,让重要的任务先执行;

Sorted Set类型注意事项:

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

五种类型总结:

类型 特性 场景
String(字符串) 二进制安全 可以包含任何数据,比如jpg图片或者序列化的对象,一个键最大能存储512M
Hash(字典) 键值对集合,即编程语言中的Map类型 适合存储对象,并且可以像数据库中update一个属性一样只修改某一项属性值(Memcached中需要取出整个字符串反序列化成对象修改完再序列化存回去)
List(列表) 链表(双向链表) 增删快,提供了操作某一段元素的API
Set(集合) 哈希表实现,元素不重复 1、添加、删除、查找的复杂度都是O(1) ;2、为集合提供了求交集、并集、差集等操作
Sorted Set(有序集合) 将Set中的元素增加一个权重参数score,元素按score有序排列 数据插入集合时,已经进行天然排序

关于key的一些统一操作:

五种数据类型的基础命令:

二、五种数据类型的应用场景大致总结

类型 类型亮点
String 就是正常存储一个简单的字符串,最常用,比如存储用户的token,key为userId,value为token
Hash 类似于java中的HashMap,可以存一组信息,比如关于人的姓名、年龄
List 在于有先后顺序,适用于微博粉丝列表或者关注人列表展示这种(这种是按照你的关注顺序展示的)
Set 有交集、并集、差集操作(典型就是看微博或其他社交软件共同关注等),集合内成员还不重复
Sorted Set Set基础上加上了分数,这样可以天然排序(比如把key为班级id,value为学生id,score为每个学生的分数,就可以天然排序了)

文末总结:

对于redis五种数据类型的实战应用网上查到的总是千篇一律,自己在项目中确实用到的也比较少,以上表格是自己的一个理解,个人认为把握好每个类型拥有的命令,在实战中多思考,多延伸,如果后续项目中用到redis较多,样本比较丰富会再出一期切身的实战应用

你可能感兴趣的:(数据库,redis,缓存,java)