Day19

1. 说说你对Redis的了解

  1. Redis是一款基于键值对的NoSql数据库,与其他键值对数据库不同的是,Redis中拥有string,hash,list,set,zset,bitmaps,hyperloglog,GEO(地理信息定位)等多种数据结构,这给Redis带来了满足多种应用场景的能力,而且,Redis将所有数据放在内存中的做法让它的读写性能十分惊人。
  2. Redis的持久化机制保证了在发生类似断电,机械故障的情况时,内存中的数据不会丢失。
  3. Redis还提供了键过期、发布订阅、事务、流水线、Lua脚本等多个附加功能
  4. Redis使用场景:
    • 热点数据缓存:redis访问速度快、支持的数据类型丰富,很适合用来存储热点数据
    • 限时业务:redis中可以使用expire命令设置一个键的生存时间,到时间后redis会删除它,因此,redis在限时业务中表现十分亮眼
    • 计数器:incrby命令可以实现原子性的递增,所以可以运用于高并发的秒杀活动、分布式序列号的生成。
    • 排行榜:关系型数据库在排行榜方面查询速度普遍偏慢,所以可以借助redis的SortedSet进行热点数据的排序
    • 分布式锁:这个主要利用redis的setnx命令进行
    • 延时操作:redis自2.8.0之后的版本提供keyspace Notifications功能,允许客户订阅pub/sub频道,以便以某种方式接受影响redis数据集的事件
    • 点赞,好友等相互关系的存储:Redis set对外提供的功能与list类似,特殊在于set能自动去重,我们可以通过这一点实现类似共同好友的功能

2.请你说说Redis的数据类型

  1. Redis拥有五种基本数据类型和四种特殊的数据类型。
  2. 五种基本数据类型:(1)String:String是Redis中的最基本的数据类型,可以存储任何数据,包括二进制数据、序列化数据、JSON的对象甚至是图片(2)List:List是字符串列表,按照插入的顺序排序,元素可以重复,可以添加一个元素到列表的头部或者尾部,底层是一个链表结构(3)Set:Set是一个无序不重复的集合(4)Hash:Hash是String类型的key和value集合,适合与存储对象(5)Zset:Zset和Set一样也是String类型元素集合,且不允许有重复的元素,但不同的是Zset的每一个元素都会关联一个分数,分数可以重复,Redis通过分数来为集合成员进行从小到大排序
  3. 四种特殊数据类型:bitmap,hyperloglog,GEO,stream

3. 请你说说Redis数据类型中的zset,它和set有什么区别?底层是怎么实现的?

  1. Redis有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数,Redis正是通过分数为集合中的成员进行从小到大的排序
  2. 集合是通过哈希表来实现的,所以添加,删除,查找的复杂度都是O(1)。集合中的最大成员数为2^32-1
  3. Zset底层数据结构包括ziplist和skiplist,在同时满足有序集合保存的元素数量小于128个和有序集合保存的所有元素的长度小于64字节的时候使用ziplist,其他时候使用skiplist。当ziplist作为zset的底层存储结构时候,每个集合元素使用两个紧挨在一起的压缩列表节点来保存,第一个节点保存元素的成员,第二个保存元素的分值;当skiplist作为zset的底层存储结构的时候,使用dict来保存元素和分值的映射关系
  4. 实际上单独使用hashmap或skiplist也可以实现有序集合,如果我们单独使用hashmap,虽然能以O(1)的时间复杂度查找成员的分值,但是因为Hashmap是以无序的方式来保存集合元素,所以每次进行范围操作时候都要进行排序;而如果单独使用skiplist,虽然能执行范围操作,但查找复杂度却变为了O(logN)。因此redis结合了两种数据集合来实现有序集合

4. 说说redis的单线程架构

  1. Redis的网络IO和键值对读写是由一个线程来完成,但Redis的其他功能,例如持久化、异步删除、集群数据等同步操作依赖于其他线程来执行。单线程可以简化数据结构和算法的实现,并且可以避免线程切换和竞争造成的消耗。但是要注意如果某个命令执行时间过长,会造成其他命令的阻塞。
  2. Redis采用了IO多路复用机制,这带给了Redis并发处理大量客户端请求的能力。对于服务端程序来说,线程切换和锁通常是性能杀手,而单线程避免了线程切换和竞争带来的消耗。另外Redis的大部分操作是在内存上完成的,这是他实现高性能的一个重要原因;
  3. Redis的单线程主要是指Redis的网络IO和键值对读写是由一个线程来完成的。而Redis的其他功能,如持久化、异步删除、集群数据同步等,则是依赖其他线程来执行的。所以说Redis是单线程只是一种习惯上的说法。

5. 说说Redis的持久化策略

  1. Redis的持久化策略有三种:
    • RDB持久化:将当前进程中的数据已生成快照的方式保存到硬盘中,是Redis默认的持久化机制。优点:持久化时生成的文件体积小,恢复数据块,缺点:每次运行都需要执行fork操作,RDB持久化策略,没有做到实时的持久化,有时可能会丢失最后一步数据。
    • AOF持久化:以独立日志的方式记录每次写入的命令,重启时执行AOF中的命令即可恢复数据。优点:AOF持久化的安全性更高,保证了数据持久化的实时性。缺点:文件要大很多,恢复速度慢。
    • RDB-AOF持久化:这种方式是基于AOF持久化方式构建出来的。兼具RDB和AOF的优势
最后修改:2024 年 06 月 08 日
如果觉得我的文章对你有用,请随意赞赏