下载等待

  1. 广告。增加停留时间就意味着用户有更多的机会看到令自己感兴趣的广告并点击,然后就有更高的收入了;
  2. 推荐。可以立即推荐有关的下载,有的人下载完东西就直接关闭了网站,不会看到相关的下载信息,就没有更多的浏览量;
  3. 条款。我们在下载的时候一般都会涉及到相关条款(免责条款),如果在下载页面放置基本不会有人注意,但放在这里,很多纠纷就能够说过去;
  4. 缓冲。防止误下载;防止盗链;给服务器寻找资源做缓冲(更优下载路线),倒计时一完成就能过够开始下载,不用再看着空白页面等待。

Redis、Memcached

共同点

Memcached 和 Redis 都很类似:都是内存型数据库,数据保存在内存中,通过 TCP 直接存取,速度快,并发高,但数据类型有限,查询功能不强,一般用作缓存。

Read more

MySQL 大表优化方案

前言

当 MySQL 单表记录数过大时,增删改查性能都会急剧下降,可以参考以下优化手段:

  • 单表优化
  • 读写分离
  • 缓存
  • 拆分
  • NoSQL
Read more

跨域资源共享 CORS 详解

CORS

CORS:跨域资源共享(Cross-origin resource sharing),是一个 W3C 标准。

作用:允许浏览器向跨源服务器发出 XMLHttpRequest 请求,从而克服 AJAX 只能同源使用的限制。

Read more

DO、DTO、BO、AO、VO、POJO

前记

最近写项目,凡是不属于数据表对应对象的字段的,但又是连表查询出来的,我都加在了 DO 里(贪方便),然后字段越来越多,实在不妥,然后就去了解标题的那些模型。网上大部分都是只讲概念,虽然也能看懂,但是没有例子实在不好,所以这里会写概念 + 栗子。

参考文章:

Read more

Spring OAuth2 SSO

前记

项目需要用到 Spring OAuth2 SSO,但是还没使用过,记录下来。

项目包括:
UI 站点【常规网站】:admin-ui,admin-ui2
网关【Zuul】:gateway
RESTFulAPI 服务 + 认证中心:uac
服务发现:eureka

问题:

  1. UI 站点用到的某些资源是通过 ajax 请求 uac,如果未登录认证,则无法获取,而且因为是 ajax,无法通过后端直接重定向,只能由前端识别到未登录时进行跳转登录。
  2. RESTFulAPI 是由网关 gateway 进行统一管理的,所以路由到认证中心 uac 时需要记录下请求的地址,不然无法在登录后重定向回去。
  3. admin-ui 登录后,再访问 admin-ui2 时应该能自动登录上,因为实现了 SSO 单点登录。

问题解决:

  1. 在请求是 ajax 时,只返回 Json 和未认证的 HttpState,不要返回认证中心的登录页面,之后再由前端自己根据返回的包含认证中心字段的 Json 重定向过去。
  2. 认证中心应该放在网关 gateway,这样可以更好管理用户登录认证问题,并且更易从 savedRequest 中获取请求前的地址。
  3. 注解内部应该直接实现了,具体还得看运行情况。

MyBatis 注意点

#{ } 和 ${ } 的区别

#{ }

表示一个占位符号,通过 #{ } 可以在 preparedStatement 实现向占位符中设置值,自动进行 Java 类型和 Jdbc 类型转换,可以有效防止 SQL 注入。

可以让 #{ } 接收简单类型值或 POJO 属性值(通过 OGNL 读取对象中的值,属性.属性.属性..方式获取对象属性值)。如果在 parameterType 传输单个简单类型值,#{ } 括号中可以是 value 或其它名称。

Read more

HashMap、Hashtable、HashSet 和 ConcurrentHashMap 的比较

Hashtable 和 HashMap 区别

  • 基类不同:HashTable 基于 Dictionary 类;HashMap 基于 AbstractMap。

  • null:HashTable 中的 key 和 value 都不允许为 null;HashMap 允许存在一个 key 为 null 和任意个 value 为 null 的键值对。

  • 线程安全:Hashtable 线程安全;HashMap 线程不安全。同样,线程的安全与否会影响性能。

  • 遍历不同:Hashtable 支持 Iterator 和 Enumeration 两种遍历方式;HashMap 仅支持 Iterator 的遍历方式。

  • HashMap 不能保证随着时间的推移 Map 中的元素次序是不变的(重新哈希时可能移动元素)。

可以通过下面的语句使得 HashMap 同步:

1
Map map = Collections.synchronizeMap(hashMap);

关于 HashMap 线程不安全,《Java并发编程的艺术》中写道:
HashMap 在并发执行 put 操作时会引起死循环,导致 CPU 利用率接近 100%。
因为多线程会导致 HashMap 的 Node 链表形成环形数据结构,一旦形成环形数据结构,Node 的 next 节点永远不为空,就会在获取 Node 时产生死循环。

相关问题

可以使用自定义的对象作为 key 吗?

可以使用任何对象作为键,只要它遵守了 equals() 和 hashCode() 方法的定义规则,并且当对象插入到 Map 中之后将不会再改变了。