EnjoyCodeの博客

花若盛开,蝴蝶自来,你若精彩,天自安排,我的头条号:http://suo.im/2qOG5t,欢迎关注!!!...

Redis基础(一)(总结一下)

我的头条号,欢迎关注与我交流哦:https://www.toutiao.com/c/user/54449368910/#mid=1591720133858307

我的公众号:

使用过Redis做异步队列么,你是怎么用的? 

一般使用list结构作为队列,rpush生产消息,lpop消费消息。当lpop没有消息的时候,要适当sleep一会再重试。 

如果对方追问可不可以不用sleep呢?list还有个指令叫blpop,在没有消息的时候,它会阻塞住直到消息到来。 

如果对方追问能不能生产一次消费多次呢?使用pub/sub主题订阅者模式,可以实现1:N的消息队列。 

如果对方追问pub/sub有什么缺点?

在消费者下线的情况下,生产的消息会丢失,得使用专业的消息队列如rabbitmq等。 

如果对方追问redis如何实现延时队列?

使用sortedset,拿时间戳作为score,消息内容作为key调用zadd来生产消息,消费者用zrangebyscore指令获取N秒之前的数据轮询进行处理。 

使用过Redis分布式锁么,它是什么回事?

SETNX 可以直接加锁操作,比如说对某个关键词foo加锁,客户端可以尝试

SETNX foo.lock <current unix time>

如果返回1,表示客户端已经获取锁,可以往下操作,操作完成后,通过

DEL foo.lock

命令来释放锁。

如果返回0,说明foo已经被其他客户端上锁,如果锁是非堵塞的,可以选择返回调用。如果是堵塞调用调用,就需要进入以下个重试循环,直至成功获得锁或者重试超时。理想是美好的,现实是残酷的。仅仅使用SETNX加锁带有竞争条件的,在某些特定的情况会造成死锁错误。

处理死锁:

在上面的处理方式中,如果获取锁的客户端端执行时间过长,进程被kill掉,或者因为其他异常崩溃,导致无法释放锁,就会造成死锁。所以,需要对加锁要做时效性检测。因此,我们在加锁时,把当前时间戳作为value存入此锁中,通过当前时间戳和Redis中的时间戳进行对比,如果超过一定差值,认为锁已经时效,防止锁无限期的锁下去,但是,在大并发情况,如果同时检测锁失效,并简单粗暴的删除死锁,再通过SETNX上锁,可能会导致竞争条件的产生,即多个客户端同时获取锁。

Redis主从复制原理:http://toutiao.com/item/6539003632400990734/

假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来? 
使用keys指令可以扫出指定模式的key列表。 
对方接着追问:如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题? 
这时你要回答redis关键的一个特性:redis的单线程的。keys指令会导致线程阻塞一段时间,线上服务会停顿,直到指令执行完毕,服务才能恢复。这个时候可以使用scan指令,scan指令可以无阻塞的提取出指定模式的key列表,但是会有一定的重复概率,客户端做一次去重就可以了,但是整体所花费的时间会比直接用keys指令长

阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_35508033/article/details/79964448
文章标签: Redis
个人分类: 数据库
上一篇网络基础(总结一下)(一)
下一篇透析下2PC/3PC
想对作者说点什么? 我来说一句

redis基础总结

redis

lihang_1994 lihang_1994

2017-07-04 20:06:59

阅读数:1223

redis安装指南

2014年11月26日 242KB 下载

没有更多推荐了,返回首页

关闭
关闭