程序员谈话系列——关于redis的一些理解(二)
一,redis的数据类型都有什么?
String hash list set sortedset HyperLogLog Pub/Sub
二,缓存雪崩,击穿,传统。
雪崩:一些热点数据都会做缓存,一般会同时进行定时任务刷新。如果key的失效时间时,大量的用户请求涌入会直接落到数据库上,数据库一般会报一下警,但很有可能没有反应就直接挂了。当然重启数据库也会直接被流量打死。比如如果打挂的是一个用户服务的库,那么依赖这个库的接口都会报错,如果不做熔断的话会瞬间挂到一片。
做法:
1,为了避免缓存雪崩,需要将key的过期时间后面加上随机值。
2,如果是集群部署,将热点数据均匀分配到不同的redis数据库中也可以防止全部失效。
3,设置热点数据永不过期。
穿透:大量的不存在的数据请求,会导致数据库压力大,击垮数据库。
做法:
1,参数校检
2,如果在缓存中也取不到,在数据库也找不到,可以将对应的key的value写成null,或者未知错误等等,有效时间可以设置短点,比如30秒。
3,Nginx层我记得也有配置项,可以让运维大大对单个IP访问次数超出一定范围的ip都拉黑。
4,使用布隆过滤器。
击穿:
1,热点数据永不过期
2,使用互斥锁
3,分布式锁
4,多级缓存
总结:
事前:主从加哨兵,避免全盘崩溃
事中:多级缓存+Hystrix限流+降级,避免MySQL被打死
事后:Redis持久化 恢复缓存数据。
三,分布式锁怎么使用?
Setnx加锁,expire释放锁,或者用set命令ex和nx加锁和解锁,这是原子性的。
四,如何在大量数据中找到很多前置的数据?
可以用keys指令扫出制定模式的key,但是会造成线程阻塞。可以用scan命令。
五,Redis做异步队列如何实现?
用List作为队列,rpush生产消息,lpop消费消息。当没有消息时需要sleep,如果不想sleep就可以用blpop消费消息,没有消息时阻塞直到消息的到来。使用pub/sub模式可以实现1:n的消息队列。但是在消费者下线时,生产消息会丢失,所以可以使用RocketMQ。
六,如何使用redis实现延时队列?
用sortedset存储数据,用时间戳作为score,消息内容作为key,调用zadd来生产消息,消费者可以用zrangebyscore获取N秒前的数据进行数据轮询处理。
七,redis如何实现持久化?
RDB和AOF保证了redis的持久化,重启的时候使用RDB重新构建内存,使用AOF重放近期操作来实现重启之前的状态。(append-only)
八,持久化的过程出现断电会怎么样?
AOF文件中有sync属性,高性能下可以设置一秒一次sync。
九,Pipeline好处?为什么使用?
将IO往返时间缩短为一次。前提是执行的指令没有因果相关性。
十,redis同步机制。
主从同步,第一次同步时,主节点bgsave,同时将后续修改操作记录到buffer中,完成后将RDB文件全量同步到复制节点,复制节点将其加载到内存,加载后通知主节点将修改记录同步到复制节点进行重放即可,后续增量可通过AOF日志同步即可。
十一,redis集群和集群高可用?
Redis cluster,主从读写分离,cluster支持N个master node,每个master可以挂载多个slave node。
Sentinal着眼于高可用,自动选取机制。
Slave的priority设置低,优先级越高。
同等情况下,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存放订单请求。