认识Redis
什么是Redis?
- 一种基于内存的数据库;
- 在内存中完成对数据的读写操作;
- 读写速度非常快;
- 常用于缓存,消息队列,分布式锁等场景
Redis和Memcached有什么区别?
- 共同点
- 都是基于内存的数据库,一般都用来当做缓存使用;
- 都有过期策略;
- 性能都非常高
- 区别
- Redis支持的数据类型更丰富(String、Hash、List、Set、ZSet),而Memcached只支持最简单的key-value数据类型;
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用,而Memcached没有持久化功能,数据全部存在内存之中,Memcached重启或者挂掉后,数据就没了;
- Redis原生支持集群模式,Memcached没有原生的集群模式,需要依赖客户端来实现往集群中分片写入数据;
- Redis支持发布订阅模型,Memcached没有原生的集群模式,需要依赖客户端来实现往集群中分片写入数据
为什么用Redis作为MySQL的缓存?
- 高性能
操作Redis缓存就是直接操作内存,所以速度相当快 - 高并发
单台设备的Redis的QPS(Query Per Second,每秒钟处理完请求的次数)是MySQL的10倍,Redis单机的QPS能轻松破10w,而MySQL单机的QPS很难破1w。
直接访问Redis能够承受的请求是远远大于直接访问MySQL的
Redis数据结构
五种常见的Redis数据类型是怎么实现的?
String类型
主要实现是 SDS (简单动态字符串)。SDS和我们认识的C字符串不太一样,之所以没有使用C语言的字符串表示,因为SDS相比于C的原生字符串:
- SDS不仅可以保存文本数据,还可以保存图片、视频二进制数据;
- SDS获取字符串长度的时间复杂度是O(1)。因为C语言的字符串并不记录自身长度;
- Redis的SDS API是安全的,拼接字符串不会造成缓冲区溢出。
List类型
主要由双向链表或压缩列表实现:
- 如果列表的元素个数小于512个,列表每个元素的值都小于64字节,Redis会使用压缩列表作为List类型的底层数据结构;
- 如果列表的元素不满足上面的条件,Redis会使用双向链表作为List类型的底层数据结构。
但是在Redis3.2版本之后,List数据类型底层数据结构就只由quicklist实现了,代替了双向链表和压缩列表
Hash类型
主要由压缩列表或哈希表实现:
- 如果哈希类型元素小于512个,所有值小于64字节的话,Redis会使用压缩列表作为Hash类型的底层数据结构;
- 如果哈希类型元素不满足上面条件,Redis会使用哈希表作为Hash类型的底层数据结构
但是在Redis7.0中,压缩列表数据结构已经废弃了,交由listpack数据结构来实现了
Set类型内部实现
Set类型的底层数据结构是由哈希表或整数集合实现的:
- 集合中的元素都是整数且个数小于512,Redis会使用整数集合作为Set类型的底层数据结构;
- 集合中的元素不满足上面条件,则Redis使用哈希表作为Set类型的底层数据结构;
ZSet类型内部实现
Zset类型的底层数据结构是由压缩列表或跳表实现的:
- 如果有序集合的元素个数小于128个,并且每个元素的值小于64字节,使用压缩列表;
- 否则,使用跳表。
在Redis7.0中,压缩列表数据结构已经废弃了,交由listpack数据结构来实现了。