程序员谈话系列——关于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存放订单请求。

原文地址:https://www.cnblogs.com/ffdsj/p/12556321.html

时间: 2024-11-06 23:18:22

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

程序员谈话系列————Redis性能分析

在一些网络服务的系统中,Redis 的性能,可能是比 MySQL 等硬盘数据库的性能更重要的课题.比如微博,把热点微博[1],最新的用户关系,都存储在 Redis 中,大量的查询击中 Redis,而不走 MySQL. 那么,针对 Redis 服务,我们能做哪些性能优化呢?或者说,应该避免哪些性能浪费呢? Redis 性能的基本面 在讨论优化之前,我们需要知道,Redis 服务本身就有一些特性,比如单线程运行.除非修改 Redis 的源代码,不然这些特性,就是我们思考性能优化的基本面. 那么,有哪

程序员谈话系列——今天我们来谈一下synchronized……

说起synchronized相信大家都很熟悉,就这个东西叫做互斥锁,平时呢可以帮助我们实现譬如线程安全的问题.那么今天咱们就来深入底层,好好的谈一下synchronized的原理和应用 一.谈一下对于synchronized的了解 synchronized关键字解决的是多个线程之间访问资源的同步性,synchronized关键字可以保证被他修饰的方法或者代码块在任意时刻只有一个线程执行.但是这个关键字虽然从功能上看还不错,但是在JDK6之前synchronized是不被人喜欢的,因为它是重量级锁

程序员谈话系列——————解开AQS的神秘面纱

一,谈一谈什么是AQS AQS是一个用来创建锁和同步器的框架,使用AQS能够简单且高效的构造出应用广泛的大量的同步器,比如常用的ReentrantLock,Semaphore‘,其他的诸如ReentrantReadWriteLock,FutureTask等等皆是基于AQS非常轻松容易的构造出符合我们自己需求的同步器. 二,AQS原理分析 AQS核心思想是,如果被请求的共享资源空闲,那么将请求资源的线程设置为有效线程,并且将共享资源设为锁定状态.如果被请求的共享资源被占用,那么就需要一套线程阻塞等

为什么C/C++程序员都要阅读Redis源码之:Redis学习事件驱动设计

为什么我说C/C++程序员都要阅读Redis源码 主要原因就是『简洁』.如果你用源码编译过Redis,你会发现十分轻快,一步到位.其他语言的开发者可能不会了解这种痛,作为C/C++程序员,如果你源码编译安装过Nginx/Grpc/Thrift/Boost等开源产品,你会发现有很多依赖,而依赖本身又有依赖,十分痛苦.通常半天一天就耗进去了.由衷地羡慕 npm/maven/pip/composer/...这些包管理器.而Redis则给人惊喜,一行make了此残生. 除了安装过程简洁,代码也十分简洁.

程序员成长系列(一):手里必须有一套自己的框架

转眼间工作三年了,对于程序员来说,三年算是这个行业的第一道坎.回首过往,大多都是进行重复性的工作,偶尔的也会进行技术攻关,但是没多久就忘记了,除了找工作的时期,平时是不会理会的. 不知不觉间发现自己这是在通货膨胀中不断贬值. 只要还有精力,学个五年十年那都不是问题,问题是这五年十年都学了些什么.经过多天的考虑,有必要整理一下这三年的所学所得,而且手里必须得有个拿得出手的东西.于是有必要整理一套自己的框架,而且吃透弄熟,把一些常用的功能组件都剥离出来,对以后无论是做管理还是搞技术都有莫大的帮助.

程序员表白系列源码

程序员表白系列源码 这里只是借花献佛 曾经也有人进行过整理 http://download.csdn.net/album/detail/1501

程序员资源系列(不断完善中)

1. 程序员读书资源网址: 1)红黑联盟的读书频道 2. PHP资源系列: 1)PHP100中文网 2)第一PHP社区 3. 时间管理系列: 1)GTD 4. 娱乐学习系列: 1)在线读书

【程序员感悟系列】 由一点业务说开去

最近的工作不是很忙,我也趁着这个机会多读了一些技术的书籍.比如刚读完的<大话设计模式>,以将故事的形式讲述了设计模式的方方面面,感觉还是不错的.现在看的一本是英国人写的<企业应用架构模式>.对于web的企业级应用,还是挺有借鉴的意义的. 我也觉得,12年毕业到现在,自己的技术一定要精进.所以多看设计模式,企业架构.然后,一个业务上的小事改变了我的看法,公司的网站的线上出现了一个数据的异常,显示的时间信息是 1970-01-01,一看就知道是数据库存储的是0,所以php解析出来的是u

程序员人生系列

程序员的上升空间在哪里 程序员的上升空间在哪里 我见证过许多的程序员的成长,他们很多人在进入成熟期之后,技术上相对较高,一般项目开发起来比较自信,没有什么太大的困难,有的职位上也有所提升,成了项目经理.设计师,有的甚至是到了管理者的位置.又经过很长时间,这些程序员却在也没有什么变化和发展,工作稳定.情绪稳定,好像一切都在按部就班地进行着.有的程序员满足于现在的收入和职位,安于现状:有的程序员却在安于现状的同时,苦苦思索... 今天我们为什么不成功 今天我们为什么不成功? 1.首先我们没有定义好自