提到 Redis,也许大家第一印象是:高性能的 K-V 缓存。其除了缓存业务上的热点数据还能做队列以及分布式锁。可大部分的我们在使用的时候也许都是公司封装好的 Redis,对于整个 Redis 的集群以及内部核心实现一知半解。只专注业务开发,那久而久之,在个人成长上变得帮组甚少。最明显的就是当业务量级上来后,在极端情况下,许多问题暴露出来,如果没有对 Redis 的底层有深入的了解,很难快速定位并解决问题
Redis 基础数据结构
- string
- Redis里的Redis的字符串是动态字符串,是可以修改的。类似于Go里面的切片Silence,如果长度不够则自动扩容,至于如何扩容:length小于1M的时候,扩容规则讲目前的字符串翻倍;如果大雨1M的话,则每次只会扩容1M,直到512M。
- list
- Redis里的list是一个链表,由于链表本身插入和删除比较块,但是查询的效率比较低,所以常常被用于做异步队列
- Redis里的List设计非常牛逼,当数据量比较小的时候,数据结构是压缩链表,如果数据量比较多的时候就是快速链表
- 可运用场景: 异步队列,使用rpush/lpush操作队列,使用lpop和rpop出队列
- set
- Redis中的set是一个无序Map,由于Go中没有set结构,所以这里只能类比Java中的HashSet。set底层也是一个Map结构,只是里面的Value是一个NULL,由于set的特性可以用于去重逻辑
- 可运用场景:活动抽奖去重
- hash
- Redis中的字典类型大家不陌生,也许其他语言都有这种结构,不同的稍微提一点就是hash的扩容rehash过程中和Go里面的设计颇有类似,就是维护了两个hash结构,如果需要扩容的时候,就把新的数据写入新字典中,然后后端起一个线程来逐步迁移,总体上来说就是采用了空间换时间的思想
- 可运用场景:记录业务中的不同用户/不同商品/不同场景的信息:如某个用户的名称,或者用户的历史行为
- zset
- Redis中的zset是一个比较特殊的数据结构(跳跃列表),也就是我们了解到的跳表,底层由于set的特性保证了value唯一,