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-lcu:在所有设置了过期时间的key中,最近一段时间最少使用的优先被淘汰
2、volatile-ttl:再所有设置了过期时间的key中,越接近过期时间的优先被淘汰
3、volatile-random:所有设置过期时间的key中,随机淘汰
4、allkeys-lcu:最近一段时间内,最少使用的优先被淘汰
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:客户端把数据写入缓存,缓存服务器异步的把数据更新到数据库