程序员谈话系列——关于redis的一些理解(二)

loviezhang 2020-03-24

一,redis的数据类型都有什么?

String hash list set sortedset HyperLogLog Pub/Sub

二,缓存雪崩,击穿,传统。

雪崩:一些热点数据都会做缓存,一般会同时进行定时任务刷新。如果key的失效时间时,大量的用户请求涌入会直接落到数据库上,数据库一般会报一下警,但很有可能没有反应就直接挂了。当然重启数据库也会直接被流量打死。比如如果打挂的是一个用户服务的库,那么依赖这个库的接口都会报错,如果不做熔断的话会瞬间挂到一片。

做法:

1,为了避免缓存雪崩,需要将key的过期时间后面加上随机值。

2,如果是集群部署,将热点数据均匀分配到不同的redis数据库中也可以防止全部失效。

3,设置热点数据永不过期。

穿透:大量的不存在的数据请求,会导致数据库压力大,击垮数据库。

做法:

1,参数校检

2,如果在缓存中也取不到,在数据库也找不到,可以将对应的keyvalue写成null,或者未知错误等等,有效时间可以设置短点,比如30秒。

3Nginx层我记得也有配置项,可以让运维大大对单个IP访问次数超出一定范围的ip都拉黑。

4,使用布隆过滤器。

击穿:

1,热点数据永不过期

2,使用互斥锁

3,分布式锁

4,多级缓存

总结:

事前:主从加哨兵,避免全盘崩溃

事中:多级缓存+Hystrix限流+降级,避免MySQL被打死

事后:Redis持久化 恢复缓存数据。

三,分布式锁怎么使用?

Setnx加锁,expire释放锁,或者用set命令exnx加锁和解锁,这是原子性的。

四,如何在大量数据中找到很多前置的数据?

可以用keys指令扫出制定模式的key,但是会造成线程阻塞。可以用scan命令。

五,Redis做异步队列如何实现?

List作为队列,rpush生产消息,lpop消费消息。当没有消息时需要sleep,如果不想sleep就可以用blpop消费消息,没有消息时阻塞直到消息的到来。使用pub/sub模式可以实现1n的消息队列。但是在消费者下线时,生产消息会丢失,所以可以使用RocketMQ

六,如何使用redis实现延时队列?

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

七,redis如何实现持久化?

RDBAOF保证了redis的持久化,重启的时候使用RDB重新构建内存,使用AOF重放近期操作来实现重启之前的状态。(append-only

八,持久化的过程出现断电会怎么样?

AOF文件中有sync属性,高性能下可以设置一秒一次sync

九,Pipeline好处?为什么使用?

IO往返时间缩短为一次。前提是执行的指令没有因果相关性。

十,redis同步机制。

主从同步,第一次同步时,主节点bgsave,同时将后续修改操作记录到buffer中,完成后将RDB文件全量同步到复制节点,复制节点将其加载到内存,加载后通知主节点将修改记录同步到复制节点进行重放即可,后续增量可通过AOF日志同步即可。

十一,redis集群和集群高可用?

Redis cluster,主从读写分离,cluster支持Nmaster node,每个master可以挂载多个slave node

Sentinal着眼于高可用,自动选取机制。

Slavepriority设置低,优先级越高。

同等情况下,slave复制的数据越多,优先级越高

相同条件下runid越小越容易被选中。

Cluster着眼于拓展性,在单个redis内存不足时,使用Cluster进行分片存储。

十二,redis为啥那么快呢?

1,单次可达100000+QPS,完全基于内存,绝大多数都是基于纯粹的内存操作。

2,数据结构简单,Redis数据结构专门进行设计的。

3,单线程,避免了上下文切换和竞争条件

4,多路I/O复用模型,非阻塞IO

5,Redis有自己的VM机制,一般系统调用系统函数会浪费时间去移动和请求。

十三,redis的内存淘汰机制?LRU代码?

Redis的过期策略有定期删除和惰性删除。

如果都没有,还有内存淘汰机制。

十四,数据类型用来干啥?

String 用来做缓存,计数器,共享用户session

List Lrange读取某个闭区间的元素,基于List实现分页查询。文章列表

Set集合。好友交集

Soreted Sets做有权重的队列。

十五,并发操作redis的数据问题有哪些?双写一致性?

脏读:可以去Zookeeper中获取分布式锁。

读写串行化,串行到一个内存队列当中。

十六,redis的线程模型

内部使用file event handler,采用IO多路复用机制同时监听多个Socket,根据Socket上的事件选择对应的事件处理器进行处理。

十七,秒杀系统的设计

1,为秒杀系统单开服务和数据库

2,URL动态化,用MD5加密算法加密随机字符串做url,前端代码获取url后台检验才能通过。

3,Redis部署集群。

4,Nginx布置负载均衡。

5,MQ存放订单请求。

相关推荐

DiamondTao / 0评论 2020-08-30