Clear Blog

Look what's happening here,it's magical

历史搜索记录保存查询实现

因为项目中需要做的人性化,将用户的历史搜索记录给保存下来, 以下是我设计的开发方案,只是简单的根据用户搜索的先后顺序,去重然后留存十个记录。 用到的是redis中list数据结构,通过push,pop操作保证集合中数据是最新的。 代码实现如下: 保存,我使用了springboot自带的线程池来异步保存 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ...

volatile总结

最近又拿起了并发编程的艺术又看了一遍, 随着经验的增长,每次看都有一定的收获,每次都觉得理解的比之前要透彻一点, 故记录下此次复习的一些收获。 在多线程中除了synchronized,volatile应该是最为关键的知识点了。 原子性 先说明下原子性,我之前一直对这个概念,甚至原子性是谁的特性都不是很清楚。 拿volatile int i++计算来说明,++计算其实包含了两个动作,先读然...

IntegerCache

Integer中有个静态内部类IntegerCache,里面有个cache[],也就是Integer常量池,常量池的大小为一个字节(-128~127)。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 private static class IntegerC...

zookeeper实现分布式锁

原理很简单,每个请求去zk中创建临时的顺序节点, 大的节点watch小的节点,当小的节点释放锁的时候会将对应的节点删除, 通知下一个节点获取到锁。 一个简单的实现,上代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 ...

redis实现分布式锁

分布式锁的实现方式有多种,我觉得redis实现起来应该是最方便的,后续我会更新下通过zookeeper来实现分布式锁。 首先看获取分布式锁的代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 /** * 获取分布式锁 * * @param lockKey 锁 * @param requestId 请求表示 * @param expireTime ...

Elasticsearch(1)基本操作

本地运行elasticsearch服务和kibana服务, 在kibana中用dev tools直接操作es。 学习使用API GET _cat/health?v GET _cat/indices?v PUT /test_index DELETE /test_index DELETE /ecommerce 添加index PUT /ecommerce/_crea...

数据迁移以及扩容

数据迁移 停机迁移 在没有流量写入的情况下,后台起一个程序将原库中的数据按照新的路由规则写入到新的库中。 双写 简单来说,就是在线上系统里面,之前所有写库的地方,增删改操作, 除了对老库增删改,都加上对新库的增删改,这就是所谓的双写,同时写俩库,老库和新库。 另外一个有分库分表规则的服务去跑原库中的数据,先去判断当前获取到的数据在新库中是否存在, 不存在就...

策略以及中间件

为何要分库分表 # 分库分表前 分库分表后 并发支撑情况 MySQL 单机部署,扛不住高并发 MySQL从单机到多机,能承受的并发增加了多倍 磁盘使用情况 MySQL 单机磁盘容量几乎撑满 拆分为多个库,数据库服务...

JDK动态代理

代理的目标对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 public class TestServiceImpl implements TestService { @Override public void testA() { testB(); //解决方案1:从Aop上下文获取当前的代理对象 ...

mybatis缓存问题

mybatis中提供一级缓存以及二级缓存。 一级缓存 MyBatis在开启一个数据库会话时,会创建一个新的SqlSession对象,SqlSession对象中会有一个新的Executor对象。 Executor对象中持有一个新的PerpetualCache对象; 当会话结束时,SqlSession对象及其内部的Executor对象还有PerpetualCache对象也一并释放掉。 S...