博客首页:崇尚学技术的科班人
今天给大家带来的文章是《面试必备Redis知识 -- Redis面试题(二)》
希望各位小伙伴们能够耐心的读完这篇文章
博主也在学习阶段,如若发现问题,请告知,非常感谢
同时也非常感谢各位小伙伴们的支持
:说一下你对 redis 事务的了解呗。
Redis 可以通过 MULTI,EXEC,DISCARD 和 WATCH
等命令来实现事务功能。
你也可以通过 DISCARD
命令取消一个事务,它会清空事务队列中保存的所有命令。
WATCH
命令用于监听指定的键,当调用 EXEC
命令执行事务时,如果一个被 WATCH
命令监视的键被修改的话,整个事务都不会执行,直接返回失败。
Redis 是不支持 roll back 的,因而不满足原子性的(而且不满足持久性)。
:高并发下分布式系统中的数据线程安全怎么保障?
/**
* 加锁
* @param key
* @param value
* @return
*/
public boolean lock(String key,String value){
if(redisTemplate.opsForValue().setIfAbsent(key,value)){
// 加锁成功
return true;
}
// 如果锁过期
String currentValue = redisTemplate.opsForValue().get(key);
if(!StringUtils.isEmpty(currentValue) &&
Long.parseLong(currentValue) < System.currentTimeMillis()){
String oldValue = redisTemplate.opsForValue().getAndSet(key,value);
if(!StringUtils.isEmpty(oldValue) &&
oldValue.equals(oldValue)){
return true;
}
}
// 锁已经被其它线程获取
return false;
}
key
不存在的话,那么就进行相关设置,也就是加锁成功。同时我们设置进行的 value
是对应的 key
的过期时间。oldValue
的判断,如果是相同的话,那么就获取锁成功,否则就是被其它线程争抢过去了。 /**
* 解锁
* @param key
* @param value
*/
public void unlock(String key,String value){
try{
String currentValue = redisTemplate.opsForValue().get(key);
if(!StringUtils.isEmpty(currentValue) &&
currentValue.equals(value)){
redisTemplate.opsForValue().getOperations().delete(key);
}
}catch (Exception e){
log.error("【redis 分布式锁】 解锁异常,{}",e);
}
}
:简要说一下缓存穿透现象和怎样应对 ?
解决方案
:简要说一下缓存击穿现象和怎样应对 ?
解决方案
Redis 分布式锁
):简要说一下缓存雪崩现象和怎样应对 ?
解决方案
:你了解redis 常见性能问题和解决方案吗?
:redis 如何做内存优化?
尽可能使用散列表,散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的 web 系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的 key,而是应该把这个用户的所有信息存储到一张散列表里面
。
:MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?
volatile-lru
:从已设置过期时间的数据集中挑选最近最少使用的数据淘汰volatile-ttl
:从已设置过期时间的数据集中挑选将要过期的数据淘汰volatile-random
:从已设置过期时间的数据集中任意选择数据淘汰allkeys-lru
:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)allkeys-random
:从数据集中任意选择数据淘汰no-eviction
:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。这个应该没人使用吧!volatile-lfu
:从已设置过期时间的数据集中挑选最不经常使用的数据淘汰allkeys-lfu
:当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的 key:假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?
:如果这个 redis 正在给线上的业务提供服务,那使用 keys 指令会有什么问题?