首页 > 数据库 >Redis面试题

Redis面试题

时间:2022-09-25 14:22:22浏览次数:50  
标签:面试题 缓存 过期 Redis redis 内存 key 数据

1. 项目中是否使用过redis? 为什么要使用redis?

使用过

之前使用的都是修改某个value值,如登录账号被锁定30分钟,查看还剩余的时间,或者想将账号由锁定状态更新为未锁定状态,删除该条记录或者修改剩余的倒计时间

或是:给登录账号设置一个验证码,可直接将手机号和验证码添加进去,用户即可使用该验证码登录,一般用于测试环境。

为什么要使用redis?

redis 是键值key-value数据库,因为redis数据库中的所有数据都存储在内存中,由于内存的读写速度于硬盘,因此redis在性能方面比其他基于硬盘存储的数据库有明显的优势。

  • 高性能
    假设下如果所有的数据都从数据库中读取,特别是是一些复杂的数据,每次都查询mysql性能必定非常差。所以对于一些复杂操作 耗时 查出来的结果且确定后面 不怎么变化 的数据放到缓存,能大幅提高系统响应

  • 高并发

          mysql单机一般只能支撑到2000Qps,而redis由于是K/V式的操作,单机可以支撑并发量几万到十几万

 

2. redis 有哪些类型?

  • string(字符串)

  • list(列表)

  • set(集合)

  • zset(sorted set - 有序集合)

  • Hash(哈希类型,md5加密出来的那个串)

实际项目中比较常用的是 string,hash,list

 

3. 讲讲redis的击穿、穿透、雪崩

缓存击穿 (热点数据)

定义:指一个key非常热点,在不停的扛着大并发,大并发集中对一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库。

解决办法:

设置key不过期。

缓存穿透(查询不存在的数据)

定义:指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,在对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。

解决办法:

缓存空对象,如果查询不到值,数据库返回一个null值给缓存,设置缓存过期时间。避免大量查询

缓存雪崩

定义:是指某一个时间段,大面积的缓存集中过期失效,打崩了DB。

解决办法:

1、把缓存的过期时间设置不同的时间。

2、缓存失效后,通过加锁或者队列来控制读取数据库写入缓存的线程数量。

3、数据预热,先把可能防伪你的数据预先访问一遍,这部分大量访问的数据加载到缓存中。

 

4. 为什么 Redis 需要把所有数据放到内存中?

Redis 为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以 Redis 具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘 I/O 速度为严重影响 Redis 的性能。在内存越来越便宜的今天,Redis 将会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。

 

5. 过期策略有哪些?

  • 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。

  • 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。

  • 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。
    (expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指向键空间中的某个键的指针,value是该键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。)

 

 

测试人员了解多一点准没错,测试过程中对使用的中间件 多去做一些了解,不要光会使用客户端去连接,开发让修改哪就只修改哪,学会自己思考,如果要你分析中间件的性能、如果测试过程中遇到问题,什么情况下会考虑是redis 的问题、如果误删除了redis中的数据,会有什么影响?为什么要字段的数据类型选择为hash等等,多去思考,举一反三。

标签:面试题,缓存,过期,Redis,redis,内存,key,数据
From: https://www.cnblogs.com/chenxiaomeng/p/16727793.html

相关文章

  • Redis 基本操作
    字符串(Strings)、哈希(hashes)、列表(lists)、集合(sets)、有序集合(sortedsets)......
  • MySQL和Redis的区别
    1.mysql和redis的数据库类型mysql是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据......
  • 55道软件测试精品面试题分享!内附答案!
    1、你的测试职业发展是什么?测试经验越多,测试能力越高。所以我的职业发展是需要时间积累的,一步步向着高级测试工程师奔去。而且我也有初步的职业规划,前3年积累测试经验,按......
  • 前端高频面试题及答案整理(一)
    diff算法是怎么运作每一种节点类型有自己的属性,也就是prop,每次进行diff的时候,react会先比较该节点类型,假如节点类型不一样,那么react会直接删除该节点,然后直接创建新的节......
  • Redis-----Redis高可用理论
    Redis虽然是一个非常好用的缓存数据库,但是同样也会面临在分布式环境中,单点故障等一些常见的问题,所以,可以通过一些方式去做到规避单点故障等一些的问题Redis可以沿用AKF的......
  • 深入理解Redis
         Redis在互联网架构存储系统中是使用最为广泛的中间件。基于内存实现了多中数据结构,通常被用作与内存数据库、缓存、消息队列和流引擎。Redis提供多种数据结构......
  • MySQL面试题
    MySql项目中使用的存储引擎5.0之前默认存储引擎为MyISAM引擎索引只有一种,被索引的字段值作为索引数据,叶子节点还包含该记录数据页地址不支持事务没有undolog......
  • docker 安装redis 并设置密码
    拉取镜像dockerpullredis运行容器并设置密码端口号dockerrun-d--namemyredis-p6379:6379redis--requirepass"123456" ......
  • C C++指针面试题零碎整理
    最基础的指针如下:inta;int*p=&a;答:p指向a的地址,&是取a的地址。*指的是指针中取内容的符号。2.str[]和str*的区别:charstr1[]="abc";charstr2[]="abc";c......
  • 面试题:int[] arr 和 int... arr在参数列表中是一回事儿吗?
    publicclassExer{publicstaticvoidmain(String[]args){Base1b1=newSub1();b1.add(1,2,3);}}classBase1{publicvoidadd(inta,int...arr){System.......