redis数据删除/内存淘汰

如果我们设置一批key只能存活1小时,那么1小时之后,redis是怎么对这批数据进行删除的?

答案:定期删数+惰性删除

(1)定期删除

指的是redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。注意,这里可不是每隔100ms就遍历所有的设置过期时间的key,那样就是一场性能上的灾难。实际上redis是每隔100ms随机抽取一些key来检查和删除的。

(2)惰性删除

定期删除的问题是可能会导致很多过期key到了时间并没有被删除掉,那怎么办?所以还有惰性删除,也就是在查询某个key的时候,redis会检查一下这个key如果设置了过期时间并且是否过期了,如果过期了就会在此时删除。

通过定期删除和惰性删除两种方式结合,保证过期的key一定会被删除

  • 定期删除是为了节省内存
  • 惰性删除是为了保证过期性

如果定期没删除,也没有查询,这样会导致大量过期的key堆积在内存里怎么办?

答案:内存淘汰机制

allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。
volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。
手写LRU

public class LRUCache extends LinkedHashMap {private final int CACHE_SIZE;public LRUCache(int cacheSize){/*** 这块就是设置一个hashmap的初始大小,* 同时最后一个true指的是让linkedHashMap按照访问顺序来进行排序(自动实现LRU)* 最近访问的放在头,最老访问的放在尾*/super((int)Math.ceil(cacheSize/0.75)+1, 0.75f, true);CACHE_SIZE = cacheSize;}
//通过覆盖这个方法,加入一定的条件,满足条件返回true。
//当put进新的值方法返回true时,便移除该map中最老的键和值。@overrideprotected boolean removeEldestEntry(Map.Entry eldest){/*** 这个意思就是说当map中当数据大于指定当缓存个数当时候,就会自动删除最老的数据*/return size() > CACHE_SIZE;}}

主从复制过程

这个牛客网上问的也不多,先待定二轮复习再补充

Redis哨兵模式

这都是为了提高redis的高可用性

==集群监控==,负责监控redis master和slave进程是否正常工作
==消息通知==,如果某个redis实例有故障,那么哨兵负责发送消息作为报警通知管理员
==故障转移==,如果master node挂掉了,会自动转移到slave node上
==配置中心==,如果故障转移发生了,通知client客户端新的master地址

  • 命令连接:用来获取主/从服务器的信息
  • 订阅连接:sentinel1会通过命令连接向主从服务器发送自身状态信息,通过订阅连接将此信息通知到其他的哨兵,因此哨兵不需要知道哨兵之间的位置
  • 哨兵之间命令连接:与下线检测的原理相关(因为此时主服务器已经宕机,无法通过订阅连接让哨兵之间通知)

哨兵模式工作流程

  1. 每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令。
  2. 如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被当前 Sentinel 标记为主观下线。
  3. 如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。
  4. 当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线 ,进而对Master进行故障转移

故障转移流程

  1. 选取领头哨兵,采取先到先得的方式,超过半数哨兵的支持的哨兵成为领头哨兵
  2. 从已下线主服务器属下的所有从服务器里面,挑选一个从服务器,并将其转换为主服务器
  3. 让一下先主服务器属下所有从服务器改位复制新的主服务器
  4. 将已下线主服务器设置位新的主服务器的从服务器

挑选从服务器的流程

  1. 从服务器处于在线状态
  2. 从服务器最近五秒回复过哨兵的INFO命令
  3. 跟master断开连接的时长较短,这是为了保证从服务器的数据较新
  4. 从服务器优先级,复制偏移量(哪个slave复制了越多的数据,offset越靠后,优先级就越高),运行ID(run id比较小),进行排序

为什么哨兵至少需要3个

  • 因为挑选领头哨兵的时候需要获得超过半数的投票,所以一般都是把哨兵的节点设置为奇数位。因为(2的majority=2,3的majority=2,5的majority=3,4的majority=3)偶数容易算错
  • 2个哨兵同样可以完成功能,所以其实没有说一定要至少三个,只是两个哨兵的时候如果挂了一个就不可用了,而三个哨兵挂了一个还有两个可用。因此至少3个是为了达到一定的高可用性的常用配置而已。

Redis集群模式

redis分片

将整个数据集按照一定的规则分配到多个节点上,常用的数据分片的方法有:范围分片,哈希分片,一致性哈希算法,哈希槽等。

槽位的概念在集群这里很重要,任何key都要通过槽位分片到不同的节点运行

创建集群的流程

  1. 配置和开启cluster模式
  2. 配置redis实例节点握手
  3. 为每个主节点指派槽位,一般按区间平均分配
  4. 分配主从

扩容集群过程

  1. 准备新节点
  2. 加入集群进行握手
  3. 迁移槽和数据(槽位转移了,对应槽位的数据也会迁移到新的实例上)

缩容过程

  1. 确定下线的节点是否有负责槽,如果是,需要把槽迁移到其他节点,保证节点下线后整个槽节点映射的完整性。
  2. 当下线节点不在负责槽或着本身是从节点时,就可以通知集群内其他节点忘记下线节点,当所有节点忘记该节点后就可以正常关闭。

故障转移

为什么redis cluster至少需要3个主节点?

因为故障检测时没有哨兵,需要超过半数的主节点都主观下线,该故障节点才会被视为客观下线。两个主节点,如果挂了一个,那么只剩一个无法达到超过半数的条件。这与哨兵模式不同,因为两个哨兵不一定会挂。

故障转移过程-----《redis设计与实现》------感觉不会考

主从复制,哨兵,集群的区别

1.主从模式:读写分离,备份,一个Master可以有多个Slaves。

2.哨兵sentinel:监控,自动转移,哨兵发现主服务器挂了后,就会从slave中重新选举一个主服务器。

3.集群:故障转移不再需要哨兵,提供数据分片,提高并发量,一般都是使用它了。

为什么集群要奇数_面试系列 redis数据删除amp;集群相关推荐

  1. redis订阅执行一段时间自动停止_面试系列 redis 分布式锁amp;数据一致性

    分布式锁 多个系统同时操作一个redis,因为jvm锁是线程级别的,所以没有办法锁住多个系统. Redis锁实现: setnx key value 只有在key不存在时设置key的值 此时key相当于 ...

  2. 单线程多线程_面试系列 redis为什么快amp;单线程amp;多线程

    redis为什么这么快 C语言实现,执行速度快 纯内存操作,数据读写在内存中,异步持久化到磁盘 丰富和高效的数据结构 基于非阻塞的I/O多路复用机制 单线程避免了上下文切换 Redis单线程 redi ...

  3. 12c集群日志位置_面试问Redis集群,被虐的不行了......

    [51CTO.com原创稿件] 上一篇我们讲解了 Redis 哨兵的工作原理,哨兵主要针对单节点故障无法自动恢复的解决方案,集群主要针对单节点容量.并发问题.线性可扩展性的解决方案. 图片来自 Pex ...

  4. java中h5是什么_[ 面试系列 ] - 三:H5 是什么?

    系列文章 H5 和 HTML5 我想可能很多同学都和曾经的我一样,认为 H5 是 HTML5 的简写,所谓 H5 开发,就是遵循 HTML5 标准的前端开发而已.但事实并非如此,尽管 H5 这个词最早 ...

  5. 银行java面试题手写代码_面试系列——手写代码实现(一)

    前言 本文是面试系列篇的实现篇.笔者整理了面试过程中可能会遇到的手写实现,以及它的原理.这可以帮助面试者在笔试环节获得良好的加分. 其他文章系列,欢迎关注我文末的公众号 正文 apply和call a ...

  6. hadoop重命名文件_面试系列:深入理解hadoop架构体系

    hadoop组件简介 官方文档组织的非常清晰,主要由以下四个组件组成:HDFS.map-reduce.yarn.hadoop-common hdfs架构 HDFS 分布式文件存储系统,主要特点是: 可 ...

  7. winform 统计大量数据重复的元素个数_面试系列:十个海量数据处理方法大总结...

    本文将简单总结下一些处理海量数据问题的常见方法.当然这些方法可能并不能完全覆盖所有的问题,但是这样的一些方法也基本可以处理绝大多数遇到的问题.下面的一些问题基本直接来源于公司的面试笔试题目,方法不一定 ...

  8. mysql 集群 运维_【MySQL运维】Canal集群模式与多数据库同步部署

    一.Canal工作原理 Canal基于数据库的增量日志进行解析,然后提供增量数据的订阅和消费.Canal会将自己伪装成MySQL的 Slave去向主库进行同步请求,然后将获取到的binlog解析成特定 ...

  9. desktop docker 无法卸载_在docker-for-desktop OSX上删除kubernetes集群

    What is the equivalent command for minikube delete in docker-for-desktop on OSX As I understand, min ...

最新文章

  1. 六款小巧的HTTP Server
  2. 【白话机器学习】算法理论+实战之Xgboost算法
  3. 100 个网络基础知识,看完成半个网络高手
  4. ubuntu下编译pjsip
  5. 读后感:软件测试经验与教训
  6. 在Linux环境下安装和配置phpmyadmin
  7. 3dmax如何显示参考图_3d效果图渲染丢材质、丢贴图该如何解决?
  8. $(function() {});和$(document).ready(function() {});区别
  9. Windows Server 2003 R2中的DFS复制与管理
  10. linux pm2功能说明,PM2介绍及简易使用手册
  11. 人工智能十大算法_套磁amp;科研 |南加利福尼亚大学空间科学研究所终身教授YaoYi Chiang带来数据挖掘算法研究课题...
  12. 分享一例BIOS损坏修复案例
  13. 【计算机图形学】Liang-Barsky裁剪算法(C++实现)
  14. OA实施周期:易用性才是关键因素
  15. goldendict 屏幕取词
  16. 【问题】PPS、PPSX自动放映格式打开直接进入编辑模式
  17. python3.7程序实例_生信编程实战第7题(python)
  18. 关于@Vaild注解的使用
  19. [论文阅读笔记15]Recognizing Complex Entity Mentions:A Review and Future Directions
  20. HBase :HBase高级shell管理命令

热门文章

  1. 17.07.26 Oracle安装
  2. bootstrap-图标使用
  3. 开发时经常用到的Util --- 1
  4. 关于seo优化的核心思想
  5. 技术人员,为什么会苦逼
  6. MySQL Cluster集群配置方案
  7. 2011年使用天正建筑8.0注册版(附注册机)
  8. C语言scanf fgets,C语言中输入函数(scanf()、fgets()和gets())的区别详解
  9. java string出现次数_Java String方法获取字符出现次数及字符最大相同部分示例
  10. mysql docker 制作_docker 制作自己的mysql镜像