Redis常见问题总结

什么是Redis:

Redis是一个开源的,内存中的数据结构存储系统,可以用作数据库、缓存和消息中间件。它是key,value结构的存储系统,它支持多种数据类型的数据结构,如字符串(strings),散列(hashes),列表(lists),集合(sets),有序集合(sorted sets)等。它可以通过Redis哨兵和自动分区提供高可用性。引入Redis缓存机制可以有效的降低用户访问物理设备的频次,提高响应速度。

持久化策略:

redis的记录都保存在内存中,如果内存断电或者服务器宕机了,那么内存数据就会直接丢失,业务中不允许发生这种情况,所以需要定期的持久的维护数据。

  • RDB模式:默认开启,内存数据的快照,会覆盖,保留最新数据,效率高,但是可能会导致内存数据丢失.
  • AOF模式:默认关闭,开启后RDB失效,手动执行save命令则RDB文件会生成,记录程序的执行过程,可保证数据不丢失,但是持久化文件相对大,所以需要定期维护,效率低.
总结:
  • 如果允许数据少量丢失,可以使用RDB模式.
  • 如果不允许数据丢失,则使用AOF模式.

企业策略:既要满足效率,又不能丢失数据.

  • 主从结构:主机RDB,从机AOF.
  • 淘汰策略:在内存有限的情况下,当内存容量不足时,为了保证程序的运行,需要淘汰内存中的一些对象,释放这些对象占用的空间。
  1. LRU算法、LFU算法、随机算法和TTL算法
  2. 随机算法:随机算法
  3. TTL算法:将剩余时间短的数据提前删除。
  4. LRU算法:是一种常用的页面置换算法.选择最近最久未使用的页面予以淘汰.算法赋予每个页面一个访问字段,用来记录上次被访问以来所经历的时间t,当淘汰一个页面时,选择现有页面中t值最大的的予以淘汰,也就是最近最少使用的.
    判断维度:时间t
  5. LFU算法:最不经常使用页面置换算法,在置换的时候置换引用次数最小的页。因为经常使用的页应该有一个较大的引用次数。但是有些页在开始时使用次数很多,后来就不在使用了,这类页会长时间留在内存中,因此可以设置一个引用计数,用来记录访问次数,将引用计数寄存器定时右移一位,形成指数衰减的平均使用次数,然后淘汰.
    判断维度:使用次数

内存优化策略:

  1. volatile-lru 在设定超时时间的数据中采用LRU算法
  2. allkeys-lru 所有的数据采用LRU算法删除
  3. volatile-lfu 设定了超时时间的数据采用LFU算法删除
  4. allkeys-lfu 所有数据采用LFU算法删除
  5. volatile-random 设定了超时时间的数据采用随机算法
  6. allkeys-random 所有数据的随机算法
  7. volatile-ttl 设定了超时时间之后采用TTL算法
  8. noeviction 不做任何操作,只是返回报错信息.

缓存穿透:

用户高并发环境下访问数据库和缓存中都不在的数据称为穿透现象。
在这里插入图片描述

解决方法:

  • 禁用ip, 限制ip访问
  • 限制每秒访问次数
  • 使用布隆过滤器的方法解决

布隆过滤器: 是一个很长的二进制向量和一系列随机映射函数。可以用于检索一个元素是否在一个集合中,优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。
由于hash碰撞问题,可能有多个key有相同的位置,可以得出结论,布隆过滤器认为数据存在,那么数据可能存在,如果认为数据不存在,那么一定不存在。
优化方法: 可以用扩容二进制向量位数和增加hash函数的个数来降低hash碰撞的几率。


缓存击穿:

当某一个热点数据在缓存中突然失效,导致大量用户直接访问数据库,导致并发压力过高造成异常,这种情况称为击穿.
在这里插入图片描述

解决方法:

  • 尽可能将热点数据的超时时间设置长一点,且设定多级缓存,将超时时间采用随机算法。

缓存雪崩:

在缓存服务器中,由于大量缓存数据失效导致用户访问的命中率过低,导致直接访问数据库。
在这里插入图片描述

解决方法:

  • 设定多级缓存,设定超时时间使用随机算法。

Redis分片机制:

哈希一致性:

是一种特殊的哈希算法,目的是解决分布式缓存的问题.在移除或者添加一个服务器时,能够尽可能小的改变已存在的服务请求与处理请求服务器之间的映射关系,解决了简单哈希算法在分布式哈希表中存在的动态伸缩问题.相同的数据hash得到的结果相同,常见hash值8位16进制数有2^32种可能性.

在这里插入图片描述

  • 平衡性说明:
    平衡性是指hash的结果应该平均分配到各个节点,这样从算法上解决了负载均衡问题
    如果发现数据分布不均匀时,采用虚拟节点的方式,实现数据的平衡,如果一次平衡不能达到目标则多次生成虚拟节点,但是无法做到绝对的平均。

  • 单调性说明:
    单调性是指在新增或者删减节点时,不影响系统正常运行,如果新增或者删除节点,则尽可能不要改变原有的数据结构。

  • 分散性说明:
    分散性是指数据应该分散的存放在分布式集群中的各个节点(节点自己可以有备份),不必每个节点都存储所有的数据。


哨兵机制:

如果redis分片中有一个节点宕机了,则可能会影响整个服务的运行,redis分片没有实现高可用,所以就需要使用哨兵来监控主机.

工作原理:
启动哨兵时,会监控主机,获取当前所有节点的状态,同时开启心跳检测,当主机发生宕机现象时,哨兵的PING-PONG机制(心跳检测)会发现主机宕机然后进行选举,选举成功后,新的主机当选,其他的节点当新主机的从机.

分片/哨兵总结:

  1. redis分片主要的作用是实现内存的扩容,缺点是没有实现高可用的效果
  2. redis哨兵主要的作用是实现了redis节点高可用,缺点是没有实现内存扩容

redis哨兵机制实质就是引入第三方监控,但是需要保证第三方的高可用就必须引入更多的资源

面试问题:

  • redis集群中一共可以存储16384个数据?
    不对: 16384是槽位,分区只是决定数据归谁管, redis中存储多少数据完全由内存决定.
  • redis集群中最多可以有多少个redis主机
    16384个主机:最多是1台主机管理1个槽位

redis集群:

  • 通常为了提高网站响应速度,总是把热点数据保存在内存中而不是直接从后端数据库中读取
  • Redis是一个很好地Cache工具.大型网站应用,热点数据量往往巨大,几十上百G很正常
  • 由于内存大小的限制,使用一台redis实例显然无法满足需求,所以就需要使用多台redis作为缓存数据库,但是如何保存数据存储的一致性?这时就需要搭建redis集群,采用合理的机制,保证用户的正常的访问需求
  • 采用redis集群,可以保证数据分散存储,同时保证数据存储的一致性,并且在内部实现高可用的机制,实现了服务故障的自动迁移

集群原理:
redis的所有节点都会保存当前redis集群中的全部主从状态信息,并且每个节点都能够相互通信,当一个节点发生宕机现象,则集群中的其他节点通过PING-PONG检测机制检查redis节点是否宕机,当有半数以上的节点认为宕机,则认为主节点宕机,同时由redis剩余的主节点进入选举机制,投票选举连接宕机的主节点的从机,实现故障迁移

特点:

  • 集群中如果主机宕机,那么从机可以继续提供服务
  • 当主机没有从机时,则向其它主机借用多余的从机,继续提供服务,如果主机宕机时没有从机可用,那么集群崩溃.
  • 一般情况下是1主2-3从.

Redis hash槽存储数据原理

Hash槽算法(分区算法)
说明:

RedisCluster采用此分区,所有的键根据哈希函数(CRC16[key]%16384)映射到0-16383槽内,共16384个槽位,每个节点维护部分槽及槽所映射的键值数据,根据主节点的个数,均衡划分区间.

算法:

  • 哈希函数:Hash()=CRC16[key]%16384

几台服务器可以搭建集群:

  • 公式:存活节点>N/2

算数计算:

  • 1个节点 1-1>1/2 假的
  • 2个节点 2-1>2/2 假的
  • 3个节点 3-1>3/2 真的
  • 结论:集群搭建最小服务器数:3台
集群一般都是奇数台:

原因:

  • 3个节点和4个节点都是允许宕机1台,他们的容灾效果相同,所以一般是奇数个
集群的脑裂现象:

说明:

由于集群工作过程中主机意外宕机,之后集群开始进行选举,如果出现多次连续平票状态时,则可能出现脑裂现象.

脑裂发生的概率是:1/8=12.5%
在这里插入图片描述

解决: 可以增加节点的数量可以降低脑裂现象发生.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
引用提到了Redis启动的闪退问题,引用介绍了两种启动Redis的方法,但都会导致闪退。下面我将总结一些常见的Redis启动问题。 1. Redis配置错误:启动Redis时,如果配置文件有错误或者缺少必要的配置,可能会导致启动失败。可以检查redis.conf文件中的配置是否正确,并确保所有必要的配置项都被设置。 2. 端口被占用:如果Redis要使用的端口已经被其他程序占用,那么Redis启动时会失败。可以通过检查端口占用情况,或者修改Redis配置文件中的端口号来解决该问题。 3. 内存不足:Redis需要一定的内存来运行,如果系统内存不足,可能会导致Redis启动失败。可以通过增加系统内存或者减少Redis的内存使用来解决该问题。 4. 权限问题:如果Redis的执行文件或者配置文件没有足够的权限,可能会导致启动失败。可以检查文件的权限设置,并确保Redis所在的目录对当前用户有足够的访问权限。 5. 版本兼容性问题:在某些情况下,Redis的版本与操作系统或其他依赖软件之间存在兼容性问题,可能会导致启动失败。可以尝试升级或降级Redis版本,或者解决相关的依赖冲突来解决该问题。 需要注意的是,这只是一些常见的Redis启动问题,具体问题可能因环境和配置的不同而有所差异。如果还遇到其他问题,建议查看Redis的文档或社区中的解决方案,或者尝试搜索类似的问题和解决方法。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [windows下Redis启动闪退问题解决经验汇总](https://blog.csdn.net/httpmc2018/article/details/121082182)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *3* [redis 常见问题](https://blog.csdn.net/u013743253/article/details/124093790)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值