0

因为一次redis缓存穿透,全面探究redis能做什么

问题背景:网关支付,支付之前需要根据商户去获取支持的银行列表,银行列表是商家首次在我们系统里申请开户的时候配置进去的,第一次获取列表是通过调远程接口查询数据库获取的,获取成功后,结果保存在redis缓存中,有效期设置6小时,以后每次查询都直接访问redis缓存即可。出现问题是有一批新商户没有配置银行列表,发起支付获取银行列表时,首次调用接口获取结果失败,没有放置缓存;商户反复提交了4次,每次访问缓存不存在,然后远程调用接口服务,接口返回同样不存在的错误,导致第5次远程调用返回500错误。这是典型的缓存穿透问题。缓存穿透是指用户不断发起请求缓存和数据库中都没有的数据,这时的用户很可能是攻击者,攻...

阅读全文>>

0

Redis到底该怎么搞呢?主从复制以及redis复制演进全面进攻

一、前言通过持久化功能,Redis保证了即使在服务器宕机情况下数据的丢失非常少。但是如果这台服务器出现了硬盘故障、系统崩溃等等,不仅仅是数据丢失,很可能对业务造成灾难性打击。为了避免单点故障通常的做法是将数据复制多个副本保存在不同的服务器上,这样即使有其中一台服务器出现故障,其他服务器依然可以继续提供服务。当然Redis提供了多种高可用方案包括:主从复制、哨兵模式的主从复制、以及集群。本文将详细介绍Redis从2.6以到4.0提供复制方案的演进,也包括:主从复制、复制原理以及相关实践。二、主从复制简介  在主从复制中,数据库分为两类,一类是主库(master),另一类是同步主库数据的从库(sl...

阅读全文>>

0

Redis 到底是怎么实现“附近的人”这个功能的呢?

Redis 到底是怎么实现“附近的人”这个功能的呢?前言:针对“附近的人”这一位置服务领域的应用场景,常见的可使用PG、MySQL和MongoDB等多种DB的空间索引进行实现。而Redis另辟蹊径,结合其有序队列zset以及geohash编码,实现了空间搜索功能,且拥有极高的运行效率。本文将从源码角度对其算法原理进行解析,并推算查询时间复杂度。要提供完整的“附近的人”服务,最基本的是要实现“增”、“删”、“查”的功能。以下将分别进行介绍,其中会重点对查询功能进行解析。操作命令自Redis 3.2开始,Redis基于geohash和有序集合提供了地理位置相关功能。 Redis Geo模块包含了以...

阅读全文>>

0

借助Redis完成延时任务

相信我们或多或少的会遇到类似下面这样的需求:第三方给了一批数据给我们处理,我们处理好之后就通知他们处理结果。大概就是下面这个图说的。本来在处理完数据之后,我们就会马上把处理结果返回给对方,但是对方要求我们处理速度不能过快,要有一种人为处理的效果。换句话就是说,就算是处理好了,也要晚一点再执行通知操作。这就是一个典型的延时任务。延时,那还不简单,执行完之后,让它Sleep一下就好了,这样就达到目标了。Sleep一下确定是最容易实现的一种方案,但是试想一下,数据的数量不断的增加,这样Sleep真的好吗?答案是否定的。延时队列,是处理这个场景最为妥当的方案。RabbitMQ,RocketMQ,Cmq...

阅读全文>>

0

Redis 6.0 正式版终于发布了!除了多线程还有什么新功能?

Redis 6.0.1 于 2020 年 5 月 2 日正式发布了,如 Redis 作者 antirez 所说,这是迄今为止最“企业”化的版本,也是有史以来改动最大的一个 Redis 版本,同时也是参与开发人数最多的一个版本。所以在使用此版本之前,建议各位开发者先进行深入的测试再考虑投产,毕竟生产坏境无小事。好了,回到本文的重点,接下来我们来重点看下 Redis 6.0.1 给我们带来了那些新功能。Redis新功能介绍Redis 6 的更新日志,主要包含以下五部分的内容:Redis 6.0-RC1 版新功能介绍;Redis 6.0-RC2 版新功能介绍;Redis 6.0-RC3 版新功能介绍...

阅读全文>>

1

Redis从入门到精通,至少要看看这篇

常用的 SQL 数据库的数据都是存在磁盘中的,虽然在数据库底层也做了对应的缓存来减少数据库的 IO 压力。图片来自 Pexels由于数据库的缓存一般是针对查询的内容,而且粒度也比较小,一般只有表中的数据没有发生变动的时候,数据库的缓存才会产生作用。但这并不能减少业务逻辑对数据库的增删改操作的 IO 压力,因此缓存技术应运而生,该技术实现了对热点数据的高速缓存,可以大大缓解后端数据库的压力。主流应用架构客户端在对数据库发起请求时,先到缓存层查看是否有所需的数据,如果缓存层存有客户端所需的数据,则直接从缓存层返回,否则进行穿透查询,对数据库进行查询。如果在数据库中查询到该数据,则将该数据回写到缓存...

阅读全文>>

0

Sprinig Boot + Redis 实现接口幂等性,写得太好了

一、概念幂等性, 通俗的说就是一个接口, 多次发起同一个请求, 必须保证操作只能执行一次 比如:订单接口, 不能多次创建订单支付接口, 重复支付同一笔订单只能扣一次钱支付宝回调接口, 可能会多次回调, 必须处理重复回调普通表单提交接口, 因为网络超时等原因多次点击提交, 只能成功一次 等等二、常见解决方案唯一索引 -- 防止新增脏数据token机制 -- 防止页面重复提交悲观锁 -- 获取数据的时候加锁(锁表或锁行)乐观锁 -- 基于版本号version实现, 在更新数据那一刻校验数据分布式锁 -- redis(jedis、redisson)或zookeeper实现状态机 -- 状态变更, 更...

阅读全文>>

0

为什么Redis 单线程却能支撑高并发?

最近在看 UNIX 网络编程并研究了一下 Redis 的实现,感觉 Redis 的源代码十分适合阅读和分析,其中 I/O 多路复用(mutiplexing)部分的实现非常干净和优雅,在这里想对这部分的内容进行简单的整理。几种 I/O 模型为什么 Redis 中要使用 I/O 多路复用这种技术呢?首先,Redis 是跑在单线程中的,所有的操作都是按照顺序线性执行的,但是由于读写操作等待用户输入或输出都是阻塞的,所以 I/O 操作在一般情况下往往不能直接返回,这会导致某一文件的 I/O 阻塞导致整个进程无法对其它客户提供服务,而 I/O 多路复用就是为了解决这个问题而出现的。Blocking I/...

阅读全文>>

0

Redis 高可用

主从复制#Redis 5.0 之后提供了REPLICAOF替代了之前的SLAVEOF命令来实现Master-Slave之间的数据交换 接下来我们设置主从复制模型:Master节点首先修改redis-master.conf配置文件来配置端口和安全认证bind 127.0.0.1port 6379 #端口requirepass redis #配置密码之后需要先认证,然后才能继续进行后续操作Slave节点首先修改redis-slave.conf配置文件来配置端口和安全认证bind 127.0.0.1port 6379 #端口...

阅读全文>>

0

听说Redis都会遇到并发、雪崩等难题?我用10分钟就解决了

一、Redis雪崩、穿透、并发等5大难题解决方案缓存雪崩数据未加载到缓存中,或者缓存同一时间大面积的失效,从而导致所有请求都去查数据库,导致数据库CPU和内存负载过高,甚至宕机。比如一个雪崩的简单过程:1、redis集群大面积故障2、缓存失效,但依然大量请求访问缓存服务redis3、redis大量失效后,大量请求转向到mysql数据库4、mysql的调用量暴增,很快就扛不住了,甚至直接宕机5、由于大量的应用服务依赖mysql和redis的服务,这个时候很快会演变成各服务器集群的雪崩,最后网站彻底崩溃。如何预防缓存雪崩:1.缓存的高可用性缓存层设计成高可用,防止缓存大面积故障。即使个别节点、个别...

阅读全文>>