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