Redis面试注意
端口:6379
1,常用数据结构
string,hash,list,set,zset
2,缓存雪崩,击穿,穿透
雪崩:缓存中大量key同一时刻同时过期,或者Redis直接宕机,直接访问数据库
- 不同的key,设置不同的过期时间,让缓存失效的时间尽量均匀
- 二级缓存
击穿:大量用户同时访问一个缓存key,缓存过期失效了,直接访问数据库
1.设置key不过期
2.设置分布式锁
穿透:访问不存在的key,
1.对查询结果为空的情况也进行缓存,对不存在的key进行过滤
3,持久化方式
rdb:把数据持久化到磁盘中
aof:把执行过的指令记录下来,持久化到aof 文件
4,怎么保证缓存和数据库数据的一致性
1、淘汰缓存
复杂的数据结构缓存时,一般推荐选择淘汰缓存。
2、选择先删除缓存,再更新数据库(解决:延时双删策略)
先删除缓存,数据库还没有更新成功,此时如果读取缓存,缓存不存在,去数据库中读取到的是旧值,缓存不一致发生。
3、先更新数据库,再删除缓存(解决:监听binlog同步)
更新数据库成功,如果删除缓存失败或者还没有来得及删除,那么,其他线程从缓存中读取到的就是旧值,还是会发生不一致。
延时双删策略
为了避免更新数据库的时候,其他线程从缓存中读取不到数据,就在更新完数据库之后,再sleep一段时间,然后再次删除缓存
public void write(String key,Object data){ redisUtils.del(key); db.update(data); Thread.Sleep(100); redisUtils.del(key); }
5,实现分布式锁
1,setnx
2,Redission
6,过期键的删除策略
1,定时删除:在设置键的过期时间的同时,创建一个定时器 timer
2,惰性删除:每次获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键
3,定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键
redis实际使用的过期键删除策略是定期删除策略和****惰性删除策略****:
7,淘汰策略
1,noeviction(默认策略) :对于写请求不再提供服务,直接返回错误
2,allkeys-lru:从所有key中使用LRU算法进行淘汰(LRU算法:即最近最少使用算法)
3,volatile-lru:从设置了过期时间的key中使用LRU算法进行淘汰
4,allkeys-random:从所有key中随机淘汰数据
5,volatile-random:从设置了过期时间的key中随机淘汰
6,volatile-ttl:在设置了过期时间的key中,淘汰过期时间剩余最短的
8,使用redis记录上亿用户连续登录天数
二值操作判断的基本可以使用 BitMap ,三个参数(key,index,0/1)
常见业务有用户签到、打卡、统计活跃用户、统计用户在线状态、实现布隆过滤器
如签到功能:
key存用户id,
index偏移量为日期,
0或1
日夜颠倒头发少 ,单纯好骗恋爱脑 ,会背九九乘法表 ,下雨只会往家跑 ,搭讪只会说你好 ---- 2050781802@qq.com