使用Geode 1.2及9.1原生客户端,Get操作为何触发AfterCreate事件?
为什么Geode读取操作会触发AfterCreate事件?
首先得明确Geode里AfterCreate事件的核心触发逻辑:只要某个条目是第一次被添加到Region里——不管是你显式调用put存进去的,还是通过缓存的自动加载逻辑悄悄创建的——都会触发这个事件。你说执行读取操作却触发了它,大概率是下面这些原因:
1. 开启了Read-Through缓存加载(CacheLoader)
如果你的myRegion配置了read-through,还绑定了CacheLoader实现,那当你执行r[key]读取一个不存在的键时:
- Geode会自动调用
CacheLoader.load()方法,尝试从后端数据源加载对应数据 - 如果你的
CacheLoader在找不到数据时,返回的不是null,而是一个新的空IPdxInstance对象,那Geode就会把这个对象自动存入Region - 这时候这个键的条目被首次创建,自然就触发了
AfterCreate事件
很多时候用户以为自己“没创建数据”,但实际上是CacheLoader的实现悄悄生成了空对象并存入了缓存。
2. PDX序列化的特殊处理逻辑
在你用的Geode 1.2和Pivotal 9.1客户端版本中,PDX序列化机制可能有一些特殊处理:
- 比如某些自定义的序列化拦截器、或者客户端与服务器的交互逻辑,在处理不存在的键时,意外生成了空的
IPdxInstance并放入了缓存 - 这种情况比较少见,但如果你没有配置CacheLoader,那可以往这个方向排查
3. 集群节点的并发同步
如果你的Geode是集群部署,有可能在你执行读取操作的同时,其他节点刚好创建了这个键的条目并同步到了你访问的节点上。不过这种属于偶发的并发场景,需要结合集群日志来确认。
怎么验证和解决?
- 先检查
myRegion的read-through配置和对应的CacheLoader代码:确保当找不到数据时,load方法返回的是null,而不是新创建的IPdxInstance - 可以在
AfterCreate事件里打印条目的内容,如果是个空的PDX实例,那基本就能确定是CacheLoader的问题 - 临时禁用CacheLoader再测试读取操作,看看还会不会触发事件
内容的提问来源于stack exchange,提问作者rupweb
相关产品推荐
相关产品推荐

