不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界一下。如果一个命令导致大量内存被使用,不用多久内存限制就会被内存使用量超越。
28、加锁机制
29、锁互斥机制
30、watch dog自动延期机制
31、可重入加锁机制
32、释放锁机制
33、上述Redis分布式锁的缺点
34、使用过 Redis 分布式锁吗?它是怎么实现的?
先用setnx来争抢锁,抢到后,再用expire给锁加一个过期时间防止锁忘记释放。
若在setnx之后执行expire之前进程以外crash或者重启维护会如何?
set 指令有非常复杂的参数,这个可以同时把setnx和expire合成一条指令来使用。
35、使用过 Redis 做异步队列吗?如何使用?什么缺点?
使用list结构作为队列,rpush生成消息,lpop消费消息。当lpop没有消息时,要适当sleep一会再重试。
缺点:
在消费者下线的情况下,生成的消息会丢失,得使用专业的消息队列如 rabbitmq等。
不能生产一次消费多次
使用pub/sub主题订阅者模式,可以实现1:N的消息队列。
36、什么是缓存穿透?如何避免?什么是缓存雪崩?如何避免?
缓存穿透:
一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。一些恶意的请求会故意查询不存在的key,请求量很大,就会对后端系统造成很大的压力。这就叫做缓存穿透。
缓存穿透避免:
1.对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该key对应的数据insert之后清理缓存。
2.对一定不存在的key进行过滤,可以把所有的可能存在的key放到一个大的Bitmap中,查询时通过该bitmap过滤。
缓存雪崩:
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大的压力。导致系统崩溃。
缓存雪崩避免:
1.缓存失效后,通过加锁或队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。
2.做二级缓存,A1为原始缓存,A2为拷贝缓存,A1失效时,可以访问A2,A1缓存失效时间设置为短期,A2设置为长期;
3.不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。
37、redis 和 memcached什么区别?为什么高并发下有时单线程的redis比多线程的memcached效率要高?
38、使用 redis 如何设计分布式锁?说一下实现思路?使用zk可否实现?两种方式有什么区别?
39、知道 redis 的持久化吗?底层是如何实现的?有什么优点缺点?
40、缓存穿透、缓存击穿、缓存雪崩解决方案?
41、在选择缓存时,什么时候选择 redis,什么时候选择memcached?
42、Redis常见的性能问题和解决方案?
43、Redis的数据淘汰策略有哪些?
44、Redis当中有哪些数据结构?
45、使用 Redis 做过异步队列吗?是如何实现的?
46、Redis 如何实现延时队列?