redis 问题整理

1. redis 为什么默认16个数据库?

redis 不支持自主数据库命名,且只能用相同的用户名称和密码,集群支持 db0,数量可在配置中修改。

2. 什么是reids?

redis 是一个高性能的 key-value 数据库,使用ANSI C语言编写,支持数据的持久化,提供list  set  hash zset 等数据结构、支持 主从备份。
性能极高。Redis能读的速度是110000次/s,写的速度是81000次/s

3.为什么要用reids?

解决性能和并发的问题。

4.redis 各个类型的最大储量?

   String类型:一个String类型的value最大可以存储512M
   List类型:list的元素个数最多为2^32-1个,也就是4294967295个。
   Set类型:元素个数最多为2^32-1个,也就是4294967295个。
   Hash类型:键值对个数最多为2^32-1个,也就是4294967295个。
   zset类型:跟Set类型相似。

5. redis zset 实现机制是什么?

1. 当长度小于128 并且所有的内容长度 < 64 字节。
   使用 ziplist,采用双向链表的形式存储。
2. skiplist
    skiplist 包含两部分,一个字典(保存成员到分数的映射),一个跳跃表(按照score 从小到大保存所有的集合)
    跳表是在相隔一个成员上增加一个指针,指向下下一个的成员,再在新生成的上面继续增加指针,有点相似于二分查找法,但是这种问题又会产生新的问题,当删除和新增时,就会增加复杂度。
    为了避免这个问题,skiplist 不会严格要求上下相邻两层的节点有严格的对应关系,每一个节点会随机分配一个所需要的层数,这样就严格避免了这种现象。
   https://www.cnblogs.com/yuanfang0903/p/12165394.html#_label0

6. redis 为什么不支持回滚?

redis 认为出错,出错的原因是因为类型和命令而导致的错误,在开发过程中可以避免, 而完整的事务,会让redis 变得更加复杂,可能导致性能问题。

7. redis 为什么要把所有的数据放入到内存中?

redis 为了达到最快的读写速度,将数据都放入到内存中,并通过异步的方式将数据写入到磁盘中,所以reids 具有快速和持久化的特性,如果不放入到内存中,将会严重影响redis性能。

8. redis 为什么设计成单线程?

避免不必要的上下文切换和竞争关系,不用考虑各种锁的问题,redis 是基于内存的操作,cpu 不是redis 的瓶颈,redis 的瓶颈可能是物理内存和网络带宽。

 9. 多路 I/O 复用模型?

多路I/O复用模型是利用 select、poll、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候,会把当前线程阻塞掉,当有一个或多个流有 I/O 事件时,
就从阻塞态中唤醒,于是程序就会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。
使用一种机制,检测多个描述,如果有一个描述就绪,就通知程序进行。

 10. 什么是缓存穿透、击穿、雪崩,怎么解决?

这些都是导致数据库压力过大而需要改善的。
请求绕过redis 直接访问数据库就是缓存穿透,一种攻击手段。
防范:
key 规则的过滤,
采用布隆过滤器,将所有可能存在的数据存到一个bitMap中,不存在的数据就会进行拦截。
缓存和数据库都取不到数据,写成 key-null,时间可以设置短一点。

缓存击穿是缓存中没有,数据库中有,一般是数据过期造成的。
防范:
设置热点数据永不过期。
添加互斥锁。

缓存雪崩是缓存中大量数据过期,而引起数据库压力过大。
防范:
随机设置过期时间。
设置热点数据永不过期。

 11.  redus 持久化机制?

AOF 以日志的形式保存,体积大,恢复慢,可读性高。  有特定格式,所以大很多。
RDB 以快照的形式保存,以二进制的形式保存,体积小,恢复快。
原文地址:https://www.cnblogs.com/chengyangyang/p/13093196.html