Laravel Türkiye Discord Kanalı Forumda kod paylaşılırken dikkat edilmesi gerekenler!Birlikte proje geliştirmek ister misiniz?
  • YardımLaravel
  • Dinamik Filtreleme İçin Cache Yapısını Nasıl Kurmalıyım?

Laravel projemde Redis kullanarak bazı verileri cache'lemek istiyorum. Kullanıcılar, veri listesini döviz cinsi ve yayınlanma tarihi gibi özelliklere göre filtreleyebiliyor. Bu durumda nasıl bir yol izlemeliyim?

    myusuf Cache keylerini filtrelere göre oluşturacaksınız. Eğer kullanıcıya özel şeyleri barındırıyorsa içerisine kullanıcı id de ekleyeceksiniz.

      mgsmus Peki key olarak filtrenin raw sql halini slug olarak kullanabilir miyiz örn: select-from-users-where-id-0 gibi ?

        ragmus Olaya çok hakim değilim fakat sql hali yerine direkt users-{id} gibi kullanmak daha iyi olabilir. Bu sayede verilerde bir değişiklik yaptığınız zaman hangi key ile tutlan cache verisini sıfırlayacağınızı bilirsiniz. 3 id li userde bir değişiklik olduysa users-3 keyi ile tutulan cache sıfırlamak gibi.

          kursatcanciger Evet bu da mantıklı ama filtreleme seçenekleri artarsa bununla beraber yazılımcının da iş yükü artacaktır. Burada ben tercih yapacak olsam bu şekilde bir yöntem tercih ederdim.

          ragmus Burada filtrenin nasıl olduğu kullanıldığı önemli. Mesela döviz kuru, kullanıcıya göre değişmiyor. Şu şekilde olabilir:

          $exchangeRates = Cache::remember('exchange_rates', 60 * 60, function () {
              // Döviz kurlarını getiren işlem...
          });

          ama mesela kullanıcılar HTTP filtreleme yapıyordur; örneğin ?filter[user_id]=5&filter[color]=kırmızı&sort=-created_at ve bu önbelleğe alınmak isteniyorsa

          $payload = urldecode(
              http_build_query($request->only('filter', 'sort'))
          );
          
          // Kullanıcıya özel olacaksa
          // $payload = $request->user()->id.$payload;
          
          $key = md5($payload);
          
          $results = Cache::remember($key, 60 * 60, function () {
              // ...
          });

          yapılabilir.