使用Redis作为缓存,model save后,清理缓存感觉没成功
jacobzeng opened this issue · 8 comments
使用Redis作为缓存,model save后,清理缓存感觉没成功,立即查询数据,经过调试还是从缓存中获得了数据(之前的老数据)
检查了一下,model查询生成的缓存为
_query::default::biz_device::_query::default::biz_device::Device::SELECT * FROM biz_device WHERE 1=1 order by code LIMIT 20 OFFSET 0::[]
然后在save model的时候去删除的为_query::default::biz_device::keys,结果并没有删掉,是我哪个地方使用的不对?
这块设计是这样的 _query::default::biz_device::keys 存储的是所有的_query::default::biz_device 这个group的redis的key, 删除的时候会把所有的key取出来进行删除,然后再把 _query::default::biz_device::keys 这个删除(redis集群不支持keys命令,同时keys本身性能也不好)
关注一下RedisProvider里的doFlush,看看你的redis是哪种类型的删除
看了,这些没有问题,我重新实现了一个RedisProvider,其中doFlush的地方是这样的,可以工作,不是很确定默认的实现中获取所有分组key的方式是否不妥?当然也可能是我理解的不对。
jedis = getJedis();
if (jedis != null) {
if (event.getType().equals(CacheEvent.CacheEventType.ALL)) {
jedis.flushDB();
} else if (event.getType().equals(CacheEvent.CacheEventType.GROUP)) {
String groupKeys = event.getGroup();
//模糊匹配取出所有相关联的keys
Set<String> keys = jedis.keys(groupKeys + Constant.CONNECTOR + "*");
for (String key : keys) {
jedis.del(key);
}
}
}
恩,你说的思路明白,我的不是集群环境,我直接在redis-cli下执行del _query::default::biz_device::keys 这种模式也不行。。莫非是我redis版本太新了?
@jacobzeng 单机的实现逻辑可以使用 * +keys 命令来匹配,_query::default::biz_device::keys 是一个列表,通过zrange 命令来看看里面的数据是什么
@Dreampie 直接在cli中测试了,
redis-cli zrange _query::default::biz_device::keys 0 99
(empty list or set)
但是直接查询是有的
_query::default::biz_device_status::_query::default::biz_device_status::DeviceStatus::SELECT * FROM biz_device_status WHERE device_id=?::[7]
_query::default::biz_device_status::_query::default::biz_device_status::DeviceStatus::SELECT * FROM biz_device_status WHERE device_id=?::[3]
_credential::_allCredentials
_principal::administrator
_query::default::biz_device_status::_query::default::biz_device_status::DeviceStatus::SELECT * FROM biz_device_status WHERE device_id=?::[5]
_query::default::biz_device::_query::default::biz_device::Device::SELECT COUNT(*) FROM biz_device WHERE 1=1 order by code::[]
_session::edadc1c3-7d4f-4aa0-9f52-5119fc60294e
_query::default::biz_multimedia_content::_query::default::biz_multimedia_content::MultiMediaContent::SELECT * FROM biz_multimedia_content WHERE deleted_at is NULL and parent_id is NULL LIMIT 20 OFFSET 0::[]
_session::administrator
_query::default::biz_multimedia_content::_query::default::biz_multimedia_content::MultiMediaContent::SELECT COUNT(*) FROM biz_multimedia_content WHERE deleted_at is NULL and parent_id is NULL::[]
@jacobzeng 你从github 更新一份源码 本地install 试试
@jacobzeng 你先确定是否已经解决了你的问题,如果已经解决,会发的