美文网首页Java高级交流
小知识点快览(不定期更新)

小知识点快览(不定期更新)

作者: 六月星空2011 | 来源:发表于2017-11-30 11:51 被阅读172次
    1. java自加减[++,--]操作不是单个操作,包含三个独立操作: 读取value, 将value加1,将结果写入value. 所以存在线程安全问题.
    2. 如果你频繁要切换数据库,用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).
    3. 《图解Java多线程设计模式》对于多线程初学者挺有帮助.
    4. DDD红皮书《实现领域驱动设计》最精华的部分是 战略篇,里面的各种架构 建模方法论比IDDD要详细多了。
    5. 用二进制存储存储数据比存文本更节省空间, hadoop也是用streaming把二进制处理为正常字符串放到hdfs. [ip用二进制存全球ip也就几十m, 说实话 tcp/IP协议 里面 ip就是2进制做的 是最符合这个业务本身的设计,变成点分形式 只是为了 可读, 尤其是 当你需要 4网划分的时候 你会发现 用字符串处理 的代码量是2进制的10倍还多,而且不好读]
    6. update比insert慢多少了?
       insert 如果是ssd盘 tps有12000, update 只有 5000, 如果是 stat盘 insert tps是8000, update只有3000.
    7. 用国际通信区域码做国际化是有坑的, 因为北美的手机国际码都是一样的(通行码一致, 但是使用的语言并不一样).
    8. Spring会检测要代理的类是否有实现接口来选择是使用cglib proxy还是jdk proxy.
    9. parallelStream 是给Map Reduce操作做多线程处理, 是并发处理集合元素的回调, 普通的stream只能线性处理, 具体可以看看算法导论的多线程算法, 一般集合size很小,就不需要用 parallelStream, 一般web应用都不会用到 并行流. 只有纯cpu任务建议使用parallelStream.
    10. exit 0和 非0都是跟linux操作系统有关, 对于linux来说非0都是代表执行不成功,操作系统会记录日志, 良好脚本边写习惯就是在最后return 0,代表执行成功,否则代表执行不成功. System.exit(xx)的作用是把xx内容返回给调用方.
    11. Mysql的timestamp类型字段会跟着更新数据而更新, 所以一个表中最好只使用一个timestamp类型字段, 用作最后操作时间.
    12. 在构造函数内对一个final域的写入, 与随后把这个被构造的对象引用复制给一个引用变量, 这个两个擦欧洲之间不能重排序.
    13. 初次读一个包含final域对象的引用, 与随后初次读这个final域, 这两个操作之间不能重排序.
    14. redis的问一睛,hash结构的,所有filed都删除完了的话,是不是那个key会自动消失?所有的filed都没有的话,那个key就没有了.
    15. 堆快照 分析工具 目前哪个比较好呢? MAT? JVisualVM方便.
    16. 玩es 一般是用 spring data elasticsearch 还是用jest? data. transportclient. http.
    17. http请求工具: RestTemplate、Rotrofit、spring boot feign、httpclient、okhttp。
    18. 缓存穿透: 查询一个在缓存内必然不存在的数据, 导致每次请求都要到存储层去查询, 失去了缓存的意义. 在流量大时, 可能DB就挂掉了, 缓存击穿是黑客攻击系统的常用手段. 解决方案: 1: 将查询为空的数据也缓存起来, 但这会导致缓存存在很多的无效数据, 其次会导致正常请求数据出现误差(第一次请求时, 没有数据, 但是某个操作后存在了数据, 但依然查询不到). 2: 使用布隆过滤器来解决缓存穿透的问题[可以使用guava的BloomFilter实现].
    19. 缓存雪崩: 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设置为长期(此点做补充).
    20. 分布式中怎么实现顺序访问? 状态机.
    21. 保证幂等的方式很多种,有些方案是加一张幂等表,由唯一标识的唯一索引来保证不重复处理。。。一个请求处理完之后把结果集放到幂等表中,第二个请求进来发现处理过了就直接去 幂等表中的结果集. 也有人是用 redis 来做的,也可以用 分布式锁 来去重.
    22. 服务端发现请求的唯一标识重复了有两种处理方式
      1、直接拒绝该请求
      2、等待第一个请求处理完成,取得其处理结果并返回
    23. socket直连银行的系统,netty可以替代java 的socket吗?可以.
    24. 分布式锁 有2种释放方式。1个是拥有者 1个是引擎自维护的超时机制。 tair也有超时。对标锁的意义是:保护安全区,但是只保护一会。
    25. 现在是这么一个格局:
      Kotlin、JS、Swift、C#:客户端开发
      Java:企业级应用层开发
      Go:PaaS基础设施开发
      C++:基础设施的底层驱动开发
    26. java中位移(<<, >>..)运算优先级低于加减优先级. sout(1< 5 + 1) = 64.sout((1<<5) + 1) = 33.
    27. 敏捷开发的本质就是一开始谁都想不明白,先做, 出问题再改. 此所谓: 面向变化、面向重构。
    28. 查看漏洞平台: 漏洞盒子, 补天.
    29. netty下不要用log4j, 这种多线程环境下log4j容易deadlock. 以前用mina的时候log4j的filewatch死锁了, 就是那个监听配置文件改动的类.log4j确实在高并发的情况下会阻塞,可以自己重写appender, 开启缓存,设置定时刷新.
    30. epoll比select高效有两点,1每次调用不用把fds之类数组都传递给内核,2只处理发生事件的fd,不用轮训。所以epoll高效的前提是大量的并发.(epoll要2.6內核開始支持).
    31. es中我搜索nz,如何只是nz,而不是有n,或者有z也给查出来? lucene可以设置查询步长, 就是字母或短语的间距 n和z之间设置0就代表n和z连着 但zn也能查出来. 用and或者"minimum_should_match": 2.
    32. 分布式任务调度解决框架: quartz, elasticjob, tbs,xxl-job, opencron, LTS.
    33. 使用zookeeper实现分布式定时任务: 多态同时触发, 去竞争一个执行锁, 最后只有第一个拿到锁并执行,没有拿到锁的直接停止.
    34. kafka监控开源软件: kafka admin, kafka eagle.
    35. java进程监控程序: pinpoint、prometheus 、grafana。
    36. 发送消息方式如果要kafka自己保证幂等,不重复发送消息,需要满足:
      1,enable.idempotence必须为true
      2,acks为all
      3,max.in.flight.requests.per.connection 小于等于5
      4,retries 大于0
    37. 区块链学习推荐: 先看中本聪那个白皮书, 然后看以太坊协议.

    相关文章

      网友评论

        本文标题:小知识点快览(不定期更新)

        本文链接:https://www.haomeiwen.com/subject/cnmubxtx.html