- 博客(204)
- 资源 (19)
- 问答 (1)
- 收藏
- 关注
原创 数据库和缓存双写一致性方案
常用的双写一致性策略通常我们使用数据库和缓存的套路是这样的。查询先查询缓存,如果不存在;则查询数据库,并更新缓存。更新更新策略则有很多版本,大体可以总结为以下三种:方案一:先更新数据库,再更新缓存方案二:先清除缓存,再更新数据库方案三:先更新数据库,再清除缓存分析三种方案的利弊先更新数据库,再更新缓存假设我们有这么一个场景:线程A更新数据库。如: (update A...
2019-12-04 22:02:33
571
原创 【elasticSearch学习与实践】elastic stack环境搭建(7.3)
elastic stack的介绍在elastic架构下面有:elasticsearch、kibana、logstash(俗称ELK)和beats。他们的介绍依次如下:我对elastic stack的理解图片来自网络elasticsearch是一个分布式搜索引擎,通过指定的_index可以快速搜索到需要的内容。通常用于日志搜索和电商商品搜索等大数据搜索。它的优点:支持re...
2019-10-04 08:32:33
731
原创 【Redis】Redis布隆过滤器
缓存击穿介绍什么是缓存击穿我们通常使用redis作为数据缓存,当请求进来时先通过key去redis缓存查询,如果缓存中数据不存在,需要去查询数据库的数据。当数据库和缓存中都不存在的数据来查询时候,请求都打在数据库的请求中。如果这种请求量很大,会给数据库造成更大的压力进而影响系统的性能。解决这类问题的方法方法一:当DB和redis中都不存在key,在DB返回null时,在redis中...
2019-05-18 08:57:59
6951
1
原创 【分布式锁】Redis实现分布式锁
在分布式应用中常会遇到并发问题,例如:一个用户在同一之间内创建多个订单;执行订单修改状态,需要查询订单并更新订单状态,这是非原子性操作,存在并发问题。以上的问题需要通过分布式锁来解决。常用的分布式锁有两种分别是基于redis和zk来实现的,下面会分别介绍一下。redis分布式锁使用分布式锁的流程如下所示:下面主要基于单节点的redis服务进行分析:tryLock通常使用setnx(se...
2019-05-12 11:11:30
329
原创 junit单元测试web项目的方法
在项目开发中,常通过junit单元测试来测试自己方法逻辑。下面主要展示,junit测试web项目的方法步骤。包括service、dao层的方法和使用Mock测试cotroller层的方法。以下测试用例时基于公司的项目展示的,所以不便于粘贴所有的源码junit测试环境依赖<dependency> <groupId>junit</groupI...
2019-02-23 13:22:46
8187
原创 jvm虚拟机模型实例演示
通过一个代码实例,来说明变量,方法,对象和类之间在jvm所存放的位置。public class JvmHeapStackDistribute { public static void main(String[] args) { Program program = new Program("java"); program.sayHello();...
2018-03-13 15:41:25
470
原创 idea创建maven工程的spark项目
idea工具可以创建maven工程的spark项目,今天就试着做了一下,然后写了一个基于集合创建RDD的小的demo,并且遇到了不少的坑,在这里总结一下。创建maven工程的spark项目 这个项目是机遇scala语言进行开发的 下面是截图步骤 基于集合创建RDDobject RddBasedOnCollections { de
2017-12-17 17:36:00
1760
原创 windows环境下安装spark
前言 花了近两周的时间学习了scala的语法,然后就迫不及待的想要玩一下spark的开发了。这里先介绍一下spark在windows环境下的安装步骤和方法。 因为spark大数据的计算肯定是基于分布式集群的方式才能发挥其巨大的作用,所以,在windows环境下学习大数据,只是纸上谈兵的方式。因为环境的限制,所以只能在现有的电脑上进行大数据的学习,先了解spark的API吧!先把原
2017-11-20 22:04:51
5526
原创 linux环境指令总结(针对服务器环境部署的指令)
前言在使用linux系统进行服务部署时候,难免会用到常用的linux指令。但是有时候,有些指令不知道如何使用,最近也是在玩部署的时候发现自己对linux指令的不了解,但是最后通过查资料也学到了不少的linux常用指令。在这里做一个总结吧,难免以后会再用到。ssh登录语法说明(p为小写)ssh -p 端口 用户名@IPssh -p 5188 support@127.0.0.1
2017-11-10 10:46:15
1724
原创 springboot配置Redis主从服务
今天学了一下springboot配置redis的主从服务器。根据一主二从三哨兵的原则来搭建一个分布式的缓存服务。主要还是针对redis的一些配置。下面与大家分享一下! 附上对redis的官方介绍 http://redis.majunwei.com/topics/sentinel.html 要想通过springboot搭建redis主从服务,就要先使用redis配置一个主从服务。测试red
2017-09-25 19:55:06
32143
6
原创 Springboot中Spring-cache与redis整合
也是在整合redis的时候偶然间发现spring-cache的。这也是一个不错的框架,与spring的事务使用类似,只要添加一些注解方法,就可以动态的去操作缓存了,减少代码的操作。如果这些注解不满足项目的需求,我们也可以参考spring-cache的实现思想,使用AOP代理+缓存操作来管理缓存的使用。 在这个例子中我使用的是redis,当然,因为spring-cache的存在,我们可以整合多样的缓
2017-09-24 18:42:00
27826
16
原创 Springboot整合Redis缓存
springboot提供了spring-data-redis的框架来整合redis的操作。下面主要介绍,springboot整合redis的配置,以及spring-data-redis是如何提供便捷的操作来处理redis。 1. redis环境准备在使用redis之前需要先安装redis数据库,具体的安装流程可以参考 http://blog.youkuaiyun.com/u011521890/article
2017-09-23 14:43:58
7827
1
原创 java多线程之Lock介绍
java.util.concurrent包中有关于Lock显示锁的定义。它提供了ReentrantLock、ReetrantReadWriteLock.ReadLock 和 ReetrantReadWriteLock.WriteLock,重入锁、读锁和写锁等。ReentrantLock公平锁和非公平锁Lcok与synchronized的区别lock是显示的锁,调用lock()
2017-09-19 22:19:23
568
原创 java线程池介绍(一)
今天看了一下java并发包中的API,这里做一个总结。 首先我们先看一下,java线程池相关的类以及他们的关系uml图 从类图和源码中可以了解到,Executors类是提供线程池创建的类,而Executor系列的类则是提供线程池所有用的行为。例如execute、submit、shutDown等 Executors类中提供四种创建线程池的静态方法。创建线程池的几种方式创建缓存线程池
2017-09-14 21:58:13
594
原创 synchronized的介绍
我对synchronized关键字算是很熟悉的了,但是有些时候一些概念还是没有搞明白,今天通过对wiki翻译以及博客的学习,从概念和类别上对其进行区分,并整理了一套自己的理解方式。从类别来区分从类别上可以将锁分为类级别锁和对象级别锁 1. 类级别锁,作用于整个类的的同步锁,例如Object.class 2. 对象级别锁,new Object()产生的锁,不同的实例所持有的锁是不同的
2017-09-12 21:42:48
529
原创 java多线程方法的总结
interrupt、isinterrupted、interrupted的区别从结论上来区分interrupted() 是Thread类的静态方法,测试当前线程是否已经中断,线程的中断状态也是由该方法清除。isInterrupted() 测试线程Thread对象是否已经处于中断状态。但不具有清除功能interrupt() 中断线程的方法,并不能真正中断线程,只是设置了一个中断标志
2017-09-12 21:07:51
399
原创 javaIO的装饰者模式
装饰者模式的uml通过继承和组合的方式类设计对象的修饰作用在继承的基础上,通过引用让对象具有多重修饰(拥有其他子类的方法和修改)的特性。 这个类图是《Head first 设计模式》上的例子 装饰者的魔力主要在于CondimentDecorator的身上,它是抽象的装饰者类。继承CondimentDecorator在构造方法上都引用了Baverage抽象类。抽象的Beve
2017-09-11 10:10:54
363
原创 java中的观察者模式
最近在学习《head first 设计模式》,站在巨人的肩膀上学习设计模式,一定会有很大的收获。通过了解设计模式的uml图,来看java源码,让我对java中的一些实现又多了更深层次的了解。在这里,也记录一下学习历程,并与大家分享学习心得。观察者模式的类图观察者模式运用接口和组合的方式来进行设计。类似于报纸的订阅,被订阅信息称为主题(Subject),订阅者称为观察者。当主题有更新时,会通知观察
2017-09-10 11:00:30
309
原创 zookeeper与dubbo结合实例
dubbo是阿里开源的一个分布式服务框架,使用它可以完成远程服务调用(RPC)。今天来写一下这种分布式开发的demo RPC可以简单理解为,两个不同工程之间代码的中的方法相互调用的过程。 实现的基本过程:建立两个java工程provider(生产者)和consumer(消费者),一个provider负责提供服务(service),另一个consumer可以调用provider提供的服务
2017-08-13 18:38:28
607
原创 zookeeper的环境搭建
zookeeper是hadoop大家族的一个成员,是Apache的一个产品。我使用到zookeeper的主要原因是:Zookeeper作为Dubbo服务的注册中心,能与dubbo做到集群部署。当提供者出现断电等异常停机时,Zookeeper注册中心能自动删除提供者信息,当提供者重启时,能自动恢复注册数据,以及订阅请求。关于zookeeper的介绍和原理http://blog.youkuaiyun.com/guc
2017-08-13 18:11:26
375
原创 Java虚拟机模型
内容参考自《深入理解java虚拟机》虚拟机的模型图程序计数器程序计数器是一块较小的内存空间,可以看做是当前线程所执行的字节码的行号指示器。字节码解释器工作就是通过改变这个计数器的值来选取下一条需要执行的字节码的指令,例如分支,循环,跳转,异常处理,线程恢复等功能。每条线程都有一个独立的程序计数器,各条线程之间计数器互相不影响,独立存储。是“线程私有”的内存。 如果线程在执行java方法,计数
2017-07-30 12:33:01
1120
原创 mysql分区实践
数据库中的数据达到一定上限时候,表查询会很慢。我们常使用的策略就是对数据库进行分表(大表分成多张小表)、分区(大表拆分成区)。 下面主要介绍分区的几种方式和具体的实现mac进入mysql命令模式查找mysql安装路径:find /usr/ -iname "mysql"设置mysql的别名alias mysql='/usr//local/mysql-5.6.35-macos10.12-x86_6
2017-07-20 23:38:36
678
原创 maven多实例打包
在项目开发中,会经常遇到不同环境(开发环境、测试环境、生产环境)的配置信息(数据库配置,url路径配置等)不同的情况。然后,我们的测试环境和生产环境要分别进行打包。这时候,就要用到maven的profile、filter和resource。maven标签的含义profile主要是定义工程中多实例的名称。 一个版本实例可以用标签来写,例如:<!-- 多实例版本 --> <profiles>
2017-07-15 00:09:03
420
原创 使用拦截器(intercept)和AOP写操作日志-springboot
写用户的操作日志,使用拦截器还是使用aop的方式呢?纠结了好久, 先是使用拦截器的方式,写了一半,发现好多参数没法获取,感觉比较麻烦。 后来又换做aop的方式。再后来,发现两种方式其实都可以。对于一些 自定义的参数,可以写一个注解来解决。 以下是两种方式的总结:日志拦截器方法1.创建拦截器类public class LogInterceptor implements Han
2017-07-11 18:52:08
19375
2
原创 springboot使用pageHelper分页插件
maven引入pageHelper<!-- https://github.com/pagehelper/Mybatis-PageHelper --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId>
2017-07-08 18:15:00
10137
原创 跨域访问sessionid不一致问题
在开发过程中遇到这么一个问题,让我花了一个下午的大好时光才解决。但是解决玩之后,发现那么的容易。就是查找资料的时候很费劲。这里把问题记录一下。问题的产生流程是这样的,要做一个用户登录的接口。在登录页面,前端先请求验证码,然后输入用户名密码和验证码之后,请求登录接口。这里存在两个接口,验证码接口和登录接口。在验证码接口中我用session保存验证码,在登录接口中我从session取出验证码进行校验
2017-07-02 19:09:54
55284
6
原创 springMVC设置不拦截静态资源
最近在开发过程中遇到一些关于springmvc配置的问题,这个是之前没有注意到的,也是一个坑吧。在这里记录一下,避免以后再次入坑。同时也与大家分享下解决方案。问题产生我在jsp文件中引入一个静态的js文件 文件目录在webapp下面的js文件夹中。 <html><script src="js/login.js"></script><body onload="login()"><h2>Hel
2017-06-18 17:58:02
22073
1
原创 接口开发经验之谈
前言:现在开发中常使用前后端分离,后台开发使用springMVC框架进行后台接口的开发。经过最近的开发对接口开发有了一些新的体会,在这里做一下总结。 希望能和大家交流一下,并能吸取更多接口开发方面的经验。接口开发格式的封装返回接口的格式要有固定的格式,这样前端人员能够进行规律的解析。例子{ "code": 0, "msg": "成功", "data": {}}这样的格式是长使用的
2017-05-06 15:49:40
18987
1
原创 excel导入导出工具类
Excel导入功能导入功能是将excel中的数据转换成对应的javaBean。实现思路使用poi读取excel表格获取每行表格中的单元格信息,将单元格中的数据存入到对应的javaBean中。写一个注解类来标注javaBean中的那个属性要与Excel中的数据进行对应。运用java反射来获取javaBean中的注解属性。代码实现 public class ImportExcelUtil {
2017-04-26 18:18:10
2648
1
原创 quartz1.8+spring2.3.9实现从数据库中读取定时任务
环境配置quartz1.8和spring3.2.9。 quartz2.0以上和之下的版本差别有些不同。 我使用的是1.8版本的。数据库建表语句CREATE TABLE `report_tasks_manager` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id', `task_desc` varchar(255) DEFAULT
2017-03-19 22:24:59
10122
1
原创 Mysql索引的使用
最近想总结下mysql索引的知识点,搜索资料后发现,mysql索引是个很大的学问。今天就在应用层面去学习如何使用索引, 如果想深入理解索引,可以问问我们强大的百度… 索引是帮助mysql高效获取数据的数据结构。一、按类型区分索引类型:定义表索引的类型normal索引是最近本的索引,没有对唯一性的限制unique索引和normal类似,只是索引列的全部值必须只能出现一次full text索引用于m
2017-03-12 10:41:19
2248
原创 zk-web应用型框架学习(一)
zk是一个可以与java语言进行交互的web应用型框架,使用zk框架,一定程度上免去写javascript代码,而且能够很好的完成界面的交互。 类似于Android应用,它的前端布局也是一系列的控件,并且可以绑定一些事件。1.eclipse下搭建zk环境在 help–>install new software中加载插件 链接地址:http://studio.zkoss.org/resource/
2017-02-22 14:38:03
8320
1
原创 接口安全--http数字签名
为了保证http请求数据的安全性和防篡改性。我们通常要对请求参数进行一些加密。 加密规则可以根据双方接口协商定义。这里举一个常用的加密协议例子。1. sign加密协议接口协议中通常会提供一个 appKey作为唯一的标识。 appSecret作为接入密钥。 例如:appkey=hh appSecret=39ertfefdsg406c7c36592d42022aaecc 请求路径 http:/
2017-02-17 12:15:00
12878
2
原创 Redis的事务处理
Redis的事务操作multi 开启事务exec 提交事务discard取消事务127.0.0.1:6379> multi OK127.0.0.1:6379> set djk fdjsQUEUED127.0.0.1:6379> set djklg djglQUEUED127.0.0.1:6379> discardOK127.0.0.1:6379> exec(error) E
2017-01-23 11:15:16
1494
原创 Jedis使用API
环境配置需要导入jedis.jar包启动redis服务。代码测试连接redisJedisPool jPool = new JedisPool("localhost",6379);Jedis jedis = jPool.getResource();jedis.set("date", "2017-01-19");jedis.set("work", "coding");System.out
2017-01-22 17:32:52
5184
原创 Redis安装与基本使用
什么是RedisRedis是一个内存高速缓存数据库,用C语言编写,数据模型是Key-Value 支持丰富的数据结构类型,比如String,list,hash,set,sorted Set。可持久化,保证数据安全! 缓存分为 数据缓存和页面缓存。 类似于新闻列表等的网站适合做页面缓存,而商品展示页面适合做数据缓存。Redis属于数据缓存的范畴。Redis和memcache比较Redis
2017-01-07 16:33:07
1212
原创 Spring与JDBC整合
Spring与JDBC的整合过程原理:将DataSource传给JdbcTemplate。1. 导入数据库连接池的jar包和连接数据库的驱动包(这里使用的dbcp数据库连接池)配置文件中注入dataSource<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/bea
2016-12-10 16:27:32
3035
原创 多线程并发库(一)
ThreadLocal是线程局部变量。在多线程中,实现每个线程中变量的私有性。例子一在该例子中,在同一个线程中通过调用类A和类B的getData()方法获取的数据是一致的。public class ThreadLocalTest {static ThreadLocal<Integer> threadLocal = new ThreadLocal<>();public static void ma
2016-12-02 09:15:35
1135
原创 springAOP之动态代理(三)
AOP的相关概念这里面的名词解释,可以结合上一章的内容(模拟Hibernate的事务处理和查看工资)来进行理解。1. 切面 日志、安全性、权限类以及事务类,总之和业务逻辑没有关系的都可以做切面2. 通知 切面中的方法。例如:事务中的beginTransaction和commit方法3. 切入点 只有符合切入点,才能把通知和目标方法结合起来。例如:代理的判断语句if("ad
2016-11-20 16:10:13
557
原创 springAOP之动态代理(二)
JDK提供的代理类用动态代理管理Hibernate的事务处理(模拟)Person类public class Person {private String name;private long pid;public String getName() { return name;}public void setName(String name) { this.name = name;
2016-11-18 09:21:51
488
java程序能通过编译却运行成功
2013-09-08
TA创建的收藏夹 TA关注的收藏夹
TA关注的人