您的位置:首页 > 数据库 > Redis

redis面试题汇总

2017-05-18 18:22 204 查看
1,skiplist插入和查询原理(来自360);
2,redis持久化方式(百度金融);
3,redis过期时间如何实现(来自58赶集);
memcached 和 redis 的set命令都有expire参数,可以设置key的过期时间。但是redis是一个可以对数据持久化的key-value database,它的key过期策略还是和memcached有所不同的。梳理,整理如下:
redis通过expire命令来设置key的过期时间。
语法:redis.expire(key, expiration)
4,压缩列表的原理(来自360);
5,秒杀是如何实现的(主要问题是别超卖了);
假设有m个产品, 有n台产品服务器接收请求,有x个请求路由服务器随机转发
1.直接给每台产品服务器分配 m/n个产品
2. 每台产品服务器内存做计数器, 比如允许m/n*(1+0.1)个人进来,

3.当内存计数器已满,
    3.1 后面进的人, 直接跳到到over静态页面,
    3.2 通知路由服务器, 不在路由到这台服务器(值得商榷)

4. 所有产品服务器进来的m/n*(1+0.1)个人 再全部转发到一台付款服务器上,进入付款环节, 看谁手快了,这时候人少, 用什么锁都无所谓

出队列阻塞就是消费者的处理速度跟不上生产者产生的任务,加消费者提高处理速度。
消费者加到极限还处理不过来,实在有爆内存的风险的时候,可以考虑将任务数据持久化,避免数据丢失,先把任务状态保存下来,根据具体业务做优化调整,等待异常问题解决之后再继续处理。使用支持持久化的队列消息,比如 rabbitmq。
对于大数据的队列不适合用 Redis 弄,考虑 HTTPSQS , RabbitMQ 之类的消息队列系统,或者 Kafka , Redis 队列适合小型,快速,消费也快的场景。
1. 监控队列, 动态调配 consumer, 适时增加 consumer。最简单有效的办法, 从根本上解决问题. 当然你得花钱加机器
2. 做好降级方案, 达到预设阀值, 出队后暂不处理, 直接先持久化再说;
3. consumer 投递异步任务, 不要阻塞出队列。
生产者调用 LPUSH 添加项到列表中。
消费者调用 RPOP 从列表提取 / 处理项。
然而有时候列表是空的,没有需要处理的, RPOP 就返回 NULL 。所以消费者被强制等待一段时间并重试 RPOP 命令。这称为轮询(polling),由于其具有一些缺点,所以不合适在这种情况下:

强制 Redis 和客户端处理无用的命令 (当列表为空时的所有请求都没有执行实际的工作,只会返回 NULL)。
由于工作者受到一个 NULL 后会等待一段时间,这会延迟对项的处理。

于是 Redis 实现了 BRPOP 和 BLPOP 两个命令,它们是当列表为空时 RPOP 和 LPOP 的会阻塞版本:仅当一个新元素被添加到列表时,或者到达了用户的指定超时时间,才返回给调用者。

redis如何清除过期keys:

redis有两种方式清除过期keys:主动方式,和被动方式。

1、主动方式:当client访问某一个key,redis会check key是否过期,如果已经过期,则被删除。

2、被动方式:不是所有的key都能被client访问。redis有一套默认的机制,redis每秒会进行10次以下动作:

a、随机从keys中挑选100个key,这100key是关联了过期时间的key。

b、删除已经过期的key。

c、如果删除的key超过25个,那么重复步骤a。

这是一个不是很严格的算法。不过可以基本保证过期的keys小于总数的25%。其实这是一种近似算法。随机选数,检查并删除。随机选key就保证了大致概率,结果只能是近似的。
这意味着:在任意时间点,那些占用内存并已经过期的keys的数量最多等于每秒写入数量的四分之一。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  redis