- 浏览: 26183 次
- 性别:
- 来自: 杭州
最新评论
文章列表
CountDownLatch源码解析
- 博客分类:
- 多线程
JUC 中倒数计数器 CountDownLatch 的使用与原理分析,当需要等待多个线程执行完毕后在做一件事情时候 CountDownLatch 是比调用线程的 join 方法更好的选择,CountDownLatch 与 线程的 join 方法区别是什么?
日常开发中经常会遇到需要在 ...
ReentrantLock实现原理分析
- 博客分类:
- 多线程
ReentrantLock实现核心–AQS(AbstractQueuedSynchronizer)
AQS,队列同步器,在juc包中的工具类都是依赖于AQS来实现同步控制,看一张AQS的结构图。
同步控制中主要使用到的信息如上图所示。AQS可以被当做是一个同步监视器的实现,并且具有排队功能。当线程尝试获取AQS的锁时,如果AQS已经被别的线程获取锁,那么将会新建一个Node节点,并且加入到AQS的等待队列中,这个队列也由AQS本身自己维护。当锁被释放时,唤醒下一个节点尝试获取锁。
package com.jdbctemplate;
import java.util.List;
import java.util.Map;
public interface JdbcTemplateDao {
/**
* 原生插入
*/
public int insert(String sql);
/**
* 原生插入+参数,采用问号占位符
*/
public int insert(String sql, final Object... args);
/**
* 批量插入,参数为一个LIST包含了多个数组
*/ ...
public interface JRedisService {
/**
*
* @Description (删除键)
* @param key
* @date 2017年12月26日
*/
public void deleteKey(String... key);
/**
*
* @Description (判断key是否存在)
* @param key
* @return
* @date 2017年12月26日
*/
public boolean exists(String key);
/** ...
拦截器和过滤器的区别
- 博客分类:
- Spring
过滤器和拦截器的区别:
①拦截器是基于java的反射机制的,而过滤器是基于函数回调。 ②拦截器不依赖与servlet容器,过滤器依赖与servlet容器。 ③拦截器只能对action请求起作用,而过滤器则可以对几乎所有的 ...
package com.hesc.wpc.common.utils;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java. ...
ElasticSearch下载地址:https://www.elastic.co/cn/downloads/elasticsearch
1.配置elasticsearch
修改一下es使用的参数。编辑config/elasticsearch.yml:
# 换个集群的名字,免得跟别人的集群混在一起
cluster.name: gqm
# 换个节点名字
node.name: node-001
# 修改一下ES的监听地址,这样别的机器也可以访问
network.host: 0.0.0.0
# 默认的就好
http.p ...
<insert id="insertForeach" parameterType="java.util.List">
insert into mb_member_devinfo (id, member_id, name,
phone, org_id, org_name,
stage, state, sort,
createtime, tenant_code)
values
<foreach collection=" ...
1.添加一个队列模拟商品列表 启动redis 输入 rpush str 1 2 3 4 5 6 7 8 9 102.利用多线程模拟 20 个人抢购这 10 件商品:
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig; ...
redis中穿透与雪崩的预防及解决
- 博客分类:
- redis
缓存穿透:
认识
缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时需要从数据库查询,查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
解决办法:
对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃。还有最常见的则是采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个一定不存在的数据会被这个bitmap拦截掉,从而避免了对底层存储系统的查询压力。
也可以采用一个更为简单粗暴的方法,如果一个查询返回的数据为空(不管是数 据不存在,还是系统故障),我们仍然把这个空结果进行缓存, ...
synchronized的用法
- 博客分类:
- 多线程
1.synchronized的几种用法 synchronized关键字最主要有以下5种应用方式,下面分别介绍。 1. 修饰对象普通方法,作用于当前对象,进入同步方法前要获得当前对象的锁 2. 修饰对象静态方法,作用于当前类对象加锁,进入同步该方法前要获得当前类对象的锁 3. 修饰代码块,指定加锁对象,对给定对象加锁,进入同步代码库前要获得指定对象的锁。 4. 修饰 this,指定当前对象,对给当前对象加锁,进入同步代码前要获得当前对象的锁(该方式和方式1作用相同)。 5. 修饰 xxx.class,(该方式和方式2作用相同)。
2.锁竞争说明 同时调用两个都加有synchron ...
1、前言
Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务 器。
Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。
由于Redis的数据都存放在内存中,如果没有配置持久化,redis重启后数据就全丢失了 ...
activemq 基础知识
- 博客分类:
- activemq
activeMQ的三种通讯模式
publish-subscribe
发布订阅模式有点类似于我们日常生活中订阅报纸。每年到年尾的时候,邮局就会发一本报纸集合让我们来选择订阅哪一个。在这个表里头列了所有出版发行的报纸,那么对于我们每一个订阅者来说,我们可以选择一份或者多份报纸。比如北京日报、潇湘晨报等。那么这些个我们订阅的报纸,就相当于发布订阅模式里的topic。有很多个人订阅报纸,也有人可能和我订阅了相同的报纸。那么,在这里,相当于我们在同一个topic里注册了。对于一份报纸发行方来说,它和所有的订阅者就构成了一个1对多的关系。
p2p
p2p的过程则理解起来更加简单。它好比是两个 ...
- 避免使用select *
- count(1)或count(列) 代替 count(*)
- 创建表时尽量时 char 代替 varchar
- 表的字段顺序固定长度的字段优先
- 组合索引代替多个单列索引(经常使用多个条件查询时)
- 尽量使用短索引
- 使用连接(JOIN)来代替子查询(Sub-Queries)
- 连表时注意条件类型需一致
- 索引散列值(重复少)不适合建索引,例:性别不适合
索引原理
本质都是:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。
索引的数据结构 ...
执行效果上:
count(*)包括了所有的列,相当于行数,在统计结果的时候,不会忽略列值为NULL
count(1)包括了忽略所有列,用1代表代码行,在统计结果的时候,不会忽略列值为NULL
count(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null)的计数,即某个字段值为NULL时,不统计
执行效率上:
列名为主键,count(列名)会比count(1)快
列名不为主键,count(1)会比count(列名)快
如果表多个列并且没有主键,则 count(1) 的执行效率优于 count(*)
如果有主键 ...