برنامه نویسی

نحوه اجرای حافظه پنهان Redis در Golang برای مبتدیان: یک راهنمای گام به گام (ویندوز نسخه)

__

در این پست ، من شما را طی می کنم نحوه تنظیم و استفاده از حافظه پنهان Redis در یک پروژه Golang. این تنظیم به کاهش کمک می کند نمایش داده های پایگاه داده و بهبود عمل با ذخیره کردن داده های غالباً درخواست می شود.


🔹 چرا از redis برای ذخیره سازی استفاده می کنیم؟

load بار پایگاه داده را کاهش می دهد

time زمان پاسخ را بهبود می بخشد

storation ذخیره سازی با ارزش کلید آسان

✅ از انقضا و بی اعتبار بودن پشتیبانی می کند


📌 مرحله 1: بسته redis را نصب کنید

ما از go-redis/v9 بسته بندی برای تعامل با redis. آن را با استفاده از: نصب کنید:

go get github.com/redis/go-redis/v9
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


📌 مرحله 2: مشتری Redis را اولیه کنید

یک فایل ایجاد کنید utils/redis.go و موارد زیر را اضافه کنید:

package utils

import (
    "context"
    "crypto/tls"
    "log"

    "github.com/redis/go-redis/v9"
)

var (
    RedisClient *redis.Client
    Ctx         = context.Background()
)

// Initialize Redis Connection
func InitRedis() {
    RedisClient = redis.NewClient(&redis.Options{
        Addr:     "127.0.0.1:6379", // Replace with Redis host
        Password: "", // Replace with Redis password
        DB:       0,


    _, err := RedisClient.Ping(Ctx).Result()
    if err != nil {
        log.Fatalf("❌ Failed to connect to Redis: %v", err)
    }
    log.Println("✅ Redis connection established")
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

🔹 در صورت استفاده از یک نمونه محلی Redis، مجموعه Addr: "127.0.0.1:6379" و حذف TLSConfigبشر

🔹 برای ارائه دهندگان Cloud Redis (مانند Aiven ، AWS و غیره) ، از تنظیم TLS استفاده کنید.


📌 مرحله 3: اجرای توابع ذخیره سازی

توابع ذخیره سازی زیر را برای مدیریت داده ها در REDIS اضافه کنید:

package utils

import (
    "encoding/json"
    "errors"
    "log"
    "time"
)

// CacheGet: Fetch data from Redis
func CacheGet(key string, result interface{}) (bool, error) {
    log.Printf("🔍 Checking cache for key: %s", key)

    val, err := RedisClient.Get(Ctx, key).Result()
    if err == redis.Nil {
        return false, errors.New("key does not exist") // Cache miss
    } else if err != nil {
        return false, errors.New("internal server error")
    }

    // Unmarshal JSON into result
    err = json.Unmarshal([]byte(val), result)
    if err != nil {
        return false, err
    }

    log.Printf("✅ Cache hit for key: %s", key)
    return true, nil
}

// CacheSet: Store data in Redis
func CacheSet(key string, value interface{}, expiration time.Duration) error {
    jsonData, err := json.Marshal(value)
    if err != nil {
        return err
    }

    return RedisClient.Set(Ctx, key, jsonData, expiration).Err()
}

// InvalidateCache: Delete a cached key (for updates)
func InvalidateCache(key string) error {
    err := RedisClient.Del(Ctx, key).Err()
    if err != nil {
        log.Printf("❌ Error invalidating cache for key: %s", key)
        return err
    }
    log.Printf("🗑️ Cache invalidated for key: %s", key)
    return nil
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

🔹 CacheGet() → بررسی می کند که آیا کلید وجود دارد ، داده های بازیابی و Unmarshals را بازیابی می کند.

🔹 CacheSet() → داده های رمزگذاری شده JSON را با زمان انقضا ذخیره می کند.

🔹 InvalidateCache() inte یک ورودی حافظه نهان را حذف کنید (هنگام به روزرسانی داده ها مفید است).


📌 مرحله 4: از حافظه نهان Redis در پرس و جوهای پایگاه داده استفاده کنید

توابع پرس و جو پایگاه داده خود را به تغییر دهید اولین بررسی redis قبل از پرس و جو از پایگاه داده:

package services

import (
    "errors"
    "log"
    "time"
    "your_project/utils" // Import utils package
)

var cacheExpiration = 10 * time.Minute // Set cache expiration time

type Category struct {
    ID   int    `json:"id"`
    Name string `json:"name"`
}

func GetAllCategories() ([]Category, error) {
    var categories []Category
    cacheKey := "categories_cache"

    // 1️⃣ Check Redis cache first
    cached, err := utils.CacheGet(cacheKey, &categories)
    if err != nil {
        log.Printf("Redis CacheGet error: %v", err)
    }
    if cached {
        log.Println("✅ Categories fetched from Redis cache")
        return categories, nil
    }

    // 2️⃣ Cache miss → Fetch data from DB
    log.Println("⚠️ Cache miss: Fetching categories from DB")
    query := `SELECT id, name FROM categories`
    rows, err := utils.DB.Query(query)
    if err != nil {
        return nil, errors.New("database error")
    }
    defer rows.Close()

    for rows.Next() {
        var category Category
        if err := rows.Scan(&category.ID, &category.Name); err != nil {
            return nil, errors.New("data scan error")
        }
        categories = append(categories, category)
    }

    // 3️⃣ Store fetched data in Redis
    if err := utils.CacheSet(cacheKey, categories, cacheExpiration); err != nil {
        log.Printf("Redis CacheSet error: %v", err)
    }

    log.Println("✅ Categories cached in Redis")
    return categories, nil
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

🔹 ابتدا حافظه نهان Redis را بررسی کنید با استفاده از CacheGet()بشر

🔹 اگر حافظه پنهان، دیتابیس را پرس و جو کنید.

🔹 نتیجه را در redis ذخیره کنید برای استفاده در آینده با CacheSet()بشر


📌 مرحله 5: هنگام تغییر داده ها ، حافظه پنهان را باطل کنید

هر زمان که دسته های جدید اضافه شود ، حافظه پنهان منسوخ را حذف کنید:

err := utils.InvalidateCache("categories_cache")
if err != nil {
    log.Printf("Error invalidating cache: %v", err)
}
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

🔹 از این استفاده کنید پس از افزودن/به روزرسانی/حذف داده ها برای تازه نگه داشتن حافظه پنهان.


اگر می خواهید Redis Caching را به صورت محلی آزمایش کنید ویندوز، این مراحل را دنبال کنید:


مرحله 1: redis را به صورت محلی نصب و اجرا کنید

  1. بارگیری redis برای ویندوز:

    • (Redis به طور بومی در ویندوز پشتیبانی نمی شود)
    • سرور redis را نصب و اجرا کنید.
  2. Server Redis را شروع کنید:

    اگر نصب کرده اید redis با استفاده از WSL یا نسخه سازگار، آن را با استفاده از:

   redis-server
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. بررسی کنید که آیا Redis در حال اجرا است:
    باز فرمان سریع (CMD) و اجرا:
   redis-cli ping
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اگر Redis در حال اجرا است ، باید برگردد:

   PONG
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید


مرحله 2: کلیدها را در Redis تنظیم و دریافت کنید (آزمایش محلی)

برای اینکه حافظه نهان خود را برای کلید بررسی کنید categories_cache، از دستورات زیر در اعلان فرمان:

  1. Redis CLI را باز کنید:
   redis-cli
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

  1. بررسی کنید که آیا categories_cache وجود دارد:
   EXISTS categories_cache
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

اگر برگردد 1، کلید وجود دارد. اگر 0، از دست رفته است.

  1. داده های ذخیره شده را دریافت کنید:
   GET categories_cache
حالت تمام صفحه را وارد کنید

از حالت تمام صفحه خارج شوید

این باید داده های ذخیره شده JSON را برگرداند.


نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا