这是我参与「第五届青训营 」伴学笔记创作活动的第 14 天
前言
最近在录播课上学习到了开发中redis的使用场景,我认识到了redis不同数据类型的使用和底层数据结构
Redis支持的5种常见数据类型:
- string(字符串)
- hash(哈希)
- list(列表)
- set(集合)
- zset(sorted set:有序集合)
一、 string
是 redis 最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。value其实不仅是String,也可以是数字。
使用场景:常规key-value缓存应用。常规计数: 微博数, 粉丝数。
数据结构 :redis构建了一种名为简单动态字符串的可以被修改的抽象类型,并将SDS用作Redis的默认字符串表示。
SDS通过获取len属性就可以得到字符串的长度,时间复杂度为:O(1)
SDS通过空间预分配和惰性空间释放两种优化策略来减少内存重分配次数。
二、Hash
是一个键值对集合。Redis hash 是一个 string 类型的 field 和 value 的映射表, 特别适合用于存储对象。
应用场景:例如存储一个用户信息对象数据,包含以下信息:
用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储,主要有以下2种存储方式:
第一种方式将用户ID作为查找key,把其他信息封装成一个对象以序列化的方式存储,这种方式的缺点是,增加了序列化/反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护,引入CAS等复杂问题。
第二种方法是这个用户信息对象有多少成员就存成多少个key-value对儿,用用户ID+对应属性的名称作为唯一标识来取得对应属性的值,虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是非常可观的。
hash底层靠dist实现,扩容时可渐进式rehash,每次请求少量复制,避免阻塞
三、list
列表是简单的字符串列表,按照插入顺序排序。
应用场景:Redis list的应用场景非常多q,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现。
list底层quicklist靠双向链表实现
四、zset
和 set 一样也是string类型元素的集合,且不允许重复的成员。 *zadd 命令:*添加元素到集合,元素在集合中存在则更新对应score。
使用场景:Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。 因此可以用来实现热点数据的排行榜等功能
zset底层靠zskiplist实现
能进行跳表,并且结合了dist,同时也能方向链表来查倒序。
总结
redis不同的数据类型对应着不同的数据结构,因此拥有的不同特性让它们可以用来实现不同的功能。