Redis 八股文之特性
一,为什么这么快?
- 基于C 语言编写
- 重新设计的简单数据结构
- 基于内存
- 单线程处理,避免上下文切换。注意6.x 版本后支持多线程,但在执行命令的时候还是单线程,仅是在与客户端建立socket连接和回写数据到socket时多线程,因为Redis的瓶颈不在于CPU,而是在于网络和内存。但内存不够可以通过加内存,数据结构优化和其他优化解决。可网络I/O占大部分的CPU时间,所以客户端socket的读取和回写在6.x版本被设计成多线程
- 基于I/O多路复用的事件模型
- 使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求
二,五大基本数据类型?
- string:字符串
- hash:哈希
- set:无序集合
- zet:有序集合
- list:列表
三,其他数据结构和功能
- geohash:地理位置,两经纬度之间的计算
- heyperLog:基于伯努利试验设计的基数统计算法
- 计数器
- bitmap:位图
- 跳表:类似于jdk中的 ConcurrentHashMap
四,常见的Redis可实现的业务方案?
- 缓存用户共享信息:token,认证信息,session,页面,热点数据等等
- 点赞,收藏,关注
- 基于计数器和数据结构实现 pv,uv,ip,停留页面等指标的统计量系统
- 基于hash实现短链接转换器
- 布隆过滤器:可基于谷歌的guava工具包实现大数据量判断是否存在的业务功能
- 订阅发布功能,可实现轻量级消费队列。何为轻量就是没有异常处理,异常重试等健壮性功能。基于此功能亦可实现,微服务的注册中心。
- 分布式锁,典型的就是Redisson分布式工具包
- 多个Redis命令的事务执行
- Redis实现限流:1,漏桶算法;2,令牌桶算法 ;3,基于list的滑动窗口算法;4,基于时效性的 setnx 实现的限流
五,Redis的键淘汰策略?
- volatile-lru:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰
- volatile-ttl:从已设置过期时间的数据集中挑选将要过期的数据淘汰
- volatile-random:从已设置过期时间的数据集中任意选择数据淘汰
- volatile-lfu:从已设置过期时间的数据集挑选使用频率最低的数据淘汰
- allkeys-lru:从数据集中挑选最近最少使用的数据淘汰
- allkeys-lfu:从数据集中挑选使用频率最低的数据淘汰
- allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
- no-enviction(驱逐):禁止驱逐数据,这也是默认策略。意思是当内存不足以容纳新入数据时,新写入操作就会报错,请求可以继续进行,线上任务也不能持续进行,采用no-enviction策略可以保证数据不被丢失
六,Redis备份策略?
- AOF:增量备份,执行一条命令,备份一条命令
- RDB:全量备份,内存快照,某一时刻的内存快照
七,集群架构模型?
- 单机模式
- 集群模式,通过负载均衡均衡的算法,存储在每一个实例上面,每个实例上的数据都是一样的
- 主从模式,主为写,从为读,主的数据定时备份到从实现数据同步。缺点也明显,主挂了,从会出现脏数据以及系统不能进行写操作
- 哨兵+ 主从模式 ,哨兵就是为了解决单点故障二设计出的第三方仲裁实例
- Cluster 集群 根据 分片算法将 数据切分成 多段 存储在 不同实例上