读不在三更五鼓,功只怕一曝十寒。——郭沫若


一、redis的五大数据类型实现原理

说明

1、redis中所有的数据结构都已唯一的key字符串作为名称,然后通过这个唯一的key来获取对应的value

2、不同的数据类型数据结构差异就在于value的结构不一样

字符串(string)

1、value的数据结构(数组)

​ ①、字符串value数据结构类似于数组,采用与分配容易空间来减少内存频繁分配

​ ②、当字符串长度小于1M时,扩容就是加倍现有空间

​ ③、如果字符串长度操作1M时,扩容时最多扩容1M空间,字符串最大长度为 512M

2、字符串的使用场景(缓存)

​ ①、字符串一个常见的用途是缓存用户信息,我们将用户信息使用JSON序列化成字符串

​ ②、取用户信息时会经过一次反序列化的过程

list(列表)

1、value的数据结构(双向链表)

​ ①、列表的数据结构是双向链表,这意味着插入和删除的时间复杂度是0(1),索引的时间复杂度位0(n)

​ ②、当列表弹出最后一个元素后,该数据结构会被自动删除,内存被回手

2、列表的使用场景(队列,栈)

hash(字典)

1、value的数据结构(HashMap)

​ ①、 redis中的字典也是HashMap(数组+列表)的二维结构

​ ②、不同的是redis的字典的值只能是字符串

2、hash的使用场景(缓存)

​ ①、hash可以用来缓存用户信息,与字符串一次性全部序列化整个对象不同,hash可以对每个字段进行单独存储

​ ②、这样可以部分获取用户信息,节约网络流量

​ ③、hash也有缺点,hash结构的存储消耗要高于单个字符串

set(集合)

1、集合对象 set 是 string 类型(整数也会转换成string类型进行存储)的无序集合。注意集合和列表的区别:集合中的元素是无序的,因此不能通过索引来操作元素;集合中的元素不能有重复。

zset (有序集合)

1、和上面的集合对象相比,有序集合对象是有序的。与列表使用索引下标作为排序依据不同,有序集合为每个元素设置一个分数(score)作为排序依据。

二、五大数据类型的应用场景

1、对于string 数据类型,因为string 类型是二进制安全的,可以用来存放图片,视频等内容,另外由于Redis的高性能读写功能,而string类型的value也可以是数字,可以用作计数器(INCR,DECR),比如分布式环境中统计系统的在线人数,秒杀等。

2、对于 hash 数据类型,value 存放的是键值对,比如可以做单点登录存放用户信息。

3、对于 list 数据类型,可以实现简单的消息队列,另外可以利用lrange命令,做基于redis的分页功能

4、对于 set 数据类型,由于底层是字典实现的,查找元素特别快,另外set 数据类型不允许重复,利用这两个特性我们可以进行全局去重,比如在用户注册模块,判断用户名是否注册;另外就是利用交集、并集、差集等操作,可以计算共同喜好,全部的喜好,自己独有的喜好等功能。

5、对于 zset 数据类型,有序的集合,可以做范围查找,排行榜应用,取 TOP N 操作等。