diff --git a/net/src/main/java/com/zfoo/net/util/SimpleCache.java b/net/src/main/java/com/zfoo/net/util/SimpleCache.java index 2c10c522..48bb8c64 100644 --- a/net/src/main/java/com/zfoo/net/util/SimpleCache.java +++ b/net/src/main/java/com/zfoo/net/util/SimpleCache.java @@ -29,13 +29,14 @@ import java.util.concurrent.TimeUnit; import java.util.function.Function; /** + * caffeine是guava cache的威力增强版。 * caffeine的缓存都是单个存,单个更新,但是实际的项目很多都是批量查询,批量更新。 *
* 优势: * 1.支持批量查找,批量更新。 * 2.可以防止缓存穿透,缓存击穿,缓存雪崩 *
- * 当查找的key不存在的时候,返回defaultValue,并且将defaultValue放入缓存。所以通过
+ * 批量查找通过batchReloadCallback方法查找,当查找的key不存在的时候,调用defaultValueBuilder生成一个默认值放入缓存。
*
* @author jaysunxiao
* @version 3.0
diff --git a/orm/src/main/java/com/zfoo/orm/model/entity/IEntity.java b/orm/src/main/java/com/zfoo/orm/model/entity/IEntity.java
index c5ed85f4..d714e100 100644
--- a/orm/src/main/java/com/zfoo/orm/model/entity/IEntity.java
+++ b/orm/src/main/java/com/zfoo/orm/model/entity/IEntity.java
@@ -27,6 +27,17 @@ public interface IEntity
+ * 写入一条数据到数据库的时候会对比以下老的vs和数据库的vs是不是一样,不是一样的话无法写入,一致的话就写入数据并且让vs自增+1.
+ * 主要是为了防止多个服务器去操作同一条数据,保证分布式环境的数据一致性,就是一个数据版本号的简单实现,版本号一致才能写入数据。
+ * 在分布式环境的那种有状态服务器中会遇到,比如网关路由一个玩家的数据到a服务器,这个时候你加了一个b服务器,有可能下一条数据就被路由到b。
+ * 虽然用了一致性hash的负载均衡算法,但是一样有概率会让某些消息路由到不同服务器。
+ * 这个时候版本号就可以保住只有一台服务器可以对数据库做操作,不用担心多个服务器去操作数据。
+ * 这是一个容错的操作,真实环境下很少发生。为了高性能必须要把服务器做成有状态的,这个容错操作就是最后一道保证数据一致的方案。
+ * mongodb更新的时候是原子的,并发更新同一条数据只有一条数据会写入,第二条数据写入的时候版本号已经不一致了,所以老版本号的数据无法写入。
+ * 写入的时候只要发现版本号不一致,就让缓存失效,重新读取数据库最新的数据。
+ *
+ * 分布式环境下,要想服务器性能好,就要做成有状态的,有状态就要遇到这种多服对同一条数据写入问题,这是一个千古难以解决的问题,进退两难。
*/
default long gvs() {
return 0L;