rdb

缓存面试题

馋奶兔 提交于 2020-10-26 04:29:02
项目中缓存是如何使用的?为什么要用缓存?缓存使用不当会造成什么后果? 如何使用 如何使用是回答用缓存来干嘛了。 回答点:缓存能用来干嘛,项目中的缓冲用来干嘛了。 缓存当然是用来缓冲存储层的数据的和计算后的结果。 在我们项目这使用了以上两种。 xxxx and xxxx 为什么使用 回答这个为什么使用的时候围绕两点:性能和高并发。 缓存了计算后的结果,节省了计算时间,那么自然性能就上来了。 缓存了存储层的数据,后续请求无需再次访问数据库,那么并发自然也就上来了。MySQL的QPS到2000已经是单机的瓶颈了,Redis单机的QPS上限在10w,并发提升50倍。 使用不当的后果,怎么避免 数据不一致问题:比如现在有一个写命令过来。 如果先操作缓存,再操作数据库。当操作完缓存后,OOM了。这个时候数据就不一致了。 数据库和缓存数据不一致 缓存雪崩问题:当缓存集体失效或者缓存服务器宕机时,那么大量的请求会打到存储层,就可能级联导致存储层雪崩。 缓存穿透问题:当出现大量的缓存miss,流量就会打到存储层,也可能引起存储层的崩溃 缓存击穿问题:当某个热点key过期时,也会有大流量打到存储层,也可能引起存储层的崩溃 三个问题 Redis 和 Memcached 有什么区别?Redis 的线程模型是什么?为什么 Redis 单线程却能支撑高并发? 这个问题其实是在问技术选型。

使用Redis——拳打南山敬老院,脚踩北斗幼儿园

你说的曾经没有我的故事 提交于 2020-10-24 14:35:09
拳打南山敬老院,脚踩北斗幼儿园 Redis 你说你用过对吧,你们怎么用的? 面试官您好 ,因为传统的关系型数据库如Mysql已经不能适用所有的场景了,比如秒杀的库存扣减,APP首页的访问流量高峰等等,都很容易把数据库打崩,所以引入了缓存中间件,目前市面上比较常用的缓存中间件有 Redis 和 Memcached 不过中和考虑了他们的优缺点,最后选择了Redis Redis有哪些数据结构? String 、 Hash 、 List 、 Set 、 SortedSet 。 当然为了加分,可以扯一下,用过 BloomFilter 布隆过滤器 这玩意的使用场景是真的多,而且用起来是真的香,原理也好理解 如果有大量的key需要设置同一时间过期,一般需要注意什么? 如果有大量的Key集中过期, Redis 可能会出现短暂的卡顿现象。严重的话会出现缓存雪崩,我们一般需要在时间上加一个随机值,使得过期时间分散一些。 那你使用过Redis分布式锁么,它是什么回事? 先拿 setnx 来争抢锁,抢到之后,再用 expire 给锁加一个过期时间防止锁忘记了释放 假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如何将它们全部找出来? 使用 keys 指令可以扫出指定模式的key列表 如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题?

作为程序员你不知道Redis持久化,如何通过面试?

早过忘川 提交于 2020-10-24 11:02:31
我们都知道Redis是个内存数据库,所有的数据都存储在内存中。一旦服务器上Redis进程退出,数据库中的数据就会丢失。 持久化是做什么事呢?持久化简单的理解就是将内存中的数据做个备份。Redis的持久化有两种方法,即RDB持久化和AOF持久化。 本文将会分两部分介绍这两种持久化方法,以及实现原理。 一、RDB持久化 Redis数据持久化是将内存中的数据保存到磁盘里,避免数据意外丢失。RDB持久化会生成一个RDB文件,这个RDB文件是一个经过压缩的二进制文件。通过该文件可以还原出Redis数据库中的数据。RDB的持久化可以手动执行,也可以根据服务器配置项定期自动执行。 下面我们一起学习一下RDB文件是怎么创建的。有两个命令可以创建RDB文件,一个是SAVE,另一个是BGSAVE。 执行SAVE命令会阻塞Redis服务器进程,直到RDB文件创建完成为止,在服务器进程被阻塞期间,服务器不能处理任何命令请求。 执行BGSAVE命令会派生出一个子进程,然后由子进程负责创建RDB文件,服务器父进程继续处理命令请求。 SAVE命令和BGSAVE命令的底层调用的函数都是同一个函数rdbSave,只不过SAVE命令是直接调用这个函数,而BGSAVE会fork()出子进程来调用这个函数。 伪代码如下: RDB文件的载入工作是在服务器启动时自动执行的,只要Redis服务器在启动时检测到RDB文件存在

redis 主从复制常见的一些坑 转

我们两清 提交于 2020-10-23 21:58:56
出处: redis主从复制常见的一些坑 读写分离的问题 1.数据复制的延迟   读写分离时,master会异步的将数据复制到slave,如果这是slave发生阻塞,则会延迟master数据的写命令,造成数据不一致的情况   解决方法:可以对slave的偏移量值进行监控,如果发现某台slave的偏移量有问题,则将数据读取操作切换到master,但本身这个监控开销比较高,所以关于这个问题,大部分的情况是可以直接使用而不去考虑的。 2.读到过期的数据   产生原因:   redis的从库是无法主动的删除已经过期的key的,所以如果做了读写分离,就很有可能在从库读到脏数据 例子重现: 主Redis setex test 20 1 + OK get test $ 1 1 ttl test : 18 从Redis get test $ 1 1 ttl test : 7 以上都没问题,然而过几秒再看从Redis ttl test : - 1 get test $ 1 1 test这个key已经过期了,然而还是可以获取到test的值。 在使用Redis做锁的时候,如果直接取读从库的值,这就有大问题了。 为什么从库不删除数据? redis删除过期数据有以下几个策略:   1.惰性删除:当读/写一个已经过期的key时,会触发惰性删除策略,直接删除掉这个过期key,很明显,这是被动的!   2.定期删除

凭这些资料登上Redis的顶峰:阿里核心笔记/实战/面试专题/脑图,与之共勉

最后都变了- 提交于 2020-10-23 15:55:37
作为同时具备高性能、高可靠和高可扩展性的典型键值数据库,Redis不仅功能强大,而且稳定,理所当然地成为了大型互联网公司的首选。 众多大厂在招聘的时候,不仅会要求面试者能简单地使用Redis,还要能深入地理解底层实现原理,并且具备解决常见问题的能力。可以说,熟练掌握Redis已经成为了技术人的一个必备技能。 但是,在学习和使用Redis的过程中,总不可避免地遇见一些棘手的问题,比如: Redis的key和数据结构应该怎么设计?有什么最佳实践? Redis集群如何均衡数据?又如何横向扩展? 怎么保证数据的一致性?热点数据的问题怎么解决? RDB持久化生成的数据快照,每次更新是全量更新还是增量更新? 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题怎么解决? 如何高效阅读Redis源代码? 为了更好的学习Redis,吃透Redis,为大家带来三份扎实的学习资料, Redis核心笔记,Redis实战、Redis面试专题以及X-mind版本的Redis学习脑图 …… 由于篇幅原因,资料只做部分展示,需要获取完整资料的朋友麻烦 点击直达 话不多说,来吧!展示! Redis核心笔记 一 Redis 介绍 二 Redis 单机版安装配置 三 Redis 客户端 四 Redis 数据类型 五 Redis 事务 六 Redis 实现分布式锁 七 Redis 持久化方案 八 Redis

5.docker学习笔记之入门,redis配置优化

一曲冷凌霜 提交于 2020-10-23 08:32:52
内存分配:vm.overcommit_memory Redis是内存操作,需要优先使用内存。设置overcommit 为1。是为了让 fork 操作能够在低内存下也执行成功。Linux 操作系统对大部分申请内存的请求都回复 yes,以便能运行更多的程序。因为申请内存后,并不会马上使用内存,这种技术叫做 overcommit。 vm.overcommit_memory 用来设置内存分配策略,有三个可选值 THP:Redis 在启动时可能会看到如下日志: WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.

吹爆!阿里内部疯传:“性能怪兽”Nginx+Redis高阶文档开源分享!

跟風遠走 提交于 2020-10-21 13:41:18
前言 在开源界, 高性能服务的典型代表就是Nginx和Redis 。纵观这两个软件的源码,都是非常简洁高效的,也都是基于异步网络IO机制的,所以对于要学习高性能服务的程序员或者爱好者来说,研究这两个网络服务的源码是非常有必要的。 Nginx目前市面上的书籍很多,但是Redis确实寥寥无几。这几年Redis已经发展到了5.0版本,这些特性暂时没有资料进行系统讲解。今天要与大家介绍的文档就弥补了这一空缺,可以帮助大家仁深入理解Redis内核实现机制的有效途径。下面我们来看看主要内容:(由于篇幅限制就只能以截图方式展示出来了,需要获取高清版PDF的朋友只需要点赞文章,关注我后文末有免费获取方式) 第一份:Redis源码解析 第1章引言 Redis简介 Redis 5.0的新特性 Redis源码概述 Redis安装与调试 第2章简单动态字符串 数据结构 基本操作 第3章跳跃表 简介 跳跃表节点与结构 基本操作 跳跃表的应用 第4章压缩列表 压缩列表的存储结构 结构体 基本操作 连续更新 第5章字典 基本概念 Redis字典的实现 基本操作 字典的遍历 API列表 第6章整数集合 数据存储 基本操作 第7章quicklist的实现 quicklist简介 数据存储 数据压缩 基本操作 第8章Stream Stream简介 Stream底层结构listpack的实现

Redis核心知识(一)

烂漫一生 提交于 2020-10-14 21:23:22
Redis起步 传统ACID 关系型数据库遵循ACID规则 事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性: 1、A ( Atomicity ) 原子性 原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。比如银行转账,从A账户转100元至B账户,分为两个步骤:1)从A账户取100元;2)存入100元至B账户。这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元。 2、C ( Consistency ) 一致性 一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。 3、I (Isolation) 独立性 所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。比如现有有个交易是从A账户转100元至B账户,在这个交易还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100元的 4、D (Durability) 持久性 持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。 Redis中的CAP C consistency

关于Redis,你扛得住这夺命连环11问吗?

假装没事ソ 提交于 2020-10-12 11:25:04
内存数据库Redis的相关知识,几乎是大厂的必考题,下面我总结了设计Redis的11道面试题: 说说Redis基本数据类型有哪些吧 字符串:redis没有直接使用C语言传统的字符串表示,而是自己实现的叫做简单动态字符串SDS的抽象类型。C语言的字符串不记录自身的长度信息,而SDS则保存了长度信息,这样将获取字符串长度的时间由O(N)降低到了O(1),同时可以避免缓冲区溢出和减少修改字符串长度时所需的内存重分配次数。 链表linkedlist:redis链表是一个双向无环链表结构,很多发布订阅、慢查询、监视器功能都是使用到了链表来实现,每个链表的节点由一个listNode结构来表示,每个节点都有指向前置节点和后置节点的指针,同时表头节点的前置和后置节点都指向NULL。 字典hashtable:用于保存键值对的抽象数据结构。redis使用hash表作为底层实现,每个字典带有两个hash表,供平时使用和rehash时使用,hash表使用链地址法来解决键冲突,被分配到同一个索引位置的多个键值对会形成一个单向链表,在对hash表进行扩容或者缩容的时候,为了服务的可用性,rehash的过程不是一次性完成的,而是渐进式的。 跳跃表skiplist:跳跃表是有序集合的底层实现之一,redis中在实现有序集合键和集群节点的内部结构中都是用到了跳跃表

搞懂这些Redis知识点,吊打面试官!

北城以北 提交于 2020-10-07 18:57:03
  “   今天,我不自量力的面试了某大厂的 Java 开发岗位,迎面走来一位风尘仆仆的中年男子,手里拿着屏幕还亮着的 Mac。      图片来自 Pexels   他冲着我礼貌的笑了笑,然后说了句“不好意思,让你久等了”,然后示意我坐下,说:“我们开始吧,看了你的简历,觉得你对 Redis 应该掌握的不错,我们今天就来讨论下 Redis……”。我想:“来就来,兵来将挡水来土掩”。   Redis 是什么    面试官: 你先来说下 Redis 是什么吧!    我: (这不就是总结下 Redis 的定义和特点嘛)Redis 是 C 语言开发的一个开源的(遵从 BSD 协议)高性能键值对(key-value)的内存数据库,可以用作数据库、缓存、消息中间件等。   它是一种 NoSQL(not-only sql,泛指非关系型数据库)的数据库。   我顿了一下,接着说,Redis 作为一个内存数据库:   性能优秀,数据在内存中,读写速度非常快,支持并发 10W QPS。   单进程单线程,是线程安全的,采用 IO 多路复用机制。   丰富的数据类型,支持字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)等。   支持数据持久化。   可以将内存中数据保存在磁盘中,重启时加载。   主从复制,哨兵,高可用。