读不在三更五鼓,功只怕一曝十寒。——郭沫若
一、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 操作等。