首页 > 数据库 >redis面试题

redis面试题

时间:2023-01-19 11:12:58浏览次数:46  
标签:面试题 缓存 过期 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等等,多去思考,举一反三。

原文链接:https://www.cnblogs.com/chenxiaomeng/p/16727793.html

标签:面试题,缓存,过期,redis,内存,key,数据
From: https://www.cnblogs.com/tester-star/p/17061186.html

相关文章

  • Redis之key的淘汰策略
    淘汰策略概述redis作为缓存使用时,在添加新数据的同时自动清理旧的数据。这种行为在开发者社区众所周知,也是流行的memcached系统的默认行为。redis中使用的LRU淘汰算法是......
  • 华为面试题之购物单解答
    原题如下:题目描述王强今天很开心,公司发给N元的年终奖。王强决定把年终奖用于购物,他把想买的物品分为两类:主件与附件,附件是从属于某个主件的,下表就是一些主件与附件的例子: ......
  • 浅谈Redisson底层源码
    Redisson源码分析​​一、加锁时使用lua表达式,执行添加key并设置过期时间​​​​二、加锁成功之后给锁添加对应的事件​​​​三、加锁完成,看门狗自动续命未处理完的线程​......
  • 浅谈三种使用Redis实现MQ的方式
    文章目录​​一、消息队列​​​​二、基于List的消息队列​​​​三、基于PubSub的消息队列​​​​四、基于Stream的消息队列​​​​1、基本命令​​​​2、简单使用​​......
  • 浅谈如何使用Redis实现分布式锁
    文章目录​​一、基础版(含自动释放锁)​​​​二、改良版(含过期时间)​​​​三、进阶版(含唯一性验证)​​​​四、单节点版(含Redisson)​​​​五、多节点版(含RedLock)​​写在......
  • 浅谈Redis底层数据结构(sdshdr-redisObject)
    最近看了点Redis底层的源码分析,特作此记录前提共识:Redis是一个默认为16个数据库的key-value内存数据库Redis底层是由C语言实现文章目录​​C语言源码流程​​​​1、server.......
  • 浅谈Redis基本数据类型底层编码(含C源码)
    文章目录​​一、String​​​​1、int​​​​2、embstr​​​​3、raw​​​​4、bitmap​​​​5、hyperloglog​​​​二、List​​​​1、ziplist​​​​2、quicklist......
  • 【Azure Redis 缓存】Azure Redis服务开启了SSL(6380端口), PHP如何访问缓存呢?
    问题描述使用6379端口连接AzureRedis服务,连接失败。因为默认情况下AzureRedis的设置没有打开6379的端口。需要使用SSL(6380端口)进行连接,但是遇见了无法连接的问题。使......
  • redis:value的的五种数据类型【reggie_take_out】
    有序集合经典应用:排行榜......
  • 剑指offer面试题21(java版):调整数组顺序使奇数位于偶数前面
    ​​welcometomyblog​​剑指offer面试题21(java版):调整数组顺序使奇数位于偶数前面题目描述输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位......