学这个https://interview.huihut.com/#/


  • this 指针被隐含地声明为: ClassName *const this,这意味着不能给 this 指针赋值;

  • 内联函数

    • 缺点: inline 函数无法随着函数库升级而升级。因为在编译器就编进去了,inline函数的改变需要重新编译,不像 non-inline 可以直接链接。
    • 虚函数(virtual)可以是内联函数(inline)吗?一般都说不可以,但是在不表现出多态时,是有可能被内联的,比如说直接通过对象调用,编译器就可能内联。

  • 内存屏障

    • 大多数现代计算机为了提高性能而采取乱序执行,这使得内存屏障成为必须。
      语义上,内存屏障之前的所有写操作都要写入内存;内存屏障之后的读操作都可以获得同步屏障之前的写操作的结果。因此,对于敏感的程序块,写操作之后、读操作之前可以插入内存屏障。

  • 不可以同时用const和static修饰成员函数

    • C++编译器在实现const的成员函数的时候为了确保该函数不能修改类的实例的状态,会在函数中添加一个隐式的参数const this*。但当一个成员为static的时候,该函数是没有this指针的。也就是说此时const的用法和static是冲突的。
    • 我们也可以这样理解:两者的语意是矛盾的。static的作用是表示该函数只作用在类型的静态变量上,与类的实例没有关系;而const的作用是确保函数不能修改类的实例的状态,与类型的静态变量没有关系。因此不能同时用它们。

  • STL中的sort

    • STL中的sort(),在数据量大时,采用quicksort,分段递归排序;一旦分段后的数量小于某个门限值,改用Insertion sort,避免quicksort深度递归带来的过大的额外负担,如果递归层次过深,还会改用heapsort。

  • mutable:

    • 使用场景:对可能要发生变化的成员前,加上存储描述符mutable。
    • 为什么要有这种去除常量标志的需求?
      • 逻辑常量性:对用户而言是常量,但在用户不能访问的细节上不是常量。

  • shared_ptr 初始化

    • 尽量避免使用raw pointer构建shared_ptr吗,使用std::make_shared();
    • std::shared_ptr ptr2(new int());
      • 此方法在堆上创建了两块内存:1:存储int。2:控制块上用于引用计数的内存,管理附加此内存的 shared_ptr 对象的计数,最初计数将为1。
    • std::shared_ptr ptr = std::make_shared();
      • std::make_shared 一次性为int对象和用于引用计数的数据都分配了内存,而new操作符只是为int分配了内存。
    • 优势一是减少了内存碎片,二是效率高,三是还能用move语义,性能更好。

  • 范式化设计优缺点:

    • 优点: 可以尽量得减少数据冗余,使得更新快,体积小
    • 缺点:对于查询需要多个表进行关联,减少写得效率增加读得效率,更难进行索引优化
  • 反范式化:
    • 优点:可以减少表的关联,可以更好得进行索引优化
    • 缺点:数据冗余以及数据异常,数据得修改需要更多的成本

  • mysql 主从复制+读写分离

    • 为了提高数据库的并发性能
    • 读写分离一般master负责写入数据,两台slave负责读取数据。
      • 读写分离好像不是依赖mysql的设置,一般是用框架或者自定义逻辑。
    • 读写分离后,从机需要同步脏数据,一般是 binlog 和 delaylog 的配合完成:
      1. 当Master节点进行insert、update、delete操作时,会按顺序写入到binlog中。
      2. salve从库连接master主库,Master有多少个slave就会创建多少个binlog dump线程。
      3. 当Master节点的binlog发生变化时,binlog dump 线程会通知所有的salve节点,并将相应的binlog内容推送给slave节点。
      4. I/O线程接收到 binlog 内容后,将内容写入到本地的 relay-log
      5. SQL线程读取I/O线程写入的relay-log,并且根据 relay-log 的内容对从数据库做对应的操作。

  • Redis 集群简介

    • Redis 客户端可以直接连接任何一节点获取集群中的键值对。Redis 集群是一个网状结构没有中心节点的说法,每个节点都通过 TCP 连接跟其他每个节点连接。这些 TCP 连接会永久保持。
    • 自动通过hash分割数据到不同的节点上。
    • 集群使用了主从复制模型,每个主节点master应至少有一个从节点slave。假设某个主节点故障,其所有子节点会广播一个数据包给其他主节点来请求选票,一旦某个从节点收到了大多数主节点的回应,那么它就赢得了选举,被推选为主节点,负责处理之前旧的主节点负责的哈希槽。

  • 算法题拓展:1~n的数字,缺两个数字:

    • 缺一个数字的很常见,用亦或比较优。
    • 缺两个的直接用这个则不好,求和相减也只能知道两个数的和,那么则需要思考如何转换为一个。
    • 将数组中的元素与 1 ~ n 全部进行异或运算,,记为c。由于a!=b。所以c!=0;那么一定有一位是1。用d=(c-(c&(c-1)))就可以得到c的最右边的为1的位,以这一位为分界线,为1的分为一组,不为1的分成另一组,这样就将问题转化成问题1的情况了。那a、b自然也就出来了。

  • Redis:hash、set、zset

    • hash 是哈希表。

      • 实现原理,其在存储内容较少的时候使用ziplist 压缩列表,内容多的时候使用hashtable 哈希表,存储的是string的键值对。
      • 用途:比如购物车缓存,uid对应一个hash,里面存(商品名 : 数量)。再比如做计数器,HINCRBY 操作可以直接加一。(日期 : 访问量)、(文章id:点赞数)等。
    • set 是无序集合。
      • 实现原理:编码可以是 intset 或者 hashtable。往里存入一个string。
      • 无序集合的用途:不允许重复。做并集,搽剂,交集等操作。比如共同好友。
    • zset 有序集合:
      • 实现原理:skip_list跳表和hashtable哈希表。skip_list跳表详解见下方。
      • 存入时,每个value需要对应一个分数,按照分数排序。
      • 用途:用于需要排序的表,比如排行榜,分数榜之类的。还可以交集并集。
        • 博客中还提到了限流也可以用排序set做,很神奇,记录一下:滑动窗口限流,我们把一个用户的访问时间戳作为score和value。我们只需统计某个用户在指定时间戳区间内的次数,限制这个次数来决定是否访问。

  • Redis中的跳表:

    • 跳表:90年提出的。平均 O(logN),最差 O(N)。能与平衡树媲美,但操作还简单,空间换时间。

      • 最简单的结构如下图,上层元素跳着排,下层比上层跳的少,最后一层所有元素。查找时,从上层查找。

      • redis中用跳表,利于查找区间,插入、删除时也比较方便,不会设计红黑树的染色旋转等。

      • redis中加强了一下:首先,最底层元素有后驱指针,是前后都可以遍历的。再者,对于是否作为上层节点,是依靠概率的。


  • Redis 6.0 加入了 多线程

    • 6.0之前,核心处理是单线程的,其他操作可能是多线程的,真正处理语句和数据是单线程的,好处是无锁开销,切换线程的开销。但也无法用到多CPU带来的效率提升。

  • 如何避免死锁

    • 代码中可以按顺序获取锁;
    • 可以设置超时时间(redis分布式锁);
    • 银行家算法:还有已知进程资源需求的情况下,在启动时就判断是否有死锁的可能。

  • Redis 过期策略

    • 定时: 定时器,每个过期时间都一个定时器,太消耗资源了,没人用。
    • 惰性:访问到这个键值了之后,才查看,过期了则淘汰。
    • 定期:一段时间清理一次,设置10则是100ms清理一次;并且当maxmemory满了也会清理。

  • Redis 的清理策略:当前已用内存超过maxmemory限定时,触发主动清理策略

    • 设置过期时间的 + LRU 最近最少使用的;
    • 设置过期时间的 + ramdom 随机的;
    • 设置过期时间的 + ttl 即将要过期的;
    • 全部数据中 + LRU;
    • 全部数据 + ramdom;
    • 不淘汰,写入失败。
    • Redis 的 LRU 的实现:通过给每个对象一个时间戳。但维护 LRU队列 需要额外开销。Redis为了效率,策略是随机取出若干个key,然后按照访问时间排序后,淘汰掉最不经常使用的。

阿龙的学习笔记---202107学习相关推荐

  1. SilverLight学习笔记--进一步学习Isolated Storage独立存储一(理论篇)

    在"silverlight如何在客户端读取文件"以及"silverlight如何在客户端写入文件"两篇文章中我们初步接触了Isolated Storage概念. ...

  2. Python3学习笔记之-学习基础(第三篇)

    Python3学习笔记之-学习基础(第三篇) 文章目录 目录 Python3学习笔记之-学习基础(第三篇) 文章目录 一.循环 1.for循环 2.while循环 3.break,continue 二 ...

  3. 强化学习笔记-强化学习概述

    强化学习笔记-强化学习概述 机器学习分类 强化学习与监督学习的异同点 强化学习基本原理 强化学习解决的是什么样的问题 强化学习分类 请分别解释随机性策略和确定性策略 回报.值函数.行为值函数三个指标的 ...

  4. 学习笔记 mysql_MySQL 学习笔记

    MySQL 学习笔记 1 定义 数据库中的表:一行叫一条记录.每一列叫一个属性,或一个字段. 主键:表中的某个特殊字段,具有唯一的确定的值,可以根据该字段唯一的确定一条记录 外键:表中的某个字段的值为 ...

  5. cocos2d学习笔记2——学习资源

    1. 视频 找了好几个视频,有一些讲得好的文件资源没有,后来终于找到一个讲得不错还有文件资源的,还有高清下载地址,虽然是2.2版本的,但是确实能学到不少东西,对用cocos2d做游戏有了基本的印象,对 ...

  6. lucene学习笔记_学习Lucene

    lucene学习笔记 我目前正在与一个团队合作,开始一个基于Lucene的新项目. 虽然大多数时候我会争论使用Solr还是Elasticsearch而不是简单的Lucene,但这是一个有意识的决定. ...

  7. 大数据业务学习笔记_学习业务成为一名出色的数据科学家

    大数据业务学习笔记 意见 (Opinion) A lot of aspiring Data Scientists think what they need to become a Data Scien ...

  8. Linux学习笔记------java学习

    前言 学习笔记仅供参考 该笔记是作者根据b站狂神说视频以及自己翻阅的一些资料而写 视频连接:狂神Linux视频链接 如果有兴趣的小伙伴可以前去观看 如果购买过服务器的话,可以直接使用宝塔进行傻瓜式安装 ...

  9. shell学习笔记---工具学习

    . sort工具 . uniq工具 . paste工具 . cut工具 . xargs工具 . sed工具 . awk工具 . find工具 . 模式空间选择空间 # sort工具 # sort将文件 ...

最新文章

  1. AI 技术实力图谱全解析!2018 中国 AI 开发者大会重磅来袭
  2. 第13讲nbsp;日期和时间nbsp;EXCEL2010…
  3. java org.jsoup does not exist_java使用Jsoup连接网站超时的解决方法
  4. 让一个元素水平垂直居中的方法
  5. 写给嵌入式方向的某些同学 - 基于WINCE系统的程序开发[不完整版]
  6. Soul Api 网关发布 1.0.3-RELEASE 版本
  7. go语言环境搭建及vim高亮设置
  8. Linux——虚拟机系统安装
  9. HttpClient发送请求时动态替换目标ip
  10. 云班课python测试答案_智慧职教云课堂APPPython程序设计题目答案
  11. Python 算法设计与分析 投资问题
  12. 动态和静态查看一个进程的内存使用
  13. 【2021CCF基线系统】基于飞桨实现系统认证风险预测-异常检测
  14. Mysql连接1045错误解决
  15. 大学生开放创新计算机实验,大学生创新性实验.PDF
  16. python爬虫美剧下载
  17. 算法基础:圣诞老人的礼物--贪心
  18. Plotly:最强Python可视化库,没有之一
  19. 美团2019校招后台开发题目总结
  20. 惠普HP LaserJet Pro M404dw 打印机驱动

热门文章

  1. RAC学习笔记(2)-DB2和Oracle体系结构
  2. 怎么在韩国VPS服务器与虚拟主机中进行选择?
  3. 随手记——老夫死活记不住定理
  4. hilink互联技术_华为负重前行,打出王炸HiLink技术,引爆国内生态链格局
  5. 计算机网络期末总复习——第二章 物理层
  6. 别以为Facebook只是互联网公司 他们还有一间黑科技实验室
  7. 深度解析用户画像标签体系构建方法
  8. dmz主机就是DNAT功能的体现
  9. 144Hz风冷旗舰:红魔5G游戏手机“比快更快”
  10. 1. R语言中grep函数和gsub()函数的使用