نحوه اجرای حافظه پنهان 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 را به صورت محلی نصب و اجرا کنید
-
بارگیری redis برای ویندوز:
- (Redis به طور بومی در ویندوز پشتیبانی نمی شود)
- سرور redis را نصب و اجرا کنید.
-
Server Redis را شروع کنید:
اگر نصب کرده اید redis با استفاده از WSL یا نسخه سازگار، آن را با استفاده از:
redis-server
-
بررسی کنید که آیا Redis در حال اجرا است:
باز فرمان سریع (CMD) و اجرا:
redis-cli ping
اگر Redis در حال اجرا است ، باید برگردد:
PONG
✅ مرحله 2: کلیدها را در Redis تنظیم و دریافت کنید (آزمایش محلی)
برای اینکه حافظه نهان خود را برای کلید بررسی کنید categories_cache
، از دستورات زیر در اعلان فرمان:
- Redis CLI را باز کنید:
redis-cli
-
بررسی کنید که آیا
categories_cache
وجود دارد:
EXISTS categories_cache
اگر برگردد 1
، کلید وجود دارد. اگر 0
، از دست رفته است.
- داده های ذخیره شده را دریافت کنید:
GET categories_cache
این باید داده های ذخیره شده JSON را برگرداند.