缓存预热这个应该是一个比较常见的概念,相信很多小伙伴都应该可以很容易的理解,缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!

解决思路:

直接写个缓存刷新页面,上线时手工操作下;

数据量不大,可以在项目启动的时候自动进行加载;

定时刷新缓存;

四、缓存更新

除了缓存服务器自带的缓存失效策略之外(Redis默认的有6中策略可供选择),我们还可以根据具体的业务需求进行自定义的缓存淘汰,常见的策略有两种:

定时去清理过期的缓存;

当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。

两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂!具体用哪种方案,大家可以根据自己的应用场景来权衡。

五、缓存降级

当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。

降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购物车、结算)。

以参考日志级别设置预案:

一般:比如有些服务偶尔因为网络抖动或者服务正在上线而超时,可以自动降级;

警告:有些服务在一段时间内成功率有波动(如在95~100%之间),可以自动降级或人工降级,并发送告警;

错误:比如可用率低于90%,或者数据库连接池被打爆了,或者访问量突然猛增到系统能承受的最大阀值,此时可以根据情况自动降级或者人工降级;

严重错误:比如因为特殊原因数据错误了,此时需要紧急人工降级。

服务降级的目的,是为了防止Redis服务故障,导致数据库跟着一起发生雪崩问题。因此,对于不重要的缓存数据,可以采取服务降级策略,例如一个比较常见的做法就是,Redis出现问题,不去数据库查询,而是直接返回默认值给用户。

热点数据和冷数据是什么

热点数据,缓存才有价值

对于冷数据而言,大部分数据可能还没有再次访问到就已经被挤出内存,不仅占用内存,而且价值不大。频繁修改的数据,看情况考虑使用缓存

对于上面两个例子,寿星列表、导航信息都存在一个特点,就是信息修改频率不高,读取通常非常高的场景。

对于热点数据,比如我们的某IM产品,生日祝福模块,当天的寿星列表,缓存以后可能读取数十万次。再举个例子,某导航产品,我们将导航信息,缓存以后可能读取数百万次。

数据更新前至少读取两次, 缓存才有意义。这个是最基本的策略,如果缓存还没有起作用就失效了,那就没有太大价值了。

那存不存在,修改频率很高,但是又不得不考虑缓存的场景呢?有!比如,这个读取接口对数据库的压力很大,但是又是热点数据,这个时候就需要考虑通过缓存手段,减少数据库的压力,比如我们的某助手产品的,点赞数,收藏数,分享数等是非常典型的热点数据,但是又不断变化,此时就需要将数据同步保存到Redis缓存,减少数据库压力。

[](()Memcache与Redis的区别都有哪些?


1)、存储方式 Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。Redis有部份存在硬盘上,redis可以持久化其数据

2)、数据支持类型 memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 ,提供list,set,zset,hash等数据结构的存储

3)、使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

4). value 值大小不同:Redis 最大可以达到 512M;memcache 只有 1mb。

5)redis的速度比memcached快很多

6)Redis支持数据的备份,即master-slave模式的数据备份。

[](()单线程的redis为什么这么快


  • (一)纯内存操作

  • (二)单线程操作,避免了频繁的上下文切换

  • (三)采用了非阻塞I/O多路复用机制

[](()redis的数据类型,以及每种数据类型的使用场景


回答:一共五种

  • (一)String

这个其实没啥好说的,最常规的set/get操作,value可以是String也可以是数字。一般做一些复杂的计数功能的缓存。

  • (二)hash

这里value存放的是结构化的对象,比较方便的就是操作其中的某个字段。博主在做单点登录的时候,就是用这种数据结构存储用户信息,以cookieId作为key,设置30分钟为缓存过期时间,能很好的模拟出类似session的效果。

  • (三)list

使用List的数据结构,可以做简单的消息队列的功能。另外还有一个就是,可以利用lrange命令,做基于redis的分页功能,性能极佳,用户体验好。本人还用一个场景,很合适—取行情信息。就也是个生产者和消费者的场景。LIST可以很好的完成排队,先进先出的原则。

  • (四)set

因为set堆放的是一堆不重复值的集合。所以可以做全局去重的功能。为什么不用JVM自带的Set进行去重?因为我们的系统一般都是集群部署,使用JVM自带的Set,比较麻烦,难道为了一个做一个全局去重,再起一个公共服务,太麻烦了。

另外,就是利用交集、并集、差集等操作,可以计算共同喜好,全部的喜好,自己独有的喜好等功能。

  • (五)sorted set

sorted set多了一个权重参数score,集合中的元素能够按score进行排列。可以做排行榜应用,取TOP N操作。

[](()Redis 内部结构


  • dict 本质上是为了解决算法中的查找问题(Searching)是一个用于维护key和value映射关系的数据结构,与很多语言中的Map或dictionary类似。本质上是为了解决算法中的查找问题(Searching)

  • sds sds就等同于char * 它可以存储任意二进制数据,不能像C语言字符串那样以字符’\0’来标识字符串的结 束,因此它必然有个长度字段。

  • skiplist (跳跃表) 跳表是一种实现起来很简单,单层多指针的链表,它查找效率很高,堪比优化过的二叉平衡树,且比平衡树的实现,

quicklist

  • ziplist 压缩表 ziplist是一个编码后的列表,是由一系列特殊编码的连续内存块组成的顺序型数据结构,

[](()redis的过期策略以及内存淘汰机制


redis采用的是定期删除+惰性删除策略。

[](()为什么不用定时删除策略?

定时删除,用一个定时器来负责监视key,过期则自动删除。虽然内存及时释放,但是十分消耗CPU资源。在大并发请求下,CPU要将时间应用在处理请求,而不是删除key,因此没有采用这一策略.

[](()定期删除+惰性删除是如何工作的呢?

定期删除,redis默认每个100ms检查,是否有过期的key,有过期key则删除。需要说明的是,redis不是每个100ms将所有的key检查一次,而是随机抽取进行检查(如果每隔100ms,全部key进行检查,redis岂不是卡死)。因此,如果只采用定期删除策略,会导致很多key到时间没有删除。

于是,惰性删除派上用场。也就是说在你获取某个key的时候,redis会检查一下,这个key如果设置了过期时间那么是否过期了?如果过期了此时就会删除。

[](()采用定期删除+惰性删除就没其他问题了么?

不是的,如果定期删除没删除key。然后你也没即时去请求key,也就是说惰性删除也没生效。这样,redis的内存会越来越高。那么就应该采用内存淘汰机制。

在redis.conf中有一行配置

maxmemory-policy volatile-lru1

该配置就是配内存淘汰策略的(什么,你没配过?好好反省一下自己)

  • volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

  • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

  • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

  • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

  • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

  • no-enviction(驱逐):禁止驱逐数据,新写入操作会报错

  • ps:如果没有设置 expire 的key, 不满足先决条件(prerequisites); 那么 volatile-lru, volatile-random 和 volatile-ttl 策略的行为, 和 noeviction(不删除) 基本上一致。

[](()Redis 为什么是单线程的


官方FAQ表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。

既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了(毕竟采用多线程会有很多麻烦!)Redis利用队列技术将并发访问变为串行访问

  • 1)绝大部分请求是纯粹的内存操作(非常快速)

  • 2)采用单线程,避免了不必要的上下文切换和竞争条件

  • 3)非阻塞IO优点:

  • 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

  • 支持丰富数据类型,支持string,list,set,sorted set,hash

  • 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

  • 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除如何解决redis的并发竞争key问题

同时有多个子系统去set一个key。这个时候要注意什么呢?

不推荐使用redis的事务机制。因为我们的生产环境,基本都是redis集群环境,做了数据分片操作。你一个事务中有涉及到多个key操作的时候,这多个key不一定都存储在同一个redis-server上。因此,redis的事务机制,十分鸡肋。

如果对这个key操作,不要求顺序:准备一个分布式锁,大家去抢锁,抢到锁就做set操作即可

如果对这个key操作,要求顺序:分布式锁+时间戳。假设这会系统B先抢到锁,将key1设置为{valueB 3:05}。接下来系统A抢到锁,发现自己的valueA的时间戳早于缓存中的时间戳,那就不做set操作了。以此类推。

利用队列,将set方法变成串行访问也可以redis遇到高并发,如果保证读写key的一致性

对redis的操作都是具有原子性的,是线程安全的操作,你不用考虑并发问题,redis内部已经帮你处理好并发的问题了。

[](()Redis 集群方案应该怎么做?都有哪些方案?


1.twemproxy,大概概念是,它类似于一个代理方式, 使用时在本需要连接 redis 的地方改为连接 twemproxy, 它会以一个代理的身份接收请求并使用一致性 hash 算法,将请求转接到具体 redis,将结果再返回 twemproxy。

缺点:twemproxy 自身单端口实例的压力,使用一致性 hash 后,对 redis 节点数量改变时候的计算值的改变,数据无法自动移动到新的节点。

2.codis,目前用的最多的集群方案,基本和 twemproxy 一致的效果,但它支持在 节点数量改变情况下,旧节点数据可恢复到新 hash 节点

3.redis cluster3.0 自带的集群,特点在于他的分布式算法不是一致性 hash,而是 hash 槽的概念,以及自身支持节点设置从节点。具体看官方文档介绍。

[](()有没有尝试进行多机redis 的部署?如何保证数据一致的?


主从复制,读写分离

一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。

[](()对于大量的请求怎么样处理


redis是一个单线程程序,也就说同一时刻它只能处理一个客户端请求;

redis是通过IO多路复用(select,epoll, kqueue,依据不同的平台,采取不同的实现)来处理多个客户端请求的

[](()Redis 常见性能问题和解决方案?


  • (1) Master 最好不要做任何持久化工作,如 RDB 内存快照和 AOF 日志文件

  • (2) 如果数据比较重要,某个 Slave 开启 AOF 备份数据,策略设置为每秒同步一次

  • (3) 为了主从复制的速度和连接的稳定性, Master 和 Slave 最好在同一个局域网内

  • (4) 尽量避免在压力很大的主库上增加从库

  • (5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <-

Slave3…

[](()讲解下Redis线程模型


总结一波腾讯,阿里,字节跳动问的 Redis 面试题相关推荐

  1. 总结一波腾讯,阿里,字节跳动问的 Redis 面试题,收藏起来。

    最近去面了腾讯,阿里,字节跳动,发现对redis会重点考察,于是我打算总结redis专项.相关的面试题如下: Redis 持久化机制 缓存雪崩.缓存穿透.缓存预热.缓存更新.缓存降级等问题 热点数据和 ...

  2. 阿里转衰!百度没落!字节跳动崛起!未来的互联网是腾讯和字节跳动的世界!这样的言论你相信吗?...

    最近有位网友发帖扬言"三五年后阿里会像百度一样没落,未来互联网的竞争会将发生在腾讯与字节跳动之间".短短一段话把互联网三巨头和新贵未来的命运都囊括进去,还呼吁同意的网友" ...

  3. 什么是互联网大厂_2020阿里、腾讯、字节跳动等14家互联网大厂薪资水平大汇总...

    联网大厂已经成为求职者的"必争之地". 无论是从薪资待遇.发展机会,还是从平台资源.技术实力来看,互联网大厂都是不错的选择. 当然,不同的企业薪资水平还是存在一定的差距,对应的要求 ...

  4. 揭秘阿里、腾讯、字节跳动在家办公的区别

    这几天,互联网精英们已经开始在家远程办公了.作为国内互联网三家大厂,阿里.腾讯.字节跳动在家办公有什么区别呢?一起来看-- 返岗时间 阿里:2月3日-7日在家办公,原本计划10日返岗可能会推迟到17日 ...

  5. 太牛了!我把阿里、腾讯、字节跳动、美团等Android性能优化实战整合成了一个PDF文档

    安卓开发大军浩浩荡荡,经过近十年的发展,Android技术优化日异月新,如今Android 11.0 已经发布,Android系统性能也已经非常流畅,可以在体验上完全媲美iOS. 但是,到了各大厂商手 ...

  6. 微信淘宝等平台要互通!?腾讯阿里字节回应

    9 月13日,国新办举行了一场主题为"推进制造强国网络强国建设,助力全面建成小康社会"的新闻发布会,会上,工信部回应了关于屏蔽网址链接整治情况等热点问题. 工信部称网址的屏蔽链接是 ...

  7. 我凭借这份999页Java面试pdf!拿下了美团、蚂蚁金服、腾讯、字节跳动offer

    前言 事情是这样的,2020年9月份,在某个大博主那里拿到一份Java面试宝典,然后就一直躺在盘里吃灰,直到11月份的时候,有了要跳槽的计划和打算,就想着要刷刷面试题,所以就把这套"积灰&q ...

  8. 腾讯与字节跳动罕见“合作”:企业微信在抖音投放广告

    字节跳动和腾讯在互联网话语权方面的争夺对抗由来已久,前有字节起诉腾讯垄断,利用微信.QQ限制用户分享来自抖音的内容,后有腾讯起诉字节旗下主播未经授权直播王者荣耀.有媒体统计过,仅在2018年,字节跳动 ...

  9. 华为已捐献 HarmonyOS 全部基础能力;腾讯、字节跳动隔空互怼;人人视频从App Store下架整改|极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

最新文章

  1. hql删除mysql语句_mysql-使用Hibernate @SQLDelete对所有实体进行软删除
  2. 纵深防御仍对付得了当今的网络威胁吗?
  3. 并发和并行的区别_多核、多处理器、并发、并行、超线程概念总结
  4. EdgeGallery — MEP — 安装部署
  5. linux主设备编号从0到多少,Linux驱动开发之主设备号找驱动,次设备号找设备
  6. mysql连接数设置操作(Too many connections)及设置md5值的加密密码
  7. 全球及中国LCP行业应用项目布局及产能规模预测报告2021版
  8. java-pdf转word,java开发面试笔试题
  9. MyBatis的优化
  10. JS助记 ----- 正则表达式
  11. mysql+enable+sql+log_MySQL -- redolog + binlog
  12. RetinaFace+ArcFace人脸识别测试
  13. 点击上下左右按钮让背景上下左右移动
  14. 用手机怎么看服务器里的文件,手机查看云服务器文件
  15. 华中科技大学计算机叶磊,叶磊-华中科技大学公共卫生学院
  16. android 人脸识别边框_android自定义Arcface人脸识别框/人脸抓拍框/人脸追踪框
  17. 计算机需要记笔记,如何优雅地用电脑记笔记
  18. win7计算机管理找不到文件夹,win7系统中电脑文件夹选项不见了的具体解决方法...
  19. 优酷通过世界杯,让所有人知道:优酷真的优,真的酷!
  20. CentOS 7 不显示ip

热门文章

  1. 灌装机的灌装结构设计及仿真(lunwen+任务书+开题+文综+翻译及原文+答辩PPT+cad图纸+UG模型及运动仿真)
  2. asterisk voicemail配置
  3. align的对齐方式
  4. 5G+MEC助力,南瑞信通九州云联合打造智能电网5G实验室
  5. 搜索行为和关键词分析(二):用户也会犯错(转)
  6. 微信小程序实现音乐播放器(4)(使用pubsubjs实现页面间通信)
  7. vim中文教程-来自官方文档
  8. 百度世界大会2021: 与时代共振,AI让生活更好
  9. 深耕细作Or产品矩阵——成熟期篇
  10. Java并发——AQS、AQS到底什么是AQS?这玩意干啥的?