Redis面试题
Redis除了做缓存,还有哪些用法?
- String:分布式锁;计数器;
- hash: 中小型项目购物车;基于套餐,存放对应套餐的机器数据。
- list: 点赞功能,显示点赞的人;
- set: 小程序抽奖(随机抽取(是否剔除));共同关注的人;可能认识的人。
- zset: 排行榜
Redis做分布式锁的时候需要注意哪些问题?
- 考虑避免死锁和释放其它锁的场景。
- 设置锁和过期时间应该是原子性的。
- 业务代码没有执行完成的时候,锁过期了,对锁续期
- 释放锁的时候需要保证是锁是当前线程上的锁。
单点部署有什么问题?怎么解决?
单点故障
- 主从部署,哨兵模式
- 集群部署
简单介绍下RedLock? redisson的实现?
- 通过lua脚本保证设置锁和过期时间是原子操作。
- 看门狗,异步线程监控锁是否即将过期,而当前线程的锁还没有释放,主动对锁续期
- 使用redisson做分布式锁,释放锁前,判断lock.isLocked() && lock.isHeldByCurrentThread()
Redis默认内存是多少?在哪里查看?如何修改?
-
默认大小:如果不设置做大内存,或者设置为0,在64位操作系统下不限制内存大小,在32位操作系统小最多使用3GB.
-
通过命令,或者配置文件查看redis.conf。
-
修改 maxmemory 参数,字节类型单位,注意转换。
config get maxmemory #查看最大内存 config set maxmemory 1 #设置最大内存,单位字节
如果Redis内存打满了,会怎么样?
-
使用默认配置,同时设置maxmemory的选项,然后set value 测试(version:6.0.8),假如内存达到上限,并且key没有设置过期时间,数据写满会导致memory OOM
如果一个键是过期的,那它在过期时间之后会不会马上从内存中删除?
- 不会(参考内存过期淘汰策略)
Redis内存过期淘汰策略?
redis 过期键删除策略
-
定时删除:对CPU不友好,用处理器性能换取存储空间(拿时间换空间)
-
惰性删除: 对memory不友好,用存储空间换取处理器性能(拿空间换时间)
-
定期删除
内存淘汰策略
配置内存淘汰策略
一般生产上如何配置?
- 一般推荐Redis设置内存为最大物理内存的四分之三。(hashMap最大负载因子)
Redis的LRU算法简介。
LRU( least Recently Used)即最近最少使用,是一种常用的页面置换算法,选择最近最久未使用的数据予以淘汰。
-
基于jdk
public class LRUCache<K, V> extends LinkedHashMap<K, V> { private int capacity; public LRUCache(int capacity) { super(capacity, 0.75F, true); this.capacity = capacity; } @Override protected boolean removeEldestEntry(Map.Entry<K, V> eldest) { return super.size() > capacity; } public static void main(String[] args) { LRUCache<Object, Object> cache = new LRUCache<>(3); cache.put("1", "a"); cache.put("2", "b"); cache.put("3", "d"); System.out.println(cache.keySet()); cache.put("4", "d"); System.out.println(cache.keySet()); cache.put("3", "d"); System.out.println(cache.keySet()); cache.put("3", "d"); System.out.println(cache.keySet()); cache.get("2"); System.out.println(cache.keySet()); } }