@pastqing
2023-07-28T11:47:33.000000Z
字数 1391
阅读 359
redis面试相关问题
面试
- redis基本介绍
- key-value内存数据库
- 各种数据结构: list, string, map, zset, ...
- 优点:
- 基于内存, 数据结构优化IO性能好
- 主从复制+哨兵实现高可用, hash实现分片, 提高性能
- redis为何快
- 基于内存
- 高效数据结构
- 高效数据编码
- 合理线程模型(IO多路复用)
- 缓存击穿: 热key过期+大量查
- 缓存穿透: 查肯定不存在的数据, 导致不命中缓存时查mysql造成的数据库压力
- 解决:
- 网关侧加各种参数校验
- 若查库为空, 给缓存加个空/默认值, 同时加TTL
- 布隆过滤器
- 缓存雪崩: 大批量数据过期, 且查询量巨大, 导致大量不命中缓存而直接查库
- 均匀设置ttl: 固定值+ 随机小值
- redis宕机导致(保证高可用)
- redis过期策略
- redis内存淘汰策略
- volatile-lru: 内存不够时, 从设置了ttl的key中按照最近最少使用(LRU)淘汰
- allkeys-lru: 内存不够时, 从所有key中使用LRU淘汰
- volatile-lfu: 内存不够时, 从设置ttl的key中使用LFU淘汰
- allkeys-lfu: 内存不够时, 从所有key中使用LFU淘汰
- volatile-random: 内存不够, 从设置ttl的key随机淘汰
- allkeys-random: 内存不够时, 从所有key中随机淘汰
- volatile-ttl: 内存不够, 从设置ttl的key中按照过期时间淘汰, 越早过期, 优先淘汰
- noeviction: 默认策略, 内存不够时, 写入报错
- redis应用场景
- redis持久化方式: RDB/AOF
- redis高可用方式: 主从/哨兵
- redis分布式锁实现方案
- redission实现原理
- redlock算法
- mysql/redis一致性问题
- redis事务机制
- 在生成rdb期间, redis可以处理写请求么
- redis底层的协议
- redis是否存在线程安全问题
- 为什么redis 集群的最大槽数是 16384 个
redis基本数据结构
- String: 二进制安全, 最大存储512M
内部数据结构实现:
Hash: hset/hget
- 内部数据结构:
- 说明:
- hgetall 量级大可能会阻塞redis, 建议使用hscan
- 只获取field 用hmget
List: 存有序字符串, 最多可存2^32 -1 个元素
- 内部数据结构:
- 说明:
- lpush + lpop = stack
- lpush + rpop = queue
- lpush + ltrim = capped collection
- lpush + brpop = mq(阻塞队列)
Set: 集合无序, sadd, smembers, sscan
- 内部数据结构: intset(整数集合)/hashtable
- 说明:
- smembers/lrange重, 量大阻塞redis, 建议使用sscan
- Zset: 集合有序, zadd/zrank
- 其他:
- Geo: 存位置, 且基于位置做计算
- HyperLogLog: 做基数统计的数据结构, 例如统计pv/uv
- Bitmaps: 位图