自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

流的博客

spring全家桶/分布式/hadoop生态

  • 博客(43)
  • 收藏
  • 关注

原创 redis(十二):redis缓存的置换算法、过期策略、缓存击穿等问题

1.缓存更新策略(1)LRU:最近最久未被使用的页面置换出去(LinkedHashMap就是对LRU的实现)下面借用了图来说明LRU的整个页面置换过程:https://blog.csdn.net/u013700358/article/details/85873397如图是按照70120304的顺序加入栈中的数据。(2)LFU:最近最少使用的页面置换出去(3)FIFO:最先进入的页面有限...

2019-09-30 18:11:40 1112

原创 redis(十一):redis cluster[2]

1.集群的扩容就是集群的节点的上线和下线,因为槽和数据一一对应,又新节点的加入必定导致槽的变化,故数据也会产生迁移。(1)先启动两个新的节点 6385和6386,但这两个节点还没有加入集群(2)meet(3)redis-trib命令来新加入一个节点和meet操作(4)迁移槽的命令(5)迁移槽的流程图2.集群的收缩(1)下线槽(2)忘记节点(60s内如果与节点A关联的...

2019-09-27 22:56:17 211

原创 关于秒杀场景的全面分析总结

1.技术层面1.高访问压力隔离将秒杀系统独立部署,甚至使用独立域名,使其与网站完全隔离。2.用户在秒杀开始前,通过不停刷新浏览器页面以保证不会错过秒杀.但是持续刷新商品页面详情页会对服务器造成压力重新设计秒杀商品页面,不使用网站原来的商品详细页面,页面内容静态化(静态在CDN或客户端),用户请求不需要经过应用服务。而是静态页面,秒杀按钮在秒杀开始前无法点击。3.突然增加的网络带宽:主要是...

2019-09-27 13:50:49 2441

原创 redis(十一):redis cluster[1]

1.hash取余增加一个节点,数据迁移量接近百分之80多倍扩容减少数据迁移量(也就是node增加数量直接增加1倍或多倍)2.一致性hash我们做一个token环,n1到n4一共4个节点平均管理这2的32次方个token。增加一个节点5,n1,n3,n4不会受到影响,只有n2上的数据才会被部分受到影响。特别别是当节点有1000个节点时,收到的节点小于1000分之1.缺点:这种做法...

2019-09-25 21:50:54 172

原创 关于为什么ReentrantLock不是乐观锁的一些猜想

1.众所周知,ReentrantLock是一个悲观锁,但是查看源码,发现底层实现使用的是compareAndSet相关方法实现的,于是产生疑问:为什么ReentrantLock使用的和CAS一样的compareAndSet相关的方法实现的,CAS确实乐观锁,ReentrantLock却是悲观锁?猜想一:仔细看代码发现ReentrantLock使用了setExclusiveOwnerThread...

2019-09-23 20:47:23 9519 4

原创 关于一个秒杀业务的思考

一个秒杀的业务如下:public Result execMiaoSha(Long goodsId,User user){ //判断user是否秒杀过goodsId的商品 if(redisDao.get(Prefix.goodsAndUser+goodsId+user.getId)!=null){ throw GlobalException("不可以重复秒杀");...

2019-09-20 15:14:18 213

原创 netty(八):AttributeKey和AttributeMap实现不同channelContext中传递数据

1.AttributeMap在netty4中将数据保存在channel中使用的是AttributeMap,如图,因为AbstractChannelHandlerContext实现了ChannelHandlerContext,而ChannelHandlerContext继承了AttributeMap。故ChannelInboundHandlerAdapter实现了AttributeMap,可以把...

2019-09-19 18:17:07 2632

原创 netty(七):断线重连和心跳

1.客户端客户端调用了系统的API,利用WriteTimeoutHandler(3)实现心跳检测,自定义的ClientTimerHandler只是实现了读取数据的作用。package com.qianliu.server;import io.netty.bootstrap.ServerBootstrap;import io.netty.channel.ChannelFuture;imp...

2019-09-19 17:52:24 283

原创 ReentrantLock对AbstractQueuedSynchronizer的使用

1.ReentrantLock的骨架由ReentrantLock的目录结构可知,ReentrantLock有三个内部类,Sync,FairSync,NonfairSync。其中FairSync,NonfairSync继承了Sync,Sync继承了AbstractQueuedSynchronizer。FairSync和NonfairSync也就是我们常说的公平锁和非公平锁。公平锁和非公平锁的...

2019-09-19 17:25:33 248

原创 redis(十):redis Sentinel

1.主从复制的问题

2019-09-19 15:51:15 187

原创 redis(九):redis主从复制

1. 主从复制模型从节点会复制主节点的内容。防止主节点宕机了,从节点可以生效。主节点set hello,从节点中可以get hello获取值。通过slaveof命令可以让某个节点成为从节点。同样的,使用slaveof no one可以取消成为从节点。2.全量复制runid:服务器的唯一标识offset:数据的偏移量,从节点定期向主节点汇报偏移量,主节点以此判断主从节点的数据是...

2019-09-19 11:56:48 145

原创 redis(八):redis持久化AOF和RDB

1.两种持久化方式2. RDBRDB是使用二进制文件生成文件的快照,保存到磁盘中。三种触发RDB的方式:save(同步):等生成快照成功在执行其他命令。会造成阻塞redisbgsave(异步):执行完成以后返回"ok",然后开启一个单独线程生成快照。如果开启子进程的时间阻塞会较慢,一般fork子进程都很快。自动:达到某个条件以后自动生成RDB文件。下面是一个rdb的配置,第一行表示9...

2019-09-19 11:14:18 89

原创 redis(七):redis的一些特殊功能-慢查询、订阅发布、位图、hyperloglog、GEO

1. 慢查询如图,这是客户端请求服务器端的一个生命周期。慢查询是指,查询命令的执行时间较慢,超过了设定好的阈值(系统默认10s)。像我们使用的keys *命令就很有可能导致慢查询。慢查询队列的两个参数:slowlog-log-slower-than:表示队列的阈值,单位微妙slowlog-max-len:表示慢查询队列的长度慢查询命令2. 发布订阅模型开启一个窗口订阅alib...

2019-09-19 10:20:59 102

原创 redis(六):redis的zset(有序集合)

1.zset的结构相比于set,zset中会有一个score属性,用于set的排名。2.zset的操作zadd:向zset中添加元素(sorce value)zrem:删除elementzscore :获取scorezincrby :增加scorezrange :获取数据,start到endzrank:通过下标获取排名127.0.0.1:6379> zadd key1 1...

2019-09-18 17:48:21 190

原创 redis(五):redis的set

1.set的操作sadd增加元素srem删除元素scard 求set的长度sismember查询某一元素是否存在与set中127.0.0.1:6379> sadd key1 a(integer) 1127.0.0.1:6379> srem key1 b(integer) 0127.0.0.1:6379> sadd key1 a b c d e f g(inte...

2019-09-18 17:26:31 141

原创 redis(四):redis的list

1.集合的操作rpush:从在右边开始插入lpsuh:左边开始增加linesert:在某个value之前/之后插入新的valuelrange:从左到右列出所有的value,范围是start到end(end为-1表示最后一个数据)127.0.0.1:6379> lpush key1 value1(integer) 1127.0.0.1:6379> rpush key1 va...

2019-09-18 17:13:07 195

原创 redis(三):redis的hash

1.hash操作尽量少使用夏敏的命令,数据太大,执行太慢。hmset给某个key设置一个maphgetall:获取某个map的所有key和valuehvals:获取某个map的所有valuehkeys:获取某个map的所有key127.0.0.1:6379> hmset test key1 value1 key2 value2 key3 value3 key4 value3OK...

2019-09-18 16:30:48 111

原创 redis(二):redis的String

1 .String–内部构造对于String类型的value:1.可以存放整数类型,在操作的过程中redis会自动做出类型转化。2.redis中的位图也是使用字符串实现的3.value可以是用json串存放一个对象2.String–操作get,set,del三种操作。详情见: https://blog.csdn.net/qq_35688140/article/details/100...

2019-09-18 16:13:20 101

原创 redis事务和redis分布式锁(悲观锁和乐观锁)

1.redis事务-mutil/execredis中mutil是事务的开始,exec是事务的结束127.0.0.1:6379> MULTIOK127.0.0.1:6379> set hello 1QUEUED127.0.0.1:6379> set hello 2QUEUED127.0.0.1:6379> set hello 3QUEUED127.0.0....

2019-09-18 15:22:07 2677

原创 redis(一):redis的特性,常用命令,内部结构

1.redis的特性(1)速度快:主要是依赖内存的高速度(2)可以持久化:AOF和RDB(3)多种数据结构:(4)支持高可用和分布式:在redis2.8支持sentinal和在redis3.0以后就cluster支持分布式2.redis的返回值(1)状态回复:ping -> pong(2)错误回复:hget hello world -> [ERROR](3)整数回复:i...

2019-09-18 14:48:17 214

原创 redis分布式锁的应用和zookeeper分布式锁的应用

利用SETNX+EXPIRE实现分布式锁。SETNX:如果key不存在,那么就新增一个<key,value>,如果key存在,则不做任何操作。EXPIRE:为了防止网络拥塞,A拿到锁以后迟迟无法释放,故设置超时时间。防止B一直等待该key,A迟迟无法释放而出现死锁。思路:1.给userId+itemId形成的组合key设置一个value,设置成功就设置一个超时时间。2.如果设...

2019-09-17 15:04:34 243

原创 从01背包问题论回溯和动态规划

1. 回溯问题回溯就是穷举法的一种,也就是举出所有可能性。回溯法的思路:1.如果当前节点放入数据An满足要求,那么继续检查下一个节点是否可以加入A1-An中的其他数据2.如果当前节点不满足要求,直接放下一个数据An+1下面是八皇后的一种深度优先遍历实现。所有的回溯法都满足该框架。void backtrack (int t){ if (t>n) //放完八颗棋子,输出结果...

2019-09-15 21:32:36 684

原创 java并发(十):高并发常用缓解技术

1.扩容例如存储资源mysql无法满足高并发要求。增加读性能:memcahe,redis,CDN缓存等。增加写性能:habse2.缓存(1)本地缓存:Guava CacheGuava Cache类似于cocurrentHashMap,每个节点存储的数据达到上限使用LRU置换算法。(2)分布式:memcache,redismemcache: 每次客户端请求数据,才有 ip一致性算法...

2019-09-12 18:04:21 400

原创 java并发(九):hashmap扩容时出现循环链表(jdk1.8把头插法换成了尾插法的原因)

1.容量计算容量的阈值=容量*加载因子2.扩容容量扩容的容量大小会变成原来的两倍,用位移运算来加快计算的运行速率。3.单线程下的rehash1.初始化长度为2,加入11时开始扩容,数组长度变为原来的两倍2.依次加入2,9,11三个节点。4.多线程多线程操作rehash形成环。jdk1.8为了避免上述情况将头插法变幻成了尾插法。形成环以后,查找数据容易出现死循环。...

2019-09-12 15:52:11 7319 7

原创 java并发(八):fork/jion机制

1.工作窃取算法每个线程有一个工作队列,线程1有一个工作队列1,线程2有一个工作队列2,当线程1将队列1中的任务执行完了以后就窃取队列2中的任务去执行。执行任务的队列从头到尾执行,窃取线程从尾部向头部执行任务。优点:充分了用线程的执行时间,且减少了资源抢占的情况。(每个线程的资源独立)缺点:会创建多个线程队列。而且当多个线程执行到最后只有一个任务的时候可能存在抢占资源的情况。2.代码...

2019-09-12 14:07:18 226

原创 面试真题(多线程交替打印ABC,中间变化打印顺序)

1.题目线程1只打印t1,线程2只打印t2,线程3只打印t3,控制他输出t1,t2,t3这样5遍,然后t2,t3,t1打印,最后t3,t1,t2之后一直循环。2.思路有关多线程的知识不明白的可以参考:https://blog.csdn.net/qq_35688140/article/category/9322916第一步:这个题第一眼有点类似于常见题“两个线程循环打印AB”,然后可以利用...

2019-09-12 11:27:49 704

原创 java并发(七):同步容器和集合类并发容器(J.U.C)

1. Collections.synchronizedList利用同步容器Collections.synchronizedList来将一个线程不安全的类转化成为一个线程安全的集合。线程同步容器都是通过sychronized方式实现的。@Slf4j@ThreadSafepublic class CollectionsExample1 { // 请求总数 public st...

2019-09-11 15:48:09 224

原创 java并发(六):四种引用类型和ThreadLocal

1. final关键字2. 线程封闭4. 四种引用类型参考了:https://www.zhihu.com/question/37401125强引用是使用最普遍的引用:Object o=new Object(); 特点:不会被GC将对象的引用显示地置为null:o=null; // 帮助垃圾收集器回收此对象。软引用用来描述一些还有用但是并非必须的对象,在Java中用java.lang...

2019-09-10 21:13:43 253

原创 java并发(五):安全的发布对象(多种单例模式的实现)

1. unsafePublish发布对象unsafePublish发布对象时,其他类可能会调用其中的共有getStatus方法来改变私有成员states的值。(不安全)@NotThreadSafe@Slf4jpublic class UnsafePublish { private String[] states = {"a","b","c"}; public Strin...

2019-09-10 21:02:00 147

原创 java并发(四):volitale和happen-before原则

1.valatile保证可见性2.写屏障写屏障保证写完前后的数据都刷新到了主存,这样主存中去读取的数据都是最新的数据(不会存在脏数据)。3.读屏障读屏障保证读取之前的数据是最新的数据。4.valitale无法保证原子性修改数据分为3步:1.读取count2.count++3.回写count因为有可能线程1拿到count阻塞,线程2就算拿到最新的数据,但是线程1进行coun...

2019-09-10 17:17:05 228

原创 synchronized作用范围(static修饰sychronized)

@Slf4jpublic class SychronizedExample1 { //test1方法和test2方法的作用是一样的 public void test1(int j){ synchronized (this){ for (int i = 0; i <10 ; i++) { log.info(...

2019-09-10 14:10:12 701

原创 java并发(三):atomic和LongAdder

1.AtomicInteger原子类改写上一节我们使用的代码(上一节:https://blog.csdn.net/qq_35688140/article/details/100629270)此时我们将上一节的int变成了AtomicInteger:@ThreadSafepublic class CountExample2 { // 请求总数 public static i...

2019-09-09 21:36:48 291

原创 java并发(二):CountDownLatch和Semaphore

1. CountDownLatch通过传入的num来给计数器赋初值,CountDownLatch countDownLatch = new CountDownLatch(num);通过下面的代码来减少计数器的数值countDownLatch.countDown();通过await方法等待计数器变为0countDownLatch.await();//等待计数器变为0CountDo...

2019-09-08 15:45:22 155

原创 java并发(一):缓存MESI协议,JMM

一、多级缓存现代CPU已经是多核处理器居多,加上主存的速度没有CPU快,很多时候,CPU需要等待主存。多级缓存的作用就是一个高速缓存区,来缓解这种速度上的差异。在程序执行中,主存中的数据可以放在高速缓存区中,让CPU去执行。但是高速缓存区空间较小,它的空间远远小于主存。缓存区就变成存放常用数据的存储区了。二、多级缓存一致性协议:MESI此处参考的资料:https://blog.csd...

2019-09-07 17:01:55 927

原创 四种常见线程池的使用

1.newSingleThreadExecutor 创建一个单线程化的线程池,它只会用唯一的工作线程来执行任务,保证所有任务按照指定顺序(FIFO, LIFO, 优先级)执行。2.newFixedThreadPool 创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待。3.newScheduledThreadPool 创建一个定长线程池,支持定时及周期性任务执行。4.n...

2019-09-05 11:29:41 442

原创 公平锁和非公平锁,可重入锁和非可重入锁,独享锁和共享锁

1.公平锁先进入等待队列的线程先获得锁。2.非公平锁每次抢占锁的时候无论先后顺序,谁拿到就归谁所有。优点: 非公平锁是多个线程加锁时直接尝试获取锁,获取不到才会到等待队列的队尾等待。但如果此时锁刚好可用,那么这个线程可以无需阻塞直接获取到锁,所以非公平锁有可能出现后申请锁的线程先获取锁的场景。非公平锁的优点是可以减少唤起线程的开销,整体的吞吐效率高。缺点: 处于等待队列中的线程就算先到也...

2019-09-04 20:44:09 951

原创 synchronized关键字:无锁 VS 偏向锁 VS 轻量级锁 VS 重量级锁

1.简介synchronized是一个jvm层次的关键字,可以同步某一段代码。与ReentrantLock不同,它不可被中断。synchronized的四个演变阶段: 无锁->偏向锁->轻量级锁->重量级锁下面是一些相关知识:MonitorMonitor可以理解为一个同步工具或一种同步机制,通常被描述为一个对象。每一个Java对象就有一把看不见的锁,称为内部锁或者Mo...

2019-09-03 21:09:11 2271 2

原创 自旋锁和互斥锁

1.自旋锁:自旋锁会在抢不到cpu的时候一直去重试,如果我们可以保证在很短的时间就可以抢占到cpu的使用权,这种方式就可以便面我们sleep以后再启动带来的线程切换开销。while(getLock(lock).isfail){}自旋锁的使用:下面这一段就是Unsafe的getAndAddInt方法,while(!this.compareAndSwapInt(var1, var2, var5...

2019-09-03 20:40:45 103

原创 悲观锁和乐观锁

悲观锁:认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。乐观锁:认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有别的线程更新了这个数据。如果这个数据没有被更新,当前线程将自己修改的数据成功写入。CAS就是我们常见的一...

2019-09-03 20:26:48 108

原创 List系列:Collections.synchronizedList与CopyOnWriteArrayList比较

1.Collections.synchronizedListCollections.synchronizedList可以将一个不安全的list变成安全的list。ArrayList arrayList = new ArrayList();List list2 = Collections.synchronizedList(arrayList);add方法:通过关键字synchronize...

2019-09-03 20:07:19 977

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除