admin管理员组文章数量:1794759
面试必备Redis知识
📒博客首页:崇尚学技术的科班人 🍣今天给大家带来的文章是《面试必备Redis知识 -- Redis面试题(二)》🍣 🍣希望各位小伙伴们能够耐心的读完这篇文章🍣 🙏博主也在学习阶段,如若发现问题,请告知,非常感谢🙏 💗同时也非常感谢各位小伙伴们的支持💗
文章目录- 1、Redis 事务
- 2、如何实现分布式锁?
- ① 加锁
- ② 解锁
- 3、缓存穿透
- 4、缓存击穿
- 5、缓存雪崩
- 6、Redis 常见性能问题和解决方案
- 7、Redis 如何做内存优化?
- 8、如何保证 redis 中的数据都是热点数据?
- 9、Redis 中如何将指定模式的 key 查找出来?
👨💻:说一下你对 redis 事务的了解呗。
Redis 可以通过 MULTI,EXEC,DISCARD 和 WATCH 等命令来实现事务功能。
- 事务流程
你也可以通过 DISCARD 命令取消一个事务,它会清空事务队列中保存的所有命令。
WATCH 命令用于监听指定的键,当调用 EXEC 命令执行事务时,如果一个被 WATCH 命令监视的键被修改的话,整个事务都不会执行,直接返回失败。
Redis 是不支持 roll back 的,因而不满足原子性的(而且不满足持久性)。
2、如何实现分布式锁?👨💻:高并发下分布式系统中的数据线程安全怎么保障?
① 加锁 /** * 加锁 * @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; }- setIfAbsent:如果对应的 key 不存在的话,那么就进行相关设置,也就是加锁成功。同时我们设置进行的 value 是对应的 key 的过期时间。
- 过期时间的判断:如果对应的锁被相关的其它进程获取,我们还要判断对应的锁是否过期。如果过期的话,那么其它的线程就可以进行争抢。
- getAndSet:获取旧值设置新值,该操作是原子性的。
- oldValue.equals(oldValue):该判断尤其重要,因为我们此时是高并发状态下,那么就有可能出现对应的线程争抢情况,但是我们只能允许一个线程获取锁,那么我们就要对其进行 oldValue 的判断,如果是相同的话,那么就获取锁成功,否则就是被其它线程争抢过去了。
- 查询当前“锁”是否还是我们持有,因为存在过期时间,所以可能等你想解锁的时候,“锁”已经到期,然后被其他线程获取了,所以我们在解锁前需要先判断自己是否还持有“锁”
- 如果“锁”还是我们持有,则执行解锁操作,也就是删除该键值对,并返回成功;否则,直接返回失败。
👨💻:简要说一下缓存穿透现象和怎样应对 ?
- 描述:访问一个缓存和数据库都不存在的 key,此时请求会直接打到数据库上,并且数据库查不到数据,也没办法写入缓存,所以下一次请求同样会打到数据库上。
解决方案
👨💻:简要说一下缓存击穿现象和怎样应对 ?
- 描述:某一个热点 key,在缓存过期的一瞬间,同时有大量的请求打进来,由于此时缓存过期了,所以请求最终都会走到数据库,造成瞬时数据库请求量大、压力骤增,甚至可能打垮数据库。
解决方案
👨💻:简要说一下缓存雪崩现象和怎样应对 ?
- 描述:大量的热点 key 设置了相同的过期时间,导在缓存在同一时刻全部失效,造成瞬时数据库请求量大、压力骤增,引起雪崩,甚至导致数据库被打挂。
解决方案
👨💻:你了解redis 常见性能问题和解决方案吗?
👨💻:redis 如何做内存优化?
尽可能使用散列表,散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的 web 系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的 key,而是应该把这个用户的所有信存储到一张散列表里面。
8、如何保证 redis 中的数据都是热点数据?👨💻:MySQL 里有 2000w 数据,redis 中只存 20w 的数据,如何保证 redis 中的数据都是热点数据?
- Redis 提供 6 种数据淘汰策略:
- 4.0 版本后增加以下两种:
👨💻:假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?
- 使用 keys 指令可以扫出指定模式的 key 列表。
👨💻:如果这个 redis 正在给线上的业务提供服务,那使用 keys 指令会有什么问题?
版权声明:本文标题:面试必备Redis知识 内容由林淑君副主任自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.xiehuijuan.com/baike/1686563660a82346.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论