爱代码

做一个最单纯的人 || 走一段最幸福的路

redis汇总

  2018-05-15 09:49     5

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的数量最多等于每秒写入数量的四分之一。


查看评论
发表评论
广告