1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85
| package main
import ( "context" "log" "time"
"github.com/redis/go-redis/v9" )
var ctx = context.Background()
// GetUserUnified 一个方法搞定单个/批量获取和缓存刷新 // ids: 用户 ID 列表 // refresh: 是否强制刷新缓存 // dbQuery: 数据库查询函数,外部传入 func GetUserUnified(rdb *redis.Client, ids []string, refresh bool, dbQuery func(id string) string) (map[string]string, error) { result := make(map[string]string)
for _, id := range ids { key := "user:" + id var user string var err error
if !refresh { // 尝试从缓存获取 user, err = rdb.Get(ctx, key).Result() if err == nil { log.Println("缓存命中,直接返回:", key) result[id] = user continue } if err != redis.Nil { log.Println("Redis 出错:", err) continue } log.Println("缓存未命中,开始从数据库查询:", key) } else { log.Println("强制刷新缓存:", key) }
// 从数据库查询(调用外部传入的函数) user = dbQuery(id)
// 回写缓存 if err := rdb.Set(ctx, key, user, 10*time.Minute).Err(); err != nil { log.Println("缓存回写失败:", key, err) } else { log.Println("缓存已回写 Redis:", key) }
result[id] = user }
return result, nil }
func main() { // 初始化 Redis 客户端 rdb := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", DB: 0, })
// 自定义数据库查询函数 dbQuery := func(id string) string { // 模拟查询数据库 return "db_user_" + id }
// 单个用户获取 userMap, _ := GetUserUnified(rdb, []string{"1001"}, false, dbQuery) log.Println("用户 1001:", userMap["1001"])
// 批量用户获取 ids := []string{"1001", "1002", "1003"} users, _ := GetUserUnified(rdb, ids, false, dbQuery) log.Println("批量用户:", users)
// 强制刷新缓存 usersRefresh, _ := GetUserUnified(rdb, []string{"1002"}, true, dbQuery) log.Println("刷新缓存后的用户 1002:", usersRefresh["1002"]) }
|