Redis

记一次线上CPU过高的问题以及处理方案

有些话、适合烂在心里 提交于 2020-08-11 21:39:29
场景回溯 本人所在的项目是一个支付项目,有个场景就是当用户下单之后,需要及时的知道订单的支付状态,有的渠道回调比较慢,故在用户下单之后将订单信息放入redis,然后不断的去轮询调用渠道方订单查询接口。 问题复现 原始版本 不断的从redis中消费数据,然后调用渠道方订单查询接口查询订单状态,如果返回的状态是未支付的话,则会重新放到redis中,等待下一次在进行查询。每个订单在2分钟内可能会调用渠道方接口查询很多次,对渠道方的接口压力比较大。订单量小的时候还好,订单量大的时候,渠道方时常过来骂人,然后把我们的ip拉入黑名单,被怼了几次之后,我们妥协了,决定优化下相关的代码。 1.0版本 有鉴于调用渠道方的订单查询接口太频繁了,所以我们做一个优化,比如A订单,第一次查询的状态是未支付的话,则会将该订单放入map中做一个标记,同时会重新放回redis中,下次从redis中消费数据时,会首先判断下这个订单在map中有没有,如果有的话则会判断其放入到map中的时间是否超过 5秒钟 ,如果没有的话,则会 重新放入redis中 。等待下一次轮询。经过一轮代码的Review,大家都一致认为没啥大问题,交个测试测的话也没有啥大问题。就这么愉快的上线了。 1.0版本上线之后,线上立刻出现了CPU飙升的情况,飙升的情况太明显了。因为redis本身的吞吐量比较高,在这种情况下,1秒钟内

Docker容器编排之docker-compose

て烟熏妆下的殇ゞ 提交于 2020-08-11 21:00:22
docker-compose简介 Compose是用于定义和运行多容器Docker应用程序的工具。通过Compose,您可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。 使用Compose基本上是一个三步过程: 1.使用定义您的应用环境,Dockerfile以便可以在任何地方复制。 2.定义组成应用程序的服务,docker-compose.yml 以便它们可以在隔离的环境中一起运行。 3. docker-compose up 启动并运行您的整个应用程序。 在linux下安装docker-compose 1.下载 #官方文档下载地址 有点慢 sudo curl -L "https://github.com/docker/compose/releases/download/1.26.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose #国内镜 像地址下载 curl -L "https://get.daocloud.io/docker/compose/releases/download/1.25.5/docker-compose-`uname -s`-`uname -m`" -o /usr/local/bin/docker-compose 2

在Spring Boot 上配置Redis Cluster出现的异常

a 夏天 提交于 2020-08-11 20:59:04
〇、背景   已在虚拟机(CentOS 7,在本文也称其为宿主机——即docker容器的宿主机)的docker中搭建好了6个节点的redis (host网络模式)集群: Docker Redis 5.0集群搭建   现在在本机(Windows 7)以Spring Boot环境连接集群 一、异常1:无法连接集群 1.配置: 1 #rediss 2 spring.redis.cluster.nodes=192.168.22.130:7001,192.168.22.130:7002,192.168.22.130:7003,192.168.22.130:7004,192.168.22.130:7005,192.168.22.130:7006 3 spring.redis.timeout=60000 4 spring.redis.jedis.pool.max-wait=-1 5 spring.redis.jedis.pool.max-active=300 6 spring.redis.jedis.pool.max-idle=100 7 spring.redis.jedis.pool.min-idle=20 2.报错: org.springframework.data.redis. RedisConnectionFailureException: Unable to connect to

常见问题

旧巷老猫 提交于 2020-08-11 20:56:17
1、wpf和winform的区别? 2、委托和事件的区别? 委托的本质bai,是一个类,而du事件,是一个委托类型的私有zhi变量加上两个公有方法dao(事件的+=和-=),这是本质区别。 打个比方,string 也是一个类,而string s = "a",这个s是string类型的一个变量(略有不恰当,为了方便直观理解)。 public delegate void myDel();相当于你创建了一个myDel的类,所以委托可以在任何地方创建,类需要实例化,所以委托需要实例化,要myDel m = ……; 申明一个事件 public event myDel myEvent; 事件myEvent是一个myDel类型的一个变量,因为是变量,所以事件只能在类里面申明,不需要实例化,有点类似与上面的那个m,当然不全是,他还有两个方法(+=,-=),调用一次+=方法,myEvent += MethodA;其实是把MethodA方法,封装成一个myDel类型的委托对象,然后把这个对象的引用赋值给这个myEvent变量。如果多次调用+=,就是多个方法封装成了多个myDel委托对象,然后这些委托对象放在一个列表里面,然后myEvent就指向这个列表,触发的时候,就是调用这个列表里面的所有委托的Invoke方法。 上述是编译时他们的本质区别,用法上的区别主要就是事件只能在申明他的这个类里面调用触发

听说go语言越来越火了?那么请收下这一份go语言书单吧!

北慕城南 提交于 2020-08-11 20:46:34
关注公众号【程序员书单】后回复“book”即可领取30+精品免费电子书 ​ Go 是一种简单、小巧、令人愉悦的语言。它也有一些犄角旮旯,但绝大部分是经过精心设计的。它的学习速度令人难以置信,并且规避了其他语言中一些不那么广为人知的特性。 现如今越来越多的互联网公司开始使用go语言,有的初创公司开始使用go语言打造基础架构,而知乎这样的公司也基本上踏上了go语言的路子,或许,未来的互联网公司会越来越多地使用golang,那么,你想学习一下这门未来的语言么,今天就来推荐一份go语言书单吧。 go语言系列书单 ​ Go语言核心编程 Go语言的核心语言特性包括:类型系统、接口、并发。这三部分是Go语言精华、优美、也是重要的特征,本书紧密围绕这三个主题展开。以“类型系统”为例,Go语言中的类型有:简单类型、复合类型、命名类型、未命名类型、静态类型、动态类型、底层类型、接口类型、具体类型以及类型字面量等诸多概念,这些概念在其他Go类图书里面鲜有介绍,本书试图帮助读者梳理清楚这些类型的含义,建立概念,认清类型本质并学会正确使用; 在接口章节,不单介绍了接口概念和用法,还深入分析了接口的机制,使读者对Go语言非侵入式的接口有更深入的理解;在并发编程章节,书中给出了5个并发编程范式,并用图描述并发程序的模型,通俗易懂,这也是本书读特点。 此外本书还拿出一整章内容介绍Go语言编程过程中可能遇到的陷阱

Linux中,Tomcat 怎么承载高并发(深入Tcp参数 backlog)

早过忘川 提交于 2020-08-11 18:57:19
阅读目录 一、前言 二、翻译正文 1、两种实现方式 2、BSD 的选择 3、Linux 的选择 4、linux实现中, accept 队列满了怎么办 5、问题延伸 4、Stevens老爷子的建议 三、译文的测试验证 1、服务端程序 2、客户端程序 3、客户端请求发送5次,填满 accept 队列 5、测试tcp_abort_on_overflow 参数 5、服务端正常accept时的连接情况 四、简单总结 五、 Tomcat 、nginx、redis中如何设置 backlog 1、tomcat 2、nginx 3、redis 回到顶部 一、前言 这两天看tomcat,查阅 tomcat 怎么承载高并发时,看到了backlog参数。我们知道,服务器端一般使用mq来减轻高并发下的洪峰冲击,将暂时不能处理的请求放入队列,后续再慢慢处理。其实操作系统已经帮我们做了一些类似的东西了,这个东西就是backlog。服务端一般通过 accept 调用,去获取socket。但是假设我们的程序处理不过来(比如因为程序bug,或者设计问题,没能及时地去调用 accept),那么此时的网络请求难道就直接丢掉吗? 当然不会!这时候,操作系统会帮我们放入 accept 队列,先暂存起来。等我们的程序缓过来了,直接调用 accept 去 队列取就行了,这就达到了类似mq的效果。 而 backlog,和另一个参数

记一次token安全认证的实践

帅比萌擦擦* 提交于 2020-08-11 18:50:29
阅读此文前请先阅读上一篇 SpringBoot整合JWT实现用户认证了解JWT 。 背景介绍: 因项目需求,有PC端 APP端和小程序端,但登陆接口是同一个,然而微服务也无法使用传统的session解决用户登录问题(注意这里是传统的session不是spring session),使用户信息在其他服务共享。 如此一来就想到了token安全认证,而JWT生成token可以包含用户信息,也就果断选择了JWT作为SpringCloud gateway网关的token校验工具,这样,我们便可以直接解析token获取用户信息了。 具体实现思路: 让JWT在其他所有服务可以共同使用,父工程需要引入JWT jar。避免在其他服务重复引入。 如何使用JWT生成token。 如何解析token。 如何让网关拦截用户请求校验token。 如何避免首次登录被网关拦截。 代码实现: 1.创建SpringCloud项目 SpringCloud子项目包含 eureka,gateway,auth三个工程,父工程maven依赖如下。 <dependency> <groupId>com.nimbusds</groupId> <artifactId>nimbus-jose-jwt</artifactId> <version>6.0</version> </dependency> 2

Linux中,Tomcat 怎么承载高并发(深入Tcp参数 backlog)

試著忘記壹切 提交于 2020-08-11 18:43:41
一、前言 这两天看tomcat,查阅 tomcat 怎么承载高并发时,看到了backlog参数。我们知道,服务器端一般使用mq来减轻高并发下的洪峰冲击,将暂时不能处理的请求放入队列,后续再慢慢处理。其实操作系统已经帮我们做了一些类似的东西了,这个东西就是backlog。服务端一般通过 accept 调用,去获取socket。但是假设我们的程序处理不过来(比如因为程序bug,或者设计问题,没能及时地去调用 accept),那么此时的网络请求难道就直接丢掉吗? 当然不会!这时候,操作系统会帮我们放入 accept 队列,先暂存起来。等我们的程序缓过来了,直接调用 accept 去 队列取就行了,这就达到了类似mq的效果。 而 backlog,和另一个参数 /proc/sys/net/core/somaxconn 一起,决定了队列的容量,算法为:min(/proc/sys/net/core/somaxconn, backlog) 。 文章比较长,如果只需要结论,看第三章的总结即可,有时间的话,可以仔细看看正文、第四章的验证部分。 如果只想知道怎么设置这个值,直接跳到最后即可。 下面这篇文章,基础原理讲得很不错。但是是外国人写的,我这里简(tong)单(ku)翻译一下,我也会结合自己的理解,做一些补充。原文链接: http://veithen.io/2014/01/01/how-tcp

2020秋招到了,想要跳槽吗?这套面试法宝可为你助力

我的梦境 提交于 2020-08-11 18:23:28
想要跳槽,你得具备以下条件: 具备很强的专业知识,牛逼,有信心快速找到下一家适合你的公司. 然后有一定存款,可以保证当下辞职后,生活方面不愁. 当然学习是很重要的,不努力提升自己,加强自己的专业知识,后面就算是跳槽成功也是很容易被PASS掉,现实是残 酷的,可千万不要因为找到新工作就放松警惕,做咸鱼. 那今天给你们分享这千道面试题,希望在找工作或者是想要跳槽的朋友都可以刷刷,准备充足,随时应战,顺利拿offer !!!! MyBatis 面试题 什么是 Mybatis? Mybaits 的优点: MyBatis 框架的缺点: MyBatis 框架适用场合: MyBatis 与 Hibernate 有哪些不同? #{}和${}的区别是什么? 当实体类中的属性名和表中的字段名不一样 ,怎么办 ? 模糊查询 like 语句该怎么写? 通常一个 Xml 映射文件,都会写一个 Dao 接口与之对应,请问,这个 Dao 接口的工作原理是什么?Dao 接口里的方法,参数不同时,方法能重载吗? Mybatis 是如何进行分页的?分页插件的原理是什么? Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式? 如何执行批量插入? 如何获取自动生成的(主)键值? 在 mapper 中如何传递多个参数? Mybatis 动态 sql 有什么用?执行原理?有哪些动态 sql? Xml

数据结构-拉钩教育

血红的双手。 提交于 2020-08-11 18:05:05
感谢拉钩教育平台,感谢蔡元楠老师以及各位同仁 总的来说很好,有国外一线大厂的使用实例讲解,区块链那快通俗易懂也是我写这篇的缘由之一,但是只18章内容、不可能面面俱到,还需要多方学习,还是很感谢蔡老师的分享 https://kaiwu.lagou.com/course/courseInfo.htm?courseId=20#/detail/pc?id=513 计算机内所有数据结构本质上可归为:数组和链表 数组 一组被保存在 连续存储空间 中具有 相同类型 的数据元素 集合, 内元素可通过自身索引index进行访问 随机访问:用同等时间访问到一组数据中任意一个元素 获取数组元素的方式: base_address + index * data_size 二维数组 行优先 :每一行每个相邻元素保存在相邻的连续内存中 123456 data[i][j] base_address + data_size *( i * number_of_column + j) 2地址 0x80000000+4*(0 * 3+1) 32位计算机 int占4字节 data_size=4 列优先 :每一列每个相邻元素保存在相邻的连续内存中 base_address + data_size × (i + number_of_row × j);这里number_of_row是2 cpu读取内存:cpu缓存策略