- java自加减[++,--]操作不是单个操作,包含三个独立操作: 读取value, 将value加1,将结果写入value. 所以存在线程安全问题.
- 如果你频繁要切换数据库,用hibernate/jpa 肯定比mybatis方便了.
hibernate代码写起来快,好维护,以前公司用hibernate,后来加入了mybatis混合写,普通接口用h,性能接口用m. hibernate有个不好的地方就是 select 的 projection 不能动态传入,导致 where 条件经常重复写,例如 findById. hibernate 背后是 JPA,可惜 JPA规范只给出了 Interface 和 Class DTO 允许泛型传入. 但是最理想的结果还是传入 字段名称,用字符串数组传入, 例如 findById(String id, String...fields). 例如 findById(String id, String...fields). - 《图解Java多线程设计模式》对于多线程初学者挺有帮助.
- DDD红皮书《实现领域驱动设计》最精华的部分是 战略篇,里面的各种架构 建模方法论比IDDD要详细多了。
- 用二进制存储存储数据比存文本更节省空间, hadoop也是用streaming把二进制处理为正常字符串放到hdfs. [ip用二进制存全球ip也就几十m, 说实话 tcp/IP协议 里面 ip就是2进制做的 是最符合这个业务本身的设计,变成点分形式 只是为了 可读, 尤其是 当你需要 4网划分的时候 你会发现 用字符串处理 的代码量是2进制的10倍还多,而且不好读]
- update比insert慢多少了?
insert 如果是ssd盘 tps有12000, update 只有 5000, 如果是 stat盘 insert tps是8000, update只有3000. - 用国际通信区域码做国际化是有坑的, 因为北美的手机国际码都是一样的(通行码一致, 但是使用的语言并不一样).
- Spring会检测要代理的类是否有实现接口来选择是使用cglib proxy还是jdk proxy.
- parallelStream 是给Map Reduce操作做多线程处理, 是并发处理集合元素的回调, 普通的stream只能线性处理, 具体可以看看算法导论的多线程算法, 一般集合size很小,就不需要用 parallelStream, 一般web应用都不会用到 并行流. 只有纯cpu任务建议使用parallelStream.
- exit 0和 非0都是跟linux操作系统有关, 对于linux来说非0都是代表执行不成功,操作系统会记录日志, 良好脚本边写习惯就是在最后return 0,代表执行成功,否则代表执行不成功. System.exit(xx)的作用是把xx内容返回给调用方.
- Mysql的timestamp类型字段会跟着更新数据而更新, 所以一个表中最好只使用一个timestamp类型字段, 用作最后操作时间.
- 在构造函数内对一个final域的写入, 与随后把这个被构造的对象引用复制给一个引用变量, 这个两个擦欧洲之间不能重排序.
- 初次读一个包含final域对象的引用, 与随后初次读这个final域, 这两个操作之间不能重排序.
- redis的问一睛,hash结构的,所有filed都删除完了的话,是不是那个key会自动消失?所有的filed都没有的话,那个key就没有了.
- 堆快照 分析工具 目前哪个比较好呢? MAT? JVisualVM方便.
- 玩es 一般是用 spring data elasticsearch 还是用jest? data. transportclient. http.
- http请求工具: RestTemplate、Rotrofit、spring boot feign、httpclient、okhttp。
- 缓存穿透: 查询一个在缓存内必然不存在的数据, 导致每次请求都要到存储层去查询, 失去了缓存的意义. 在流量大时, 可能DB就挂掉了, 缓存击穿是黑客攻击系统的常用手段. 解决方案: 1: 将查询为空的数据也缓存起来, 但这会导致缓存存在很多的无效数据, 其次会导致正常请求数据出现误差(第一次请求时, 没有数据, 但是某个操作后存在了数据, 但依然查询不到). 2: 使用布隆过滤器来解决缓存穿透的问题[可以使用guava的BloomFilter实现].
-
缓存雪崩: 1. 缓存失效期: 给定key设置的生存时间, 当key过期时, 它自动删除; 2. 因为缓存失效导致数据为加载到缓存中, 或者缓存同一时间大面积失效, 从而导致所有请求都去查数据库, 导致数据库CPU和内存负责过高, 甚至宕机.
1.缓存大面积的同时失效:
避免缓存设置相近的有效期.
1. 为有效期增加随机值.
2. 统一规划有效期, 失效时间均匀分布.
2.对热点数据的持续高并发:
互斥锁[锁粒度控制], 例如对某个key只允许一个线程查询数据库和写缓存, 其他线程等待.
1. JVM锁机制(服务或annotation)[可重入锁].
2. 分布式锁机制(redis, zk, database).
缺点: 线程阻塞, 用户体验差[双缓存策略]
3. 有效期本身的机制:
缓存用不过期, 异步更新
优点: 不阻塞线程, 用户体验好, 不会出现雪崩效应.
缺点: 不保证一致性, 代码复杂度增大(每个value都要维护异步更新代码), 容易堆积垃圾数据.
4. 做二级缓存, A1为原始缓存, A2为拷贝缓存, A1失效时, 可以范围A2, A1缓存失效时间设置为短期, A2设置为长期(此点做补充). - 分布式中怎么实现顺序访问? 状态机.
- 保证幂等的方式很多种,有些方案是加一张幂等表,由唯一标识的唯一索引来保证不重复处理。。。一个请求处理完之后把结果集放到幂等表中,第二个请求进来发现处理过了就直接去 幂等表中的结果集. 也有人是用 redis 来做的,也可以用 分布式锁 来去重.
- 服务端发现请求的唯一标识重复了有两种处理方式
1、直接拒绝该请求
2、等待第一个请求处理完成,取得其处理结果并返回 - socket直连银行的系统,netty可以替代java 的socket吗?可以.
- 分布式锁 有2种释放方式。1个是拥有者 1个是引擎自维护的超时机制。 tair也有超时。对标锁的意义是:保护安全区,但是只保护一会。
- 现在是这么一个格局:
Kotlin、JS、Swift、C#:客户端开发
Java:企业级应用层开发
Go:PaaS基础设施开发
C++:基础设施的底层驱动开发 - java中位移(<<, >>..)运算优先级低于加减优先级. sout(1< 5 + 1) = 64.sout((1<<5) + 1) = 33.
- 敏捷开发的本质就是一开始谁都想不明白,先做, 出问题再改. 此所谓: 面向变化、面向重构。
- 查看漏洞平台: 漏洞盒子, 补天.
- netty下不要用log4j, 这种多线程环境下log4j容易deadlock. 以前用mina的时候log4j的filewatch死锁了, 就是那个监听配置文件改动的类.log4j确实在高并发的情况下会阻塞,可以自己重写appender, 开启缓存,设置定时刷新.
- epoll比select高效有两点,1每次调用不用把fds之类数组都传递给内核,2只处理发生事件的fd,不用轮训。所以epoll高效的前提是大量的并发.(epoll要2.6內核開始支持).
- es中我搜索nz,如何只是nz,而不是有n,或者有z也给查出来? lucene可以设置查询步长, 就是字母或短语的间距 n和z之间设置0就代表n和z连着 但zn也能查出来. 用and或者"minimum_should_match": 2.
- 分布式任务调度解决框架: quartz, elasticjob, tbs,xxl-job, opencron, LTS.
- 使用zookeeper实现分布式定时任务: 多态同时触发, 去竞争一个执行锁, 最后只有第一个拿到锁并执行,没有拿到锁的直接停止.
- kafka监控开源软件: kafka admin, kafka eagle.
- java进程监控程序: pinpoint、prometheus 、grafana。
- 发送消息方式如果要kafka自己保证幂等,不重复发送消息,需要满足:
1,enable.idempotence必须为true
2,acks为all
3,max.in.flight.requests.per.connection 小于等于5
4,retries 大于0 - 区块链学习推荐: 先看中本聪那个白皮书, 然后看以太坊协议.
小知识点快览(不定期更新)
最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...