-
Redis有哪些数据结构?
-
使用过Redis分布式锁么,它是什么回事?
-
假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来?
-
如果这个redis正在给线上的业务提供服务,那使用keys指令会有什么问题?
-
使用过Redis做异步队列么,你是怎么用的?
-
如果对方追问redis如何实现延时队列?
-
如果有大量的key需要设置同一时间过期,一般需要注意什么
-
Redis如何做持久化的?
-
Pipeline有什么好处,为什么要用pipeline?
-
Redis的同步机制了解么?
-
是否使用过Redis集群,集群的原理是什么?
-
使用redis有哪些好处?
-
redis相比memcached有哪些优势?
-
Memcache与Redis的区别都有哪些?
-
redis常见性能问题和解决方案:
-
为什么redis需要把所有数据放到内存中?
-
Redis是单进程单线程的
-
redis的并发竞争问题如何解决?
-
redis事物的了解CAS(check-and-set 操作实现乐观锁 )?
-
redis持久化的几种方式
-
redis 最适合的场景
一、Redis有哪些数据结构?
1
2
字符串String、字典Hash、列表List、集合Set、有序集合SortedSet。
如果你是Redis中高级用户,还需要加上下面几种数据结构HyperLogLog、Geo、Pub/Sub。
二、使用过Redis分布式锁么,它是什么回事?
先拿setnx来争抢锁,抢到之后,再用expire给锁加一个过期时间防止锁忘记了释放。
这时候对方会告诉你说你回答得不错,然后接着问如果在setnx之后执行expire之前进程意外crash或者要重启维护了,那会怎么样?
这时候你要给予惊讶的反馈:唉,是喔,这个锁就永远得不到释放了。紧接着你需要抓一抓自己得脑袋,故作思考片刻,好像接下来的结果是你主动思考出来的,然后回答:我记得set指令有非常复杂的参数,这个应该是可以同时把setnx和expire合成一条指令来用的!对方这时会显露笑容,心里开始默念:摁,这小子还不错。
jedis.set(String key, String value, String nx, String expx, int time),这个set()方法一共有五个形参:
1
2
3
4
5
第一个为key,我们使用key来当锁,因为key是唯一的。
第二个为value,我们传的是requestId,很多童鞋可能不明白,有key作为锁不就够了吗,为什么还要用到value?
原因就是我们在上面讲到可靠性时,分布式锁要满足第四个条件解铃还须系铃人,通过给value赋值为requestId,我们就知道这把锁是哪个请求加的了,在解锁的时候就可以有依据。
requestId可以使用UUID.randomUUID().toString()方法生成。
第三个为nx,这个参数我们填的是NX,意思是SET IF NOT EXIST,即当key不存在时,我们进行set操作;若key已经存在,则不做任何操作;
第四个为expx,这个参数我们传的是PX,意思是我们要给这个key加一个过期的设置,具体时间由第五个参数决定。
第五个为time,与第四个参数相呼应,代表key的过期时间。
三、假如Redis里面有1亿个key,其中有10w个key是以某个固定的已知的前缀开头的,如果将它们全部找出来