"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > احصل على ذاكرة تخزين مؤقت عالية الأداء مع TTL واستمرارية القرص

احصل على ذاكرة تخزين مؤقت عالية الأداء مع TTL واستمرارية القرص

تم النشر بتاريخ 2024-08-15
تصفح:268

Go High-Performance Cache with TTL and Disk Persistence

1. المقدمة

قم بتسريع مشاريع Golang الخاصة بك دون الحاجة إلى إنشاء قاعدة بيانات في كل مرة تبدأ فيها مشروعًا جديدًا. هل سئمت من تكوين قواعد البيانات من الصفر؟ فقط لمواجهة مشاكل جديدة؟ لا مزيد من البحث في هذه المدونة، سنبحث في مكتبة التخزين المؤقت لـ Golang مع دعم TTL، مثابرة القرص و نوع بيانات التجزئة.

جو سويفت.

2.الشرط المسبق

  • المعرفة الأساسية بالجولانج
  • معرفة كيفية عمل ذاكرة التخزين المؤقت النموذجية

3.الميزات

  1. تعيين الأمر والحصول عليه
  2. أمر التحديث
  3. أمر ديل
  4. أمر موجود
  5. دعم TTL
  6. دعم حفظ القرص (اللقطات)
  7. دعم نوع بيانات التجزئة (Hset، Hget، HgetAll، HMset)
  8. القفل الآمن

تعيين والحصول على الأمر

import (
    "fmt"
    "github.com/leoantony72/goswift"
)

func main(){
    cache := goswift.NewCache()

    // Value 0 indicates no expiry
    cache.Set("key", "value", 0)

    val, err := cache.Get("key")
    if err !=nil{
        fmt.Println(err)
        return
    }
    fmt.Println("key", val)
}

أمر التحديث

// Update value
// @Update(key string, val interface{}) error
err = cache.Update("key","value2")
if err != nil{
    fmt.Println(err)
    return
}

أمر Del && موجود الأمر

// Delete command
// @Del(key string)
cache.Del("key")

// Exist command
// @Exists(key string) bool
value = cache.Exists("key")
fmt.Println(value) // returns false

دعم TTL

// Set Value with Expiry
// @Set(key string, val interface{}, exp int)
// Here expiry is set to 1sec
cache.Set("key","value",1000)

// Hset command
// @Hset(key, field string, value interface{}, exp int)
// in this case the "key" expires in 1sec
cache.Hset("key","name","value",1000)
cache.Hset("key","age",18,1000)

دعم نوع بيانات التجزئة (Hset، Hget، HgetAll، HMset)

// Hset command
// @Hset(key, field string, value interface{}, exp int)
// in this case the "key" expires in 1sec
cache.Hset("key","name","value",1000)
cache.Hset("key","age",18,1000)


// HMset command
// @HMset(key string, d interface{}, exp int) error
// Set a Hash by passing a Struct/Map
// ---by passing a struct---
type Person struct{
    Name  string
    Age   int
    Place string
}

person1 := &Person{Name:"bob",Age:18,Place:"NYC"}
err = cache.HMset("key",person1)
if err != nil{
    fmt.Println(err)
    return
}

// ---by passing a map---
person2 := map[string]interface{Name:"john",Age:18,Place:"NYC"}
err = cache.HMset("key",person2)
if err != nil{
    fmt.Println(err)
    return
}


// Hget command
// @HGet(key, field string) (interface{}, error)
// get individual fields in Hash
data,err := cache.HGet("key","field")
if err != nil{
    fmt.Println(err)
    return
}
fmt.Println(data)

// HgetAll command
// @HGetAll(key string) (map[string]interface{}, error)
// gets all the fields with value in a hash key
// retuns a map[string]interface{}
data,err = cache.HGetAll("key")
if err != nil{
    fmt.Println(err)
    return
}

لقطات

opt := goswift.CacheOptions{
        EnableSnapshots:  true,
        SnapshotInterval: time.Second*5,
    }
c := goswift.NewCache(opt)

سيؤدي هذا إلى أخذ لقطة من البيانات كل 5 ثوانٍ وحفظها في ملف Snapshot.data. بشكل افتراضي، يتم تعطيل اللقطات وإذا لم يتم توفير SnapshotInterval، فإن القيمة الافتراضية هي 5 ثوانٍ.

ملاحظة: إذا كانت EnableSnapshot خاطئة، فلن يتم استيراد البيانات المحفوظة في الملف

معالجة الأخطاء

const (
    ErrKeyNotFound   = "key does not Exists"
    ErrFieldNotFound = "field does not Exists"
    ErrNotHashvalue  = "not a Hash value/table"
    ErrHmsetDataType = "invalid data type, Expected Struct/Map"
)

هذه هي الأخطاء الشائعة التي قد تحدث أثناء كتابة الكود. توفر لك هذه المتغيرات طريقة واضحة وسهلة لمقارنة الأخطاء لتحديد الأخطاء.

data,err := cache.Get("key")
if err != nil {
    if err.Error() == goswift.ErrKeyNotFound {
        //do something
}
}    

الأعمال الداخلية لانتهاء صلاحية ذاكرة التخزين المؤقت

كل 3 ثوانٍ، يتم استدعاء وظيفة **sweaper ** لمسح القيم منتهية الصلاحية من جدول التجزئة. نحتفظ بكومة دقيقة تشير إلى خريطة التجزئة. سيكون العنصر العلوي هو المفتاح ذو أصغر TTL. نجتاز الشجرة حتى تصبح مدة البقاء (TTL) أكبر من الوقت الحالي.

ملخص

لا أنصحك باستخدام هذا في الإنتاج!!، لكن لا تتردد في استخدامه في مشروعك الجانبي الصغير. قم بتجربته وإذا واجهت خطأ ما، فقم بإجراء مشكلة في GitHub repo.

البريد الإلكتروني: [email protected]
جيثب: https://github.com/leoantony72
الريبو: https://github.com/leoantony72/goswift

بيان الافراج تم إعادة إنتاج هذه المقالة على: https://dev.to/leoantony72/go-high-performance-cache-with-ttl-and-disk-persistence-4a4m?1 إذا كان هناك أي انتهاك، يرجى الاتصال بـ [email protected] لحذفه
أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3