Redis五种数据类型
数据类型 | 底层原理 | 备注 | 最大存储容量 |
字符串 | 字符串 | 字符串类型是最基本的数据类型,也是其他四种数据类型的基础 | 512MB |
散列 | 字典结构(哈希表) | 散列类型的键值是一种字典结构,其存储了字段和字段值的映射,但字段值只能是字符串类型 | 2的32次幂-1个子段 |
列表 | 双向链表 | 向链表两端添加元素的时间复杂度O(1),获取头部或尾部两端的元素速度极快,但是获取中间和通过索引访问元素比较慢 | 2的32次幂-1个元素 |
集合 | 散列表(散列函数) | 由散列表实现的,增删改查这些操作的时间复杂度都是O(1)。更方便的是提供了多个集合之间可以并、交和差集的运算,往往在应用中应用较多 | 2的32次幂-1个元素 |
有序集合 | 散列表+跳表 | 读取任何位置的数据速度都非常非常快,时间复杂度是O(log(N)),只是比起其他类型,内存耗费要大一些,比起其他类型相对高级 | 2的32次幂-1个元素 |
String(字符串)
字符串类型是Redis中最基本的数据类型,它能存储任何形式的字符串,包括二进制数据、存储用户的邮箱、JSON化的对象甚至是一张图片等。一个字符串类型允许存储的数据的最大容量是512MB
String的实际应用场景:
- 缓存功能
字符串是最常用的基本类型。利用Redis作为缓存,配合其他数据库作为存储层,利用Redis支持高并发的特点,可以大大加快系统的读写速度,以及降低后端数据库的压力
- 计数器
许多系统都会使用Redis作为系统的实时计数器,可以快速实现计数和查询的功能。而且最终的数据结果可以按照特定的时间落地到数据库或者其他存储介质当中进行永久保存
- 共享用户Session
用户重新刷新一次界面,可能需要访问一下数据进行重新登录或者访问页面缓存cookie,我们可以利用Redis将用户的Session集中管理,在这种模式只需要保证Redis的高可用,每次用户Session的更新和获取都可以快速完成。大大提高效率
List(列表)
列表类型可以存储一个有序的字符串列表。常用的操作是向列表两端添加元素或者获取列表的某一个片段
列表类型内部是使用双向链表实现的,所以向列表两端添加元素的时间复杂度是O(1),获取越接近两端元素速度就越快。
应用:
- 可以通过list存储一些列表类型的数据结构,比如粉丝列表、文章的评论列表等
- 文章列表或者数据分页
可以通过lrange命令读取某个闭区间的元素。基于Redis实现简单的高性能分页功能,可以应用到微博文章下拉不断分页.
当一个网站文章过多时,需要使用分页来进行展示,这时可以考虑使用Redis的列表,列表不但有序而且还支持按照范围获取元素,可以完美的解决分页查询功能,大大提高查询效率
- 消息队列
Redis的链表结构,可以轻松的实现阻塞队列,可以使用右进右出的命令组合来完成队列的设计。比如:数据的生产者可以通过Lpush命令从左边插入数据,多个数据消费者可以使用BRpop命令阻塞的“抢”列表尾部的数据
hash(散列)
散列类型的键值也是一种字典结构,其存储了字段和字段值的映射,但**字段值只能是字符串,不支持其他数据类型。**换句话讲,散列类型不能嵌套其他数据类型
注意:除了散列类型,Redis的其他数据类型同样不支持数据类型嵌套。比如集合类型的每个元素只能是字符串,不能是一个集合或者散列表等
set(集合)
set是string类型的无序集合。它是使用值为空的散列表实现的
在项目中,应用场景比较多,多个集合类型键之间可以进行并集、交集、差集运算
zset(有序集合)
zset是string类型的有序集合。
在集合类型的基础上有序集合类型为集合中的每个元素都关联了一个分数,这使得不仅可以完成插入、删除和判断元素是否存在等集合类型支持的操作,还能够获取分数最高或者最低的前N个元素、获取指定分数范围内的元素等操作。有序集合中每个元素是不相同的,但是分数是可以相同的
有序集合类型是使用散列表+跳表实现的。读取任何一个位置的数据速度很快,时间复杂度是O(logN)
跳表(skip list)
跳表是一种随机话的数据结构,它的效率和红黑树、AVL树等差不多,但是跳表的原理比较简单
跳表就是能够以O(logN)的速度查找到链表中的元素的一种数据结构