编辑
2023-02-18
面试
00
请注意,本文编写于 755 天前,最后修改于 7 天前,其中某些信息可能已经过时。

目录

Redis是什么
Redis 和 Memcached 有什么区别?
一样
不一样
为什么用 Redis 作为 MySQL 的缓存?
高性能
高并发
Redis 的数据结构
Redis 数据类型以及使用场景分别是什么?
五种常见的 Redis 数据类型是怎么实现?
String 数据结构叫SDS
List 底层是双向链表和压缩链表还有快速链表
Hash 是由压缩列表或哈希表实现的
Set 由哈希表或整数集合
Zset 压缩表和跳跃链表

Redis是什么

Redis 是一种基于内存的数据库,对于数据的读取都是在内存中操作所以非常快。常用于缓存,消息队列,分布式锁等场景。

Redis 提供了多种数据类型来支持不同的业务场景,比如(String)字符串,(hash)哈希,(List)列表,(Set)集合,(Zset)有序集合。(Bitmap)位图,(HyperLogLog)基数统计,(GEO)地理信息,(Stream)流,并对所有类型都是原子性的,因为执行命令都是单线程执行的,不存在并发竞争的情况。

除此之外,Redis还支持持久化,事务,Lua脚本,多种集群模式(哨兵,主从复制,切片机集群),发布订阅,内存淘汰,过期删除等机制。

Redis 和 Memcached 有什么区别?

一样

都是内存的数据库,一般当缓存使用 都有过期策略 两者性能都非常高

不一样

Redis数据结构多于Memcached,Memcached只支持key=>value Redis指数据持久化 Redis原生支持集群化 Redis 支持发布订阅,Lua脚本,事务等功能

为什么用 Redis 作为 MySQL 的缓存?

高性能

直接读取内存中的数据

高并发

单机设备的QPS是mysql的10倍。可轻松突破10w。

Redis 的数据结构

Redis 数据类型以及使用场景分别是什么?

  • String(字符串): 缓存对象,常规计数,分布式锁,共享Seesion等。
  • List(列表): 消息队列 异步队列(两个注意点,1生产者需要执行实现全局唯一id, 2不用以组的形式消费)等。
  • Hash (哈希):缓存对象,购物车等。
  • Set (集合):聚合计算(交集,并集,差集),比如共同关注,点赞, 抽奖等。
  • Zset (有序集合):排序场景,排名 等。

后期增加的有

  • BitMap (位图 2.2增加):二值状态的统计场景,比如签到,判断用户登录状态,连续签到用户总数。
  • HyperLogLog(基数统计2.8):海量数据统计,比如百万网页UV统计。
  • GEO (地图3.2) 存储地理位置
  • Stream(流 5.0) 消息队列,相比于基于 List 类型实现的消息队列,有这两个特有的特性:自动生成全局唯一消息ID,支持以消费组形式消费数据。

五种常见的 Redis 数据类型是怎么实现?

String 数据结构叫SDS

struct SDS<t> { T capacity; //数组容量 T len; // 数组长度 byte flags; // 特殊标志位,不用理睬 byte[] content; // 数组内容 }

扩容策略字符串长度小于1M,扩容空间采用加倍扩。当超过1M之后,每次只扩容1M。 不仅可以保存文本数据,还可以保持二进制数据。 获取字符串长度复杂度为O(1)

List 底层是双向链表和压缩链表还有快速链表

当元素较少的时候,会使用一块连续内存存储,这个结构是(ziplist)压缩列表。它将所有元素彼此紧挨着一起存储,分配一块连续的内存。 当数据叫多的时候,会改成(quicklist)快速列表。将多个ziplist 用双向链表连接起来。

Hash 是由压缩列表或哈希表实现的

包含两个hashtable,通常情况下只有一个,但是在扩容缩容的时候,需要重新分配新的hashtable,然后渐进式的搬迁。 渐进式rehash,搬迁操作埋伏在对字典的后续指令之后,还有定时任务搬迁 hash 函数,redis 默认使用 siphash。siphash算法即使在输入key很小的情况下,也可以产生随机性很好的输出。 通常情况下,当元素超过数组的两倍之后就开始扩容,但是如果redis在做bgsave的时候,为了减少内存页,就暂时不会去做扩容处理。但是如果元素超过数组5倍,就会强制扩容。 当元素个数少于数组的10%之后就会执行。

Set 由哈希表或整数集合

特殊的字典,字典的所有value都是null

Zset 压缩表和跳跃链表

如果有序集合的元素个数小于 128 个,并且每个元素的值小于 64 字节时,Redis 会使用压缩列表作为 Zset 类型的底层数据结构; 如果有序集合的元素不满足上面的条件,Redis 会使用跳表作为 Zset 类型的底层数据结构;

本文作者:游戏币

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!