前言 在博客系统中,为了提升响应速度,加入了 Redis 缓存,把文章主键 ID 作为 key 值去缓存查询,如果不存在对应的 value,就去数据库中查找 .这个时候,如果请求的并发量很大,就会对后端的数据库服务造成很大的压力. 造成原因 业务自身代码或数据出现问题 恶意攻击.爬虫造成大量空的命中,会对数据库造成很大压力 案例分析 由于文章的地址是这样子的: https://blog.52itstyle.top/49.html 大家很容易猜出,是不是还有 50.51.52 甚至是十万+?如果是…
前言 在开发十万博客系统的的过程中,前面主要分享了爬虫.缓存穿透以及文章阅读量计数等等.爬虫的目的就是解决十万+问题:缓存穿透是为了保护后端数据库查询服务:计数服务解决了接近真实阅读数以及数据库服务的压力. 架构图 限流 就拿十万博客来说,如果存在热点文章,可能会有数十万级别的并发用户参与阅读.如果想让这些用户正常访问,无非就是加机器横向扩展各种服务,但凡事都有一个利益平衡点,有时候只需要少量的机器保证大部分用户在大部分时间可以正常访问即可. 亦或是,如果存在大量爬虫或者恶意攻击,我们必须采取一…
前言 在十万博文终极架构中,我们使用了Tomcat集群,但这并不能保证系统不会出问题,为了保证系统的稳定运行,我们还需要对 Tomcat 进行有效的运维监控手段,不至于问题出现或者许久一段时间才知道.凌晨一点这个锅可谁都不想背,为此基于目前的情况搭建了以下这么一套监控预警系统. 架构图 相关软件 Nginx:代理访问 Grafana Grafana: 可视化面板(Dashboard),有着非常漂亮的图表和布局展示 Influxdb:开源的时间序列数据库,适用于记录度量,事件及执行分析 Teleg…
前言 在经历了,缓存.限流.布隆穿透等等一系列加强功能,十万博客基本算是成型,网站上线以后也加入了百度统计来见证十万+ 的整个过程. 但是百度统计并不能对每篇博文进行详细的浏览量统计,如果做一些热点博文排行.48小时排行之类统计,还需要引入浏览量统计功能. 设计 通常情况下,我们只需要每次请求浏览量+1,但是这样真的好吗?或者更直白的讲,真实浏览数准确吗? UPDATE blog SET views = views+1 WHERE id=? 参考了多个社区博客的设计,因为并不十分清楚其后端实现过…
前言 通过 Python 爬取十万博文之后,最重要的是要让互联网用户访问到,那么如何做呢? 选型 从后台框架.前端模板.数据库连接池.缓存.代理服务.限流等组件多个维度选型. 后台框架 SpringBoot2+.JPA 前端框架 Vue 模块框架 Thymeleaf 数据库连接池 HikariCP 缓存 Redis 限流 Guava 代理服务 Nginx 文章编辑 Markdown 架构 博文 我们可以通过以下方式访问: https://blog.52itstyle.top/49.html 亦或…
最近已经推出了好几篇SpringBoot+Dubbo+Redis+Kafka实现电商的文章,今天再次回到分布式微服务项目中来,在开始写今天的系列五文章之前,我先回顾下前面的内容. 系列(一):主要说了使用IDEA对SpringBoot项目的创建,SpringBoot架构下Web项目Maven的基本依赖及实现. 系列(二):主要讲了Maven父子级项目创建依赖.分环境部署配置及服务端口号统一配置,Dubbo的集成接入.服务层(提供者)分模块实现,提供者(四个)和消费者(一个)的配置及服务调用,微服…
什么是缓存穿透问题?? 我们使用redis是为了减少数据库的压力,让尽量多的请求去承压能力比较大的redis,而不是数据库.但是高并发条件下,可能会在redis还没有缓存的时候,大量的请求同时进入,导致一大批的请求直奔数据库,而不会经过redis.使用代码模拟缓存穿透问题如下: 首先是service里面的代码: @Service public class NewsService { @Autowired private NewsDAO newsDAO; //springboot自动初始化,不需要…
从.Net到Java学习系列目录 场景描述:我们在项目中使用缓存通常都是先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回.这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,可能DB就挂掉了. 穿透:频繁查询一个不存在的数据,由于缓存不命中,每次都要查询持久层.从而失去缓存的意义. 常用解决办法:①用一个bitmap和n个hash函数做布隆过滤器过滤没有缓存的键.②持久层查询不到就缓存…
 一.Redis介绍 Redis是一个开源的,基于内存的结构化数据存储媒介,可以作为数据库.缓存服务或消息服务使用.Redis支持多种数据结构,包括字符串.哈希表.链表.集合.有序集合.位图.Hyperloglogs等.Redis具备LRU淘汰.事务实现.以及不同级别的硬盘持久化等能力,并且支持副本集和通过Redis Sentinel(哨兵)实现的高可用方案,同时还支持通过Redis Cluster(集群)实现的数据自动分片能力. Redis的主要功能都基于单线程模型实现,也就是说Redis使用…
今天来聊聊redis的缓存穿透.击穿.雪崩以及解决方案,其中解决方案包括类似于布隆过滤器这种网上一搜一大片但是实际生产部署有一定复杂度的,也有基于spring注解通过一行代码就能解决的,其中各有优劣,咱们根据实际需要选型: 接下来会从穿透.击穿.雪崩的基本概念.各种问题对应的解决方案以及方案的具体实施来一一介绍 缓存穿透 概念 缓存穿透指某一特定时间批量请求打进来并访问了缓存和数据库都没有的key,此时会直接穿透缓存直达数据库,从而造成数据库瞬时压力倍增导致响应速度下降甚至崩溃的风险: 解决方案…