package cache import ( "electricity_bill_calc/global" "fmt" "strings" ) func assembleSearchKey(entityName string, additional ...string) string { var keys = make([]string, 0) keys = append(keys, strings.ToUpper(entityName)) keys = append(keys, additional...) var b strings.Builder b.WriteString(TAG_SEARCH) for _, s := range keys { fmt.Fprintf(&b, ":%s", s) } return b.String() } // 缓存模型名称明确的,使用或者包含非ID检索条件的实体内容。 func CacheSearch[T any](instance T, relationName, entityName string, conditions ...string) error { searchKey := assembleSearchKey(entityName, conditions...) err := Cache(searchKey, &instance, 0) CacheRelation(relationName, STORE_TYPE_KEY, searchKey) return err } // 从缓存中取得模型名称明确的,使用或者包含非ID检索条件的实体内容。 func RetreiveSearch[T any](entityName string, conditions ...string) (*T, error) { searchKey := assembleSearchKey(entityName, conditions...) instance, err := Retreive[T](searchKey) return instance, err } // 从缓存中删除全部指定模型名称的实体内容。 func AbolishSearch(entityName string) error { var ( cursor uint64 keys = make([]string, 0) ) pattern := fmt.Sprintf("%s:%s:*", TAG_SEARCH, strings.ToUpper(entityName)) for { k, cursor, err := global.RedisConn.Scan(global.Ctx, cursor, pattern, 20).Result() if err != nil { return err } keys = append(keys, k...) if cursor == 0 { break } } pipeline := global.RedisConn.Pipeline() pipeline.Del(global.Ctx, keys...) _, err := pipeline.Exec(global.Ctx) return err }