您的位置:首页 > 数据库 > Redis

Redis面试

2020-03-18 07:20 316 查看

1、什么是redis?

redis是一种面向内存的key-value数据库,储存string,list,set,z-set(有序set类型)的数据

2、mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?

1、计算出20w数据所需要的内存大小,修改redis的配置文件,设置redis的最大可用内存

2、设置redis的内存淘汰策略为allkeys-lcu或者volatile-lcu

3、redis内存淘汰策略?

1、volatile-lru:在所有设置了过期时间的key中,最近一段时间最少使用的优先被淘汰

2、volatile-ttl:再所有设置了过期时间的key中,越接近过期时间的优先被淘汰

3、volatile-random:所有设置过期时间的key中,随机淘汰

4、allkeys-lru:最近一段时间内,最少使用的优先被淘汰

5、allkeys-random:随机淘汰

6、noeviction(禁止驱逐):超过最大可用内存就报错

4、redis过期处理策略?

redis是单线程的,redis收割是需要花费时间的,所以收割的次数过多会影响缓存效率,所以redis采用定期清理和惰性清理相结合的策略。

1、定期清理

redis中所有设置过期时间的key都储存再hash中,所以redis每秒只用扫描hash而不用扫描整个应用。主要分为

1、redis从设置过期时间的key中随机抽取一定数量的key,

2、将抽取的key中已经过期的数据进行清除

3、如果过期的key占比超过1/4,则重复第一步的操作

如果多个数据设置一样的过期时间,在某一时刻操作这些数据时,从缓存中查不到,就只能去操作数据库,此时缓存就不能起到作用,这就是缓存雪崩。

2、惰性清理

客户端访问redis时,如果操作的是过时的数据,就清理,否则就不清理。

当定情清理和惰性清理还是没能把数据清理干净时,此时就会用到内存淘汰策略

5、缓存穿透?

客户端访问的key不存在时,此时在缓存中差不到,就只能去数据库查找,当下一次又请求这个key时重复同样的操作。此时,缓存是没有起到作用的,数据库查找也比较耗时,这个就是缓存穿透。

处理:

1、服务端使用拦截器控制客户端请求,让不存在的key不访问数据库

2、当访问的key不存在时,可以将此key对应的值存入空对象放入到缓存中,给此key一个较短的过期时间

6、缓存失效策略?

1、FIFO:先进先失效

2、LRU:最近一段时间间隔内,最少使用的先失效

3、LFU:一直以来最少使用的优先使用,此时,每个key给一个hit属性,hit属性小的优先失效

7、缓存更新策略

Cache aside、Read Through、Write Through、Write Behind Cache Patten

Cache aside:读:客户端首先读取缓存中的数据,不存在在读取数据库数据,客户端自己把数据库数据更新到缓存

写:客户端把数据写到数据库,然后再去更新缓存

Read through:客户端读取数据时,如果缓存没有,就读取数据库,同时缓存服务把数据更新到缓存。

Write through:客户端把数据写入缓存,缓存服务器同步的把数据更新到数据库

Write Bethind Cache Patten:客户端把数据写入缓存,缓存服务器异步的把数据更新到数据库
  • 点赞
  • 收藏
  • 分享
  • 文章举报
孤傲的小白狼 发布了2 篇原创文章 · 获赞 0 · 访问量 42 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: