Redis相关问题
-
哨兵组件的主要功能:
- 集群监控:负责监控机器是否正常的运行
- 消息通知:如果某个机器发生故障进行消息警报
- 故障转移:主机宕机进行转移到其他的机子
- 配置中心:告诉用户新的主机的ip地址
-
redis为什么速度快?
- Redis使用的是单线程IO的形式,数据都存储在内存中,速度非常快,没有锁竞争
- 数据结构简单,而对数据的操作也非常简单
- 使用多路IO复用模型,非IO阻塞,采用多路 I/O 复用技术可以让单个线程高效的处理多个网络连接请求(尽量减少网络 IO 的时间消耗);
- 高效的数据结构,加上底层做了大量优化
-
什么是雪崩、缓存穿透、缓存击穿?如何解决
-
雪崩是指在某个时刻有大量数据进行访问数据库的时候而此时的恰好数据库缓存同时大面积的失效,而大量请求直接进行对数据库的冲击,导致数据库的崩溃的现象;
解决方式:1:可以设置缓存失效时间的随机性,或者设置热点数据的永不失效
2:使用互斥锁更新,保持同一个进程针对同一个数据不会请求到DB,减小压力
-
缓存穿透是指用户在对数据库不存在的数据进行请求,比如id不为负数等等;导致数据库压力很大出现问题
解决方式:1:可以在对数据库进行访问的接口层进行用户拦截,使用布隆过滤器或者其他手段
2:可以设置一个空对象进行标记,防止相同的ID进行访问,缺点就是可能会出现过多的空对 象
-
缓存击穿是指某个热点数据实现期间被大量数据进行围攻的情况
解决方法:1:设置热点数据的失效随机性或者永不失效,保证不会出现大面积的缓存数据的失效
2:使用集群方式保证数据库的高可用
3:使用数据限流的方式(限流组件),进行设置处理数据的代销
-
-
Redis 和 Memcached 有啥区别,为啥选择用Redis作为的缓存中间件?
-
存储数据:Memcache只支持String,Redis支持多种数据格式
-
持久化:Memcache不支持持久化和主从同步,Redis支持RDB和AOF两张方式进行持久化支持高可用
-
key失效时间:Memcache是30天,key不能超过250个字节;value不能超过1M字节;
-
性能对比:
由于 Redis 只使用单核,而 Memcached 可以使用多核,所以平均每一个核上 Redis 在存储小数据时比 Memcached 性能更高。而在 100k 以上的数据中,Memcached 性能要高于 Redis,虽然 Redis 最近也在存储大数据的性能上进行优化,但是比起 Remcached,还是稍有逊色。
-
-
基于 Redis 的实现分布式锁,前面遇到的问题,以及对应的解决方案:
- 死锁:设置过期时间
- 过期时间评估不好,锁提前过期:守护线程,自动续期
- 锁被别人释放:锁写入唯一标识,释放锁先检查标识,再释放
-
基于 Redis 实现的分布式锁,一个严谨的的流程如下:
- 加锁:SET lock_key $unique_id EX $expire_time NX
- 操作共享资源
- 释放锁:Lua 脚本,先 GET 判断锁是否归属自己,再 DEL 释放锁
-
Redis过期键的删除策略:
-
惰性删除
- 不管键是否失效,每次在进行访问的时候在进行判断,失效则删除,反之返回键;
-
被动删除
-
定时删除:在某一个时间刻进行删除;
-
定期删除:每隔一段时间进行对数据库进行检查,删除量由算法决定。
Redis采用的是惰性删除和定时删除策略
-
-
-
Redis的内存淘汰机制:
volatile-lru 在已经设置过期时间的键进行最近最少使用的进行淘汰 allkeys-lru 所有的键里面进行最近最少使用的进行淘汰 volatile-random 在已经设置过过期时间的键里面进行随机淘汰 allkeys-random 所有的键里面进行随机淘汰 volatile-ttl 不使用淘汰策略,大于内存则报错 noeviction 从已经设置过期时间且过期时间比较短的进行淘汰 -
如何保证缓存和数据库的数据一致性
-
Redis的持久化操作是如何实现的
持久化分为快照方式(RDB)和日志方式(AOF)
- RDB方式:此方式注重的是数据。在一定的时间进行检测key的变化,由主配置文件(Redis.Windows.conf文件)进行设置key变化量的大小进行持久化到磁盘
- 使用的是save进行持久化操作,默认存储的文件是dump.rdb文件,相对于数据大或者访问多不适合使用,优化后使用COW、fork函数进行操作持久化
- bgSave会启动一个fork子函数进行持久化,而fork函数操作与主线程互不干扰
- 优点:
- RDB方式存储的是一个紧凑的二进制文件,存储效率高
- RDB恢复数据速度相比较AOF快
- 适合数据备份、数据整体复制的场景
- 缺点:
- 数据量的话进行数据持久化慢,I/O效率下降
- 无法进行数据的实时备份,丢失数据的可能性大
- 使用bgSave方式每次需要创建子线程开销内存
- AOF方式:此方式注重的操作。持久化即记录所有变更数据库状态的指令,以append的形式追加保存到AOF文件中。在服务器下次启动时,就可以通过载入和执行AOF文件中保存的命令,来还原服务器关闭前的数据库状态。
- 存储的是数据的操作,数据保存实时性强
- RDB方式:此方式注重的是数据。在一定的时间进行检测key的变化,由主配置文件(Redis.Windows.conf文件)进行设置key变化量的大小进行持久化到磁盘