Pacific73 / gorm-cache

gorm v2的即插即用、无需修改代码的旁路缓存。An easy-to-use look-aside cache solution for gorm v2 users.
Apache License 2.0
112 stars 29 forks source link

使用内存缓存,分页查询中search key exists总是返回false #4

Closed FourLeafTec closed 2 years ago

FourLeafTec commented 2 years ago

问题描述

使用内存缓存,分页查询缓存不生效,追进去发现SearchKeyExists总视返回false,查询结果也相同

缓存配置

cache, _ := cache.NewGorm2Cache(&cacheConfig.CacheConfig{
    CacheLevel:           cacheConfig.CacheLevelAll,
    CacheStorage:         cacheConfig.CacheStorageMemory,
    CacheSize:            5000,
    InvalidateWhenUpdate: true,  // when you create/update/delete objects, invalidate cache
    CacheTTL:             60000, // 60000 ms
    CacheMaxItemCnt:      60000, // if length of objects retrieved one single time
    DebugMode:            true,
    // exceeds this number, then don't cache
    })
日志 ``` 2022-09-09 05:44:32.635 [INFO] [BeforeQuery] search key exists ? false 2022-09-09 05:44:32.635 [INFO] [BeforeQuery] parse primary keys = [] 2022-09-09 05:44:32.907 [INFO] [AfterQuery] start to set primary cache for kvs: [] 2022-09-09 05:44:32.907 [INFO] [AfterQuery] start to set search cache for sql: SELECT count(*) FROM "peiz"."p_order" WHERE "p_order"."mc_id" = $1 AND "status" NOT IN ($2,$3,$4) AND "p_order"."deleted_at" IS NULL 2022-09-09 05:44:32.907 [INFO] [AfterQuery] set cache: 37 2022-09-09 05:44:32.907 [INFO] [AfterQuery] sql SELECT count(*) FROM "peiz"."p_order" WHERE "p_order"."mc_id" = $1 AND "status" NOT IN ($2,$3,$4) AND "p_order"."deleted_at" IS NULL cached 22-09-09 05:44:32 [DEBU] SELECT count(*) FROM "peiz"."p_order" WHERE "p_order"."mc_id" = 337644723584954368 AND "status" NOT IN ('start','deleted','panic') AND "p_order"."deleted_at" IS NULL [272.238116ms] 2022-09-09 05:44:32.907 [INFO] [BeforeQuery] search key exists ? false 2022-09-09 05:44:32.907 [INFO] [BeforeQuery] parse primary keys = [] 2022-09-09 05:44:33.318 [INFO] [AfterQuery] start to set search cache for sql: SELECT * FROM "peiz"."p_order" WHERE "p_order"."mc_id" = $1 AND "status" NOT IN ($2,$3,$4) AND "p_order"."deleted_at" IS NULL ORDER BY create_time desc 2022-09-09 05:44:33.319 [INFO] [AfterQuery] start to set primary cache for kvs: [{Key:0x40000b7258 Value:{响应内容}] 2022-09-09 05:44:33.319 [INFO] [AfterQuery] sql SELECT * FROM "peiz"."p_order" WHERE "p_order"."mc_id" = $1 AND "status" NOT IN ($2,$3,$4) AND "p_order"."deleted_at" IS NULL ORDER BY create_time desc cached 22-09-09 05:44:33 [DEBU] SELECT * FROM "peiz"."p_order" WHERE "p_order"."mc_id" = 337644723584954368 AND "status" NOT IN ('start','deleted','panic') AND "p_order"."deleted_at" IS NULL ORDER BY create_time desc [411.897497ms] 22-09-09 05:44:33 [INFO] 223.104.103.141 "POST /api/p/order/page" 200 (691ms) 2022-09-09 05:44:40.891 [INFO] [BeforeQuery] search key exists ? false 2022-09-09 05:44:40.891 [INFO] [BeforeQuery] parse primary keys = [] 2022-09-09 05:44:40.95 [INFO] [AfterQuery] start to set primary cache for kvs: [] 2022-09-09 05:44:40.95 [INFO] [AfterQuery] start to set search cache for sql: SELECT count(*) FROM "peiz"."p_order" WHERE "p_order"."mc_id" = $1 AND "status" NOT IN ($2,$3,$4) AND "p_order"."deleted_at" IS NULL 2022-09-09 05:44:40.95 [INFO] [AfterQuery] set cache: 37 2022-09-09 05:44:40.95 [INFO] [AfterQuery] sql SELECT count(*) FROM "peiz"."p_order" WHERE "p_order"."mc_id" = $1 AND "status" NOT IN ($2,$3,$4) AND "p_order"."deleted_at" IS NULL cached 22-09-09 05:44:40 [DEBU] SELECT count(*) FROM "peiz"."p_order" WHERE "p_order"."mc_id" = 337644723584954368 AND "status" NOT IN ('start','deleted','panic') AND "p_order"."deleted_at" IS NULL [59.785883ms] 2022-09-09 05:44:40.95 [INFO] [BeforeQuery] search key exists ? false 2022-09-09 05:44:40.95 [INFO] [BeforeQuery] parse primary keys = [] 2022-09-09 05:44:41.091 [INFO] [AfterQuery] start to set search cache for sql: SELECT * FROM "peiz"."p_order" WHERE "p_order"."mc_id" = $1 AND "status" NOT IN ($2,$3,$4) AND "p_order"."deleted_at" IS NULL ORDER BY create_time desc 2022-09-09 05:44:41.092 [INFO] [AfterQuery] start to set primary cache for kvs: [{Key:0x400050b2a8 Value:{响应内容}}] 2022-09-09 05:44:41.092 [INFO] [AfterQuery] sql SELECT * FROM "peiz"."p_order" WHERE "p_order"."mc_id" = $1 AND "status" NOT IN ($2,$3,$4) AND "p_order"."deleted_at" IS NULL ORDER BY create_time desc cached 22-09-09 05:44:41 [DEBU] SELECT * FROM "peiz"."p_order" WHERE "p_order"."mc_id" = 337644723584954368 AND "status" NOT IN ('start','deleted','panic') AND "p_order"."deleted_at" IS NULL ORDER BY create_time desc [141.459062ms] 22-09-09 05:44:41 [INFO] 223.104.103.141 "POST /api/p/order/page" 200 (203ms) ```

基本信息

gorm.io/gorm v1.23.8 github.com/Pacific73/gorm-cache v1.0.1-0.20220620032759-a6797d3696a5

v1.0.0 没有实现Plugin接口,用hash直接加载的合并了Plugin接口的pr

FourLeafTec commented 2 years ago

查询不用很复杂,只要不是主键查询就不生效了

SELECT * FROM "peiz"."s_param" WHERE "s_param"."clazz" = 'p_lock_time'

怀疑缓存key生成有问题

FourLeafTec commented 2 years ago

已解决,对于传入指针进行的查询fmt.Sprintf("%v",v)打印的内存地址,每次都会变 使用reflect检查了一下参数是不是指针 请检查pr是否有问题

Pacific73 commented 2 years ago

pr已merge