1.对Redis理解,使用什么场景?你用它干什么?解决什么问题?
就是一个远程的缓存,利用内存来用空间换取时间,当然对比本地缓存的优势当然是能分布式下共享数据。
用它来存储一些热点数据。解决了查询效率。
2.redis基础数据类型,底层如何实现?跳表?为什么单线程快?哪些可能会导致Redis慢,哪些命令会慢?
主要回答Redis慢(其实可以通过慢查询日志分析):
1.大key导致,数据结构不规范导致,分配时间很慢。
2.Redis查询命令不规范,扫描很多O(n),或者大量key失效导致,请求后都在被动淘汰。
3.持久化导致,fork阻塞,AOF刷盘阻塞(always机制导致每次写入都刷盘)
4.内存交换导致
==> 可以通过以下查看是否内存交换
>redis-cli -p 6383 info server | grep process_id # 查询 redis 进程号
>cat /proc/4476/smaps | grep Swap # 查询内存交换大小
Swap: 0 kB
Swap: 4 kB
Swap: 0 kB
Swap: 0 kB
有很多方法可以避免内存交换的发生。比如说:
- 保证机器充足的可用内存
- 确保所有Redis实例设置最大可用内存(maxmemory),防止极端情况下 Redis 内存不可控的增长。
- 降低系统使用swap优先级,如
echo10>/proc/sys/vm/swappiness
3.redis淘汰策略,主从,集群,高可用如何实现
Redis存在主动淘汰和被动淘汰的策略,一些情况下是主动和被动都是清理一些过期了的key,当然内存不够的时候,根据某些内存淘汰策略,会主动淘汰一些不设置过期时间的key。
被动淘汰策略:就是再次请求到该key的时候,发现已经过期了,那么再删去该key,返回null;
主动淘汰策略大概有:
1.LRU所有key
2.随机所有key
3.LRU设置过期时间key
4.随机设置过期时间key
5.不删,后续增加数据不允许。
Redis主从:
以前的版本还需要哨兵机制来监控,现在就主备切换即可。主从同步分全量和增量。PSYNC id offset这个指令比较重要,
1.redis分布式锁怎么实现的?可靠吗?有什么问题?redlock能解决吗?为什么?怎么优化?为什么用redis做?
4.Redis是怎么处理请求的?单机的qps是多少?如果一直get,你觉得限制点在哪?如何突破峰值qps?