cache.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119
  1. package db
  2. import (
  3. "fmt"
  4. "reflect"
  5. "time"
  6. "github.com/langgenius/dify-plugin-daemon/internal/utils/cache"
  7. )
  8. const (
  9. CACHE_PREFIX = "cache"
  10. CACHE_EXPIRE_TIME = time.Minute * 5
  11. )
  12. type KeyValuePair struct {
  13. Key string
  14. Val any
  15. }
  16. type GetCachePayload[T any] struct {
  17. Getter func() (*T, error)
  18. CacheKey []KeyValuePair
  19. }
  20. func joinCacheKey(typename string, pairs []KeyValuePair) string {
  21. cache_key := CACHE_PREFIX
  22. for _, kv := range pairs {
  23. cache_key += ":" + kv.Key + ":"
  24. // convert value to string
  25. cache_key += fmt.Sprintf("%v", kv.Val)
  26. }
  27. return cache_key
  28. }
  29. func GetCache[T any](p *GetCachePayload[T]) (*T, error) {
  30. var t T
  31. typename := reflect.TypeOf(t).String()
  32. // join cache key
  33. cache_key := joinCacheKey(typename, p.CacheKey)
  34. // get cache
  35. val, err := cache.Get[T](cache_key)
  36. if err == nil {
  37. return val, nil
  38. }
  39. if err == cache.ErrNotFound {
  40. // get from getter
  41. val, err := p.Getter()
  42. if err != nil {
  43. return nil, err
  44. }
  45. // set cache
  46. err = cache.Store(cache_key, val, CACHE_EXPIRE_TIME)
  47. if err != nil {
  48. return nil, err
  49. }
  50. return val, nil
  51. } else {
  52. return nil, err
  53. }
  54. }
  55. type DeleteCachePayload[T any] struct {
  56. Delete func() error
  57. CacheKey []KeyValuePair
  58. }
  59. func DeleteCache[T any](p *DeleteCachePayload[T]) error {
  60. var t T
  61. typename := reflect.TypeOf(t).String()
  62. // join cache key
  63. cache_key := joinCacheKey(typename, p.CacheKey)
  64. // delete cache
  65. err := cache.Del(cache_key)
  66. if err != nil {
  67. return err
  68. }
  69. err = p.Delete()
  70. if err != nil {
  71. return err
  72. }
  73. return nil
  74. }
  75. type UpdateCachePayload[T any] struct {
  76. Update func() error
  77. CacheKey []KeyValuePair
  78. }
  79. func UpdateCache[T any](p *UpdateCachePayload[T]) error {
  80. var t T
  81. typename := reflect.TypeOf(t).String()
  82. // join cache key
  83. cache_key := joinCacheKey(typename, p.CacheKey)
  84. err := p.Update()
  85. if err != nil {
  86. return err
  87. }
  88. // delete cache
  89. err = cache.Del(cache_key)
  90. if err != nil {
  91. return err
  92. }
  93. return nil
  94. }