自己实战整理面试题--Redis(带答案,不断更新)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/w372426096/article/details/84319476

Redis应用场景?

分布式锁:通过setnx/del命令来实现,不完美的是由于业务场景比较多,所以,有些瑕疵,比如:setnx/del命令是非原子性的,存在执行完setnx但是没有执行del的情况,导致锁无法释放,针对这种情况Redis的团队加入了一些参数特性,给锁加上过期时间,我的理解时间到了等于锁被释放了和del的命令作用一致,但是这个时间到底设置多久好呢?如果设置的比较短,锁过期了,业务还没执行完,同样会出现执行代码错乱的问题,于是针对这种业务场景的问题,想到了给value值加随机数的解决方案,谁加的锁,谁来解,不过问题又来了,判断value的值和del也不是原子性的,如果判断该解锁了,但是出现某种异常导致没有执行del,还是会存在解锁失败的问题,好像无解了!后面又有了使用lua脚本的方式的解决方案,再往后又提到了可重入锁的解决方案,多次获取同一把锁,延长一些加锁时间,然后在释放锁。

延时队列:list(列表) 数据结构常用来作为异步消息队列使用,使用rpush/lpush操作入队列,使用lpop 和 rpop来出队列。

问题:队列空了,队列延迟( zset(有序列表) 来实现),空闲连接自动断开,锁冲突处理

签到:位图bitmap, (setbit) 和获取 (getbit) 指定位的值都是单个位的,如果要一次操作多个位,就必须使用管道来处理,bitfield 有三个子指令,分别是 get/set/incrby,它们都可以对指定位片段进行读写,但是最多只能处理 64 个连续的位,如果超过 64 位,就得使用多个子指令,bitfield 可以一次执行多个子指令.

PV,UV统计:HyperLogLog(精度不高):两个指令 pfadd 和 pfcount,根据字面意义很好理解,一个是增加计数,一个是获取计数。pfadd 用法和 set 集合的 sadd 是一样的,来一个用户 ID,就将用户 ID 塞进去就是。pfcount 和 scard 用法是一样的,直接获取计数值。

pf 的内存占用为什么是 12k? Redis 的 HyperLogLog 实现中用到的是 16384 个桶,也就是 2^14,每个桶的 maxbits 需要 6 个 bits 来存储,最大可以表示 maxbits=63,于是总共占用内存就是2^14 * 6 / 8 = 12k字节。

推荐去重:布隆过滤器(有误差):二个基本指令,bf.add 添加元素,bf.exists 查询元素是否存在,它的用法和 set 集合的 sadd 和 sismember 差不多。注意 bf.add 只能一次添加一个元素,如果想要一次添加多个,就需要用到 bf.madd 指令。同样如果需要一次查询多个元素是否存在,就需要用到 bf.mexists 指令。

限流,控制流量,控制用户行为:滑动窗口zset;使用 pipeline 可以显著提升 Redis 存取效率

用incrby存在问题:假设现在有个接口, 限制5秒内只能访问10次, 在第一秒访问了, 然后设置过期时间, 然后在最后一秒内, 一下访问了8次, 但是下一秒就过期了, 过期之后又一下子来了8条记录, 这个时候就没有限流住了, 导致2秒内访问了16次接口。

UGC:漏斗限流Redis-Cell:

地图坐标: Geo,本质是zset,提供一些特殊的指令。针对附近的人、医院、银行、餐馆、公园、交通站等问题。

redis底层框架  模型
Redis为什么这么快?redis采用多线程会有哪些问题?
Redis支持哪几种数据结构;
Redis跳跃表的问题;
Redis单进程单线程的Redis如何能够高并发?
Redis如何使用Redis实现分布式锁?
Redis分布式锁操作的原子性,Redis内部是如何实现的?
用hashmap实现redis有什么问题(死锁,死循环,可用ConcurrentHashmap)

猜你喜欢

转载自blog.csdn.net/w372426096/article/details/84319476
今日推荐