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> { /** * 一个文档的写入到数据库的version版本,version的get和set方法 + *

+ * 写入一条数据到数据库的时候会对比以下老的vs和数据库的vs是不是一样,不是一样的话无法写入,一致的话就写入数据并且让vs自增+1. + * 主要是为了防止多个服务器去操作同一条数据,保证分布式环境的数据一致性,就是一个数据版本号的简单实现,版本号一致才能写入数据。 + * 在分布式环境的那种有状态服务器中会遇到,比如网关路由一个玩家的数据到a服务器,这个时候你加了一个b服务器,有可能下一条数据就被路由到b。 + * 虽然用了一致性hash的负载均衡算法,但是一样有概率会让某些消息路由到不同服务器。 + * 这个时候版本号就可以保住只有一台服务器可以对数据库做操作,不用担心多个服务器去操作数据。 + * 这是一个容错的操作,真实环境下很少发生。为了高性能必须要把服务器做成有状态的,这个容错操作就是最后一道保证数据一致的方案。 + * mongodb更新的时候是原子的,并发更新同一条数据只有一条数据会写入,第二条数据写入的时候版本号已经不一致了,所以老版本号的数据无法写入。 + * 写入的时候只要发现版本号不一致,就让缓存失效,重新读取数据库最新的数据。 + *

+ * 分布式环境下,要想服务器性能好,就要做成有状态的,有状态就要遇到这种多服对同一条数据写入问题,这是一个千古难以解决的问题,进退两难。 */ default long gvs() { return 0L;