nosql

redis缓存穿透,缓存击穿,缓存雪崩原因和解决方案

假如想象 提交于 2020-04-29 13:59:40
前言 在我们日常的开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。 为了克服上述的问题,项目通常会引入NoSQL技术,这是一种基于内存的数据库,并且提供一定的持久化功能。 redis技术就是NoSQL技术中的一种,但是引入redis又有可能出现缓存穿透,缓存击穿,缓存雪崩等问题。本文就对这三种问题进行较深入剖析。 redis缓存穿透,缓存击穿,缓存雪崩原因 缓存穿透:key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。 缓存击穿:key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。

【NoSQL】Consul中服务注册的两种方式

試著忘記壹切 提交于 2020-04-29 09:46:19
一句话 用agent更优雅,适合agent遍布每个应用机的情况。用catalog更直接,操作更方便 前言 今天遇到写一个服务启动自注册的逻辑时产生了一点纠结,可以使用 agent 对象的 register 方法进行注册,也可以使用 catalog 的 register 方法进行注册。那么,两种方式有什么区别呢? agent对象 new 一个consulClient对象,应当是作为一个软consul agent 对API URL对应的节点的属性没有要求. 其可以是server身份也可以是纯agent身份 数据要经过冲突确认后,再存入catalog中 反注册时只可以反注册自身的节点(主机)上的服务,注册时可以注册其他主机上的服务 catalog connect to consul database 连接的节点应当是server节点 操作后数据立马生效 反注册对所有节点生效 用途 编写反注册节点的服务应使用catalog的方法 使用agent方法反注册服务时,需要指定一个serviceID参数,该ID是的唯一维度是node也就是主机唯一的。因此从catalog进行反注册时最好是提供主机名和服务ID,当然也可以是IP和服务ID,服务名和服务ID的结合我没有尝试过。 案例 实现反注册节点的逻辑 用途:删除已经失效的主机信息,用于取消报警触发 // 根据IP删除节点 func (c

来,带你鸟瞰 Java 中的并发框架!

北城以北 提交于 2020-04-28 20:13:15
作者:唐尤华 https://dzone.com/articles/a-birds-eye-view-on-java-concurrency-frameworks-1 1. 为什么要写这篇文章 几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库。 但是,当深入实现细节时,我们想起了一位智者曾经说过的话:“细节决定成败”。最终我们意识到 NoSQL 不是解决所有问题的银弹,而 NoSQL vs RDMS 的答案是:“视情况而定”。 类似地,去年RxJava 和 Spring Reactor 这样的并发库加入了让人充满激情的语句,如异步非阻塞方法等。为了避免再犯同样的错误,我们尝试评估诸如 ExecutorService、 RxJava、Disruptor 和 Akka 这些并发框架彼此之间的差异,以及如何确定各自框架的正确用法。 本文中用到的术语在这里有更详细的描述。 2. 分析并发框架的示例用例 3. 快速更新线程配置 在开始比较并发框架的之前,让我们快速复习一下如何配置最佳线程数以提高并行任务的性能。 这个理论适用于所有框架,并且在所有框架中使用相同的线程配置来度量性能。 对于内存任务,线程的数量大约等于具有最佳性能的内核的数量,尽管它可以根据各自处理器中的超线程特性进行一些更改。 例如,在8核机器中

阿里云服务器企业版ECS该如何选择及使用教程

99封情书 提交于 2020-04-27 17:51:35
请认真看完此文 国内云服务商中,阿里云服务器的口碑可以说是数一数二的了,因此很多企业在建站时都会首先考虑到阿里云服务器。所以,服务器吧小编今天就带大家来深入学习一下阿里云企业版云服务器ECS的使用方法。 阿里云企业版云服务器ECS快速入门需围绕这几个方面:ECS实例规格的选择、网络规划建议、对实例数量及具体配置的成本估算、安全组的配置、自动快照策略的制定、镜像迁移以及业务负载均衡与高可用性。 一、实例规格的选择 如果你的业务面向以下应用场景,可以选择图中推荐的实例。这里更多实例规格族。(说明:不同地域下可购买的实例规格可能存在差异,你可以前往ECS实例可购买地域, 查看实例的可购情况 。) (说明:更多应用场景说明请参见 企业级配置选型 。) 具体的实例配置需要结合应用场景的要求决定,可以参考如下实例配置建议: 均衡性能:需要相对均衡的处理器与内存资源配比,可以满足大多数场景下的应用资源需求。 高网络收发包应用:需要高网络收发包能力,您可以根据应用场景选择更合理的计算与内存的资源配比。 高性能计算:需要消耗高计算资源,GPU并行计算以及高主频是该场景下的典型应用。 高性能端游:需要高主频处理器支持,高处理器主频可以承载更多的用户。 手游、页游:需要消耗高计算资源,建议选择1:2的处理器与内存配比,可以获得最优计算资源性价比。 视频转发:需要消耗高计算资源,建议选择1

来,带你鸟瞰 Java 中的并发框架!

[亡魂溺海] 提交于 2020-04-27 15:09:55
作者:唐尤华 https://dzone.com/articles/a-birds-eye-view-on-java-concurrency-frameworks-1 1. 为什么要写这篇文章 几年前 NoSQL 开始流行的时候,像其他团队一样,我们的团队也热衷于令人兴奋的新东西,并且计划替换一个应用程序的数据库。 但是,当深入实现细节时,我们想起了一位智者曾经说过的话:“细节决定成败”。最终我们意识到 NoSQL 不是解决所有问题的银弹,而 NoSQL vs RDMS 的答案是:“视情况而定”。 类似地,去年RxJava 和 Spring Reactor 这样的并发库加入了让人充满激情的语句,如异步非阻塞方法等。为了避免再犯同样的错误,我们尝试评估诸如 ExecutorService、 RxJava、Disruptor 和 Akka 这些并发框架彼此之间的差异,以及如何确定各自框架的正确用法。 本文中用到的术语在这里有更详细的描述。 2. 分析并发框架的示例用例 3. 快速更新线程配置 在开始比较并发框架的之前,让我们快速复习一下如何配置最佳线程数以提高并行任务的性能。 这个理论适用于所有框架,并且在所有框架中使用相同的线程配置来度量性能。 对于内存任务,线程的数量大约等于具有最佳性能的内核的数量,尽管它可以根据各自处理器中的超线程特性进行一些更改。 例如,在8核机器中

DevOps工程师技能

此生再无相见时 提交于 2020-04-27 10:18:48
技术背景 DevOps工程师必须持有计算机科学、工程或其他相关领域的学位。2年以上工作经验。这包括开发人员、系统管理员或devops驱动的团队成员的工作。这是一个重要的需求,同时也是对所有IT操作的理解。 自动化工具的经验 了解用于测试和部署的开源解决方案是DevOps工程师必须具备的知识。如果您使用的是云服务器,请确保您的候选人具有使用GitHub、Chef、Puppet、Jenkins、Ansible、Nagios和Docker等工具的经验。此职位的候选人还必须具有使用公共云(如Amazon AWS、Microsoft Azure和谷歌云)的经验。 编程技能。 工程师不仅要知道现成的工具,还要有编程经验,包括脚本和编码。脚本编制技能通常需要Bash或PowerShell脚本的知识,而编码技能可能包括Java、c#、c++、Python、PHP、Ruby等,或者至少是其中一些语言。 数据库系统知识。 在部署阶段,工程师处理数据处理,这需要有SQL或NoSQL数据库模型的经验。 沟通和人际交往能力 虽然一个好的候选人必须精通技术方面,但是DevOps专家必须有很强的沟通才能。他/她必须确保团队有效运作,接收和分享反馈以支持持续交付。结果——一个产品——取决于他/她与所有团队成员有效沟通的能力。 参考 https://www.altexsoft.com/blog

Redis与RabbitMQ作为消息队列的比较

只愿长相守 提交于 2020-04-27 04:00:04
简要介绍 RabbitMQ RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。 Redis 是一个Key-Value的NoSQL数据库,开发维护很活跃,虽然它是一个Key-Value数据库存储系统,但它本身支持MQ功能,所以完全可以当做一个轻量级的队列服务来使用。 具体对比 可靠消费 Redis:没有相应的机制保证消息的消费,当消费者消费失败的时候,消息体丢失,需要手动处理 RabbitMQ:具有消息消费确认,即使消费者消费失败,也会自动使消息体返回原队列,同时可全程持久化,保证消息体被正确消费 可靠发布 Reids:不提供,需自行实现 RabbitMQ:具有发布确认功能,保证消息被发布到服务器 高可用 Redis:采用主从模式,读写分离,但是故障转移还没有非常完善的官方解决方案 RabbitMQ:集群采用磁盘、内存节点,任意单点故障都不会影响整个队列的操作 持久化 Redis:将整个Redis实例持久化到磁盘 RabbitMQ:队列,消息,都可以选择是否持久化 消费者负载均衡 Redis:不提供,需自行实现 RabbitMQ:根据消费者情况,进行消息的均衡分发 队列监控 Redis

[半翻] 设计面向DDD的微服务

廉价感情. 提交于 2020-04-26 13:21:27
这篇文章行文结构对照微软博客, 结合本人意译和多年实践的回顾思考形成此次读书笔记。 Domian-driven Design 领域-驱动-设计(DDD)提倡 基于(用例相关的现实业务)进行建模 。 1. DDD的视角 DDD将 现实问题视为领域 ; DDD将 独立的问题描述为有界限的上下文 (一个有界上下文对应一个微服务),并强调通用语言讨论这些问题 2. DDD提出的概念 许多技术概念和模式,例如充血模型(对应我们常写贫血模型)、值对象、聚合和聚合根规则。 3. 目前实施DDD的现状 有时DDD技术规则和模式被视为障碍/啰嗦,对于实施DDD方法而言,学习曲线比较陡峭。 不要为了实施而实施,最重要的是 使用通用语言编写与业务问题一致的领域代码 。 此外仅当您要实现具有复杂业务规则的微服务时,才应使用DDD方法,诸如CRUD服务之类的简单职责可以通过更简单的方法进行管理。 DDD模式可以协助 划分微服务边界 在已经确定的界限上下文,您可以为领域建模:实体模型、值对象和聚合,DDD与边界有关,微服务也与边界有关。 尽量保持小型微服务 划分界限上下文,要平衡两个目标: 创建尽可能小的微服务(这一点不应该成为主要动力) 要避免微服务之间过密的通信 这两个目标可能彼此矛盾,两者通过演进的方式达到平衡: 尽可能分解系统,直到在下次分解时感到服务通信迅速增加。 DDD微服务中的层

MySQL不香吗,为什么还要有noSQL?

久未见 提交于 2020-04-26 12:11:54
本文始发于个人公众号: TechFlow ,原创不易,求个关注 今天是 分布式专题的第14篇 文章,我们一起来看看NoSQL数据库。 其实我很早就想写写分布式数据库相关的文章,既是我现在正在学习的,也是我很感兴趣的内容。但是谈到分布式数据库,会涉及很多相关的技术细节,等把相关的一些细节写明白的时候,已经十几篇文章过去了XD。所以如果想要了解 B/B+树、LSMT、CAP 等技术细节的,可以翻翻之前的文章。今天我们来聊聊NoSQL这个概念。 noSQL的大概意思 noSQL现在非常火,我看过的简历里面十个有九个都写了熟悉noSQL,但是对于noSQL背后的细节却很少有人能讲清楚,甚至连noSQL里面的这个no是什么意思都很多人搞错。这个no并不是not的意思,而是 not only 的缩写。不得不说这个缩写实在是很坑爹,单从字面上应该没人能猜出来它是这个意思。而且即使解读成not only SQL,还是有点云里雾里,不是很能精准地get到它的点。 因为SQL的英文全写是structured query language,也就是结构化查询语言的意思。它可以认为是一门特殊的编程语言,但“不仅仅是SQL”是啥意思?的确令人费解,所以我们从字面意思上去理解是不行的,我们需要从 实际应用场景 去理解。 SQL的应用场景是关系型数据库,比如我们常用的Oracle、MySQL,这些就是关系型数据库

mysql--构造数据、导入导出

可紊 提交于 2020-04-26 04:39:49
一、mysql造数据脚本 DELIMITER $$ DROP PROCEDURE IF EXISTS `test3`$$ CREATE /*[DEFINER = { user | CURRENT_USER }]*/ PROCEDURE `test`.`test3`() /*LANGUAGE SQL | [NOT] DETERMINISTIC | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA } | SQL SECURITY { DEFINER | INVOKER } | COMMENT 'string'*/ BEGIN DECLARE i INT DEFAULT 1; WHILE i<=10000 DO SET @firstname = SUBSTRING('赵钱孙李周吴郑王林杨柳刘孙陈江阮侯邹高彭徐史贺何罗',FLOOR(1+25*RAND()),1); SET @name1 = SUBSTRING('一二三四五六七八九十甲乙丙丁静景京晶名明铭敏闵民军君俊骏天田甜兲恬益依成城诚立莉力黎励国达雅蕾',ROUND(1+47*RAND()),1); SET @namefull = CONCAT(@firstname,@name1); SET @laowu=RAND(); INSERT INTO test3 (