1.redis有哪些基本数据类型?
整数、字符串、hash表、链表、跳表、压缩表
2.redis有哪些数据结构?
string、list、hash、set、zset除此之外还有HyperLogLog(大数据基数估算)、Geo(地理位置信息)和BloomFilter(布隆过滤器)
3.一个请求进来的时候,Redis 怎么找到对应的数据的?
请求会由一个socket监听接收,进入循环等待上一个socket执行完成,唤醒,在子线程中开始执行,获取到数据后,写入缓存,写入socket,关闭socket输出
4.单线程的redis为什么这么快?
(1)表结构为散列表,时间复杂度为O(1)
(2)存在内存中,不需要磁盘IO
(3)采用多路复用
5.redis持久化策略
RDB快照,AOF增量
RBD快照首先fork出一个子进程在后台拷贝一份快照,采用的方式是被动监听,一旦有数据变动,系统会执行COW(Copy on write)持久化到快照中,保证快照的实时更新
AOF增量:将操作步骤先经过逻辑处理后写入缓存中,等到一定容量或者到达1s中时,异步刷入AOF日志中,更安全
6.redis的过期策略以及内存淘汰机制
redis采用定期删除+惰性删除策略。
定期删除:redis每过100ms会抽样调取一部分数据检查是否过期,过期则删除。
惰性删除:每次获取key时,会再检查一遍是否过期,过期则删除。
如果长时间不调用,定期删除又没有检查出来,会导致内存占用不断变大,这时需要内存淘汰机制
(1)不淘汰:noeviction
(2)定期时间:volitale-random(随机)、volitale-ttl(过期时间)、volitale-lru(最近最少)、volitale-lfu(最小访问频率)
(3)所有:allkeys-random(随机)、allkeys-lru(最近最少)、allkeys-lfu(最小访问频率)
7.Redis 集群的时候怎么存放数据?我要扩容怎么办?
根据不同的业务场景有不同的路由算法存放数据:一致性hash算法、取模hash算法、区域hash算法
根据算法路由到对应的Node节点,再存放数据。
扩容时:如果是一致性hash算法直接添加节点,如果是取模或区域最好按倍扩容
8.手撕LRU算法
public class LRUCache extends LinkedHashMap {
private int capacity;
public LRUCache(int capacity){
//accessOrder设为true意为按照访问的顺序排序
super(16,0.75f,true);
this.capacity = capacity;
}
// 当前大小大于等于容量
@Override
protected boolean removeEldestEntry(Map.Entry eldest) {
return super.size()>=capacity;
}
}