`
文章列表
本篇,咱们来实现优惠券秒杀下单功能。通过本篇学习,我们将会有如下收获: 1:优惠券领券业务逻辑; 2:分析在高并发情况下,出现超卖问题产生的原因; 3:解决超卖问题两种方案:版本号法及CAS法 4:乐观锁弊端改进方 ...
在上一篇中Redis实战之session共享,我们知道了通过Redis实现session共享了,那么token怎么续命呢?怎么刷新用户呢?本来咱们就通过拦截器来实现这两个功能。 登录拦截器优化: 先来看看现在拦截器情况: 拦截流程: 当拦截器拦截需要拦截到的url时候,才会在拦截器中更新用户token的过期时间。那如果,访问了不被拦截的路径,就不会给token续命的。这样就会导致用户token过期,而重新登录的。这样是不对的。 拦截了哪些路径?在config/MvcConfig中 当访问以上这些路径的是,就不会自动更新用户的token过期时间了。 优化:我们可以在现有拦截 ...
当线上集群时候,会出现session共享问题。 当线上集群时候,会出现session共享问题。 虽然Tomcat提供了session copy的功能,但是缺点比较明显: 1:当Tomcat多的时候,session需要大量同步到多台集群上,占用内网宽带 2:同一个用户session,需要在多个Tomcat中都存在,浪费内存空间。   如果要替换掉Tomcat的session共享,替代方案应该满足: 1:数据共享 2:内存存储 3:key\value结构 基于Redis实现共享session登录 本文由凯哥Java(gz#h:kaigejava),个人blog:www#k ...
分库分表之后,ID主键如何处理? 当业务量大的时候,数据库中数据量过大,就要进行分库分表了,那么分库分表之后,必然将面临一个问题,那就是ID怎么生成?因为要分成多个表之后,如果还是使用每个表的自增长ID,意味着每个表都是从1开始累加的,这样肯定是不对的。需要一个全局唯一的ID来支持。所以这也是你实际生产环境中必须考虑的一个问题。全局ID生成器,一般需要满足下列几个特性: 唯一性、高可用、递增性、安全性、高可用性   常用的主键ID生成策略有以下几种: 数据库自增ID 原理: 如果使用这种方式,那么这就意味着,你的系统里每次得到一个ID,都需要往一个库中的一个表中插入一条没有什 ...

Redis快速入门

Redis快速入门,分两个客户端:Jedis和SpringDataRedis 本文有凯哥Java(kaigejava).个博:www.kaigejava.com 发布于iteye 使用Jdedis 1、引入依赖 <!--jedis--> <dependency>     <groupId>redis.clients</groupId>     <artifactId>jedis</artifactId>     <version>3.7.0</version> </dep ...
发布优惠券的时候,每个店铺都可以发布优惠券,当用户抢购的时候,优惠券表中的id如果使用数据库的自增长ID会存在以下问题: 1:id的规律太明显,容易被刷 2:当数据量很大的时候,会受到单表数据的限制 缺点场景分析: id规律场景:如果我们的id具有太明显的规则,用户或者说商业对手很容易猜测出来我们的一些敏感信息,比如商城在一天时间内,卖出了多少单,这明显不合适。 单表限制:随着我们商城规模越来越大,mysql的单表的容量不宜超过500W,数据量过大之后,我们要进行拆库拆表,但拆分表了之后,他们从逻辑上讲他们是同一张表,所以他们的id是不能一样的, 于是乎我们需要保证id的唯一性。 ...
1.1.安装Redis依赖 Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖: yum install -y gcc tcl 1.2.上传安装包并解压 ​
通过前面的学习,我们已经掌握了docker-compose容器编排及实战了。高级篇也算快完了。有没有相关,我们前面学习的时候,都是通过命令行来操作docker的,难道docker就没有图形化工具吗?答案是肯定有的。咱们本篇就来讲讲docker图形化工具及使用图形化工具安装Nginx及docker系列教程总结。 Portainer是什么? Portainer 是一款轻量级的应用,它提供了图形化界面,用于方便地管理Docker环境,包括单机环境和集群环境。 Portainer的安装 官网: https://www.portainer.io/ https://docs.portaine ...
通过前面两篇的学习,我们对docker网络及四大网络类型都了解了。本文,咱们就来学习docker的自定义网络。我们为什么需要自定义网络呢?是为了让各个主机分门别类,井井有条。方便关联,使得网络之间可以通过服务名进行通信。为什么在容器中,我们要通过服务名进行通信呢?那是因为,docker容器内部的IP是有可能发生变化的。我们使用自定义网络,就是解决容器IP变动时候可以通过服务名直接网络通信而不受到影响。 我们先来看看没有使用自定义网络前: 在上一篇文章中,我们案例使用的tomcat81和tomcat82.我们启动这两个容器。使用命令: docker run -d -p 8081:8080 ...
通过前面两篇的学习,我们对docker网络及四大网络类型都了解了。本文,咱们就来学习docker的自定义网络。我们为什么需要自定义网络呢?是为了让各个主机分门别类,井井有条。方便关联,使得网络之间可以通过服务名进行通信。为什么在容器中,我们要通过服务名进行通信呢?那是因为,docker容器内部的IP是有可能发生变化的。我们使用自定义网络,就是解决容器IP变动时候可以通过服务名直接网络通信而不受到影响。 我们先来看看没有使用自定义网络前: 在上一篇文章中,我们案例使用的tomcat81和tomcat82.我们启动这两个容器。使用命令: docker run -d -p 8081:8080 ...
通过上一篇学习,我们对docker网络有了初步的了解。本篇,咱们就来实战docker网络。 docker网络实战 实战docker网络,我们将从以下几个案例来讲解 1:birdge是什么? 2:host 3:none 4:container 实战网络类型如下: 在docker中,网络的配置是以json格式存在的,下面我们就来看看每种类型网络配置信息 我们先来看看bridge类型的网络 使用命令:docker network inspect bridge 查看host类型的网络 使用到命令:docker network inspect host none类型 ...
通过前面的一系列学习,我们已经知道怎么制作dockerfile了。那么,本篇文章,咱们就把自己写的spring boot的demo项目,部署在docker上面。 案例目标: 我们自己开发的微服务怎么在docker上面运行呢? 1:通过IDEA新建一个普通的微服务模块 2:通过dockerfile发布微服务部署到docker容器中 创建微服务项目 1:创建一个简单版的spring boot项目。浏览器可以访问。返回任意信息就可以 2:mvn package后将对应项目的jar上传到docker的宿主机中。比如凯哥上传到mydocker文件夹下。 通过dockerfile发布微 ...
虚悬镜像是什么? 答:仓库名、标签都是<none>的镜像,俗称:dangling image 我们使用Dockerfile写一个: 1:编写 from ubuntu CMD echo 'action is success' 2:构建 docker build . 注意没有 -t 产生原因: 1:构建时候因为编写错误导致 2:删除的时候 对于这样的虚悬镜像一定要删除。 查看虚悬镜像命令 docker images ls -f dangling=true 命令结果: 这种虚悬镜像已经失去了存在价值,可以删除。
在上一篇文章中《Dockerfile介绍及常用保留指令》,我们介绍了Dockerfile是什么以及Dockerfile常用的保留字段。熟悉了这些之后,有没有想自己动手写一个Dockerfile呢?本文咱们就实战自己Dockerfile。 案例需求: 我们以远程仓库的centos为模板,制作出代用vim\ifconfig\java8这样的镜像 jdk镜像地址:https://mirrors.yangxingzhen.com/jdk/ 步骤:编写、构建、运行 编写: 准备编写Dockerfile文件。注意:字母D需要大写。 创建文件夹:myfile 然后将下载的jdk-8u171- ...
从本文开始,咱们将介绍docker的另外一个技术点:dockerfile.我们来看看DockerFile相关的知识点,我们将怎么学习? 1:DockerFile是什么? 2:DockerFile构建过程解析 3:常用的保留字指令 4:案例及小总结。如下图: dockerFile是什么? DockerFile是用来构建Docker镜像的文本文件。是由一条条构建镜像所需要的指令和参数构成的脚本。 dockerFile工作图: 构建步骤: 编写DockerFile文件>>docker build命令构建镜像>>docker run 镜像运行 Dco ...
Global site tag (gtag.js) - Google Analytics