آیا ردیس فقط بر اساس کلید فراخوانی می شود؟

درود خدمت دوستان . من برای کش کردن در سرورم اومده از redis استفاده کردم . یک مشکلی دارم شاید بخاطر کتابخونه ای هست که در الکسیر استفاده می کنم باشه

آیا تو ردیس می شه مثل دیتابیس هایی مثل پستگرس و … مثلا بجز کلید بر اساس موارد دیگه هم سرچ زد ؟
مثلا تو کل جداول سرچ بزنه اونایی که مثلا سنشون 12 سال هست رو بیاره ؟

من فعلا می تونم مثلا بر اساس کلیدم بیارم مثلا شناسه کاربر

با تشکر

1 پسندیده

کلا redis یه key/value استور هستش. نهایتا می تونی یه سری ساختار داده مثل لیست و مپ و اینها رو توش ذخیره کنی. نباید مثل یه دیتا بیش relational باهاش برخورد کنی.

اما یه کاراهایی هم میشه کرد. اونم اینه کلید هاتو جوری بسازی که بعدا با یه wildcard رو شون سرچ کنی. این قابلیت خیلی خوبیه اما در حد یه key/value store و نه بیشتر

2 پسندیده

برای استفاده از ردیس معمولا یک سری کلید با namespace در برنامه اصلی میگذاری و بر اساس اون کلید ها داده میگیری یا update میکنی
wildcard در ردیس تمام کلید هارو سکن میکنه و در محیط production توصیه نمیشه
برای مثال اینطوری کد میشه کرد


class FailedLogin
  attr_reader :user_uuid, :login_fail_key
  def initialize(user_uuid)
    @user_uuid = user_uuid
    @login_fail_key = login_fail_key_for(user_uuid)
  end

  def increment
    redis.multi do
      redis.incr(login_fail_key)
      redis.expire(login_fail_key, 200)
    end
  end

  def set_lock
    if redis.get(login_fail_key) > 5
      ...
  end

  private

  def login_fail_key_for(user_uuid)
    "app_name:login.failed:#{user_uuid}"
  end
end
1 پسندیده

ممنون از دو دوست و اساتید عزیم و همیشه همراه.

بنده کلیدمو تغییر دادم و روی چیزی که خواستم قرار دادم تا بر اساس اون مورد سرچ بشه و خوشبختانه می تونست یونیک نیز باشه . حالا یک سوال در مورد یک کاری که کردم بپرسم که آیا از نظر شما مناسب است یا خیر؟

من زمانی که در ردیس مثلا برای توکن یک رکورد می سازم برای اینکه ردیس پر نشه می یام مثلا

  • اول رکورد توکن را در ردیس قرار می دم
  • دوم با یک کتابخونه اسکژول بک گراند جاب در elixir می گم مثلا ۲۴ ساعت دیگه فلان کلید توکن در redis چک کن اگر تاریخ انقضای اون گذشته بود پاکش کن اگر نبود دوباره تابع خودتو صدا بزن به صورت بازگشتی تا ۲۴ ساعت دیگه باز بری چک کنی

این کارو کردم که به مرور ذخیره سازی های بی موردی در redis قرار نگیره . آیا کار من درست هست ؟ آیا من دارم بی خود سرور رو اشغال می کنم ؟ لازم به ذکر هست من از exq در الکسیر استفاده کردم .

دلیل این کارم هم این بود انقضای توکن ها نیز نمی تونه هیچ وقت کلیدم باشه

سلام شهریار عزیز کلید ها در ردیس همه دستورexpire با زمان میگیرن و خودبخود پاک میشن وقتی از رمان گذشت اصلا دلیلی برای کار بالا نیست زمان بصورت ثانیه از حالاست

1 پسندیده

درود سام عزیز ممنون ازت . من در داکیومنت Redix در الکسیر دستوری برای expire اصلا ندیدم . منظور شما پاک کردن کلی در خود تنظیمات redis هست که خودش روی کل جداول اعمال می کنه یا چیزی هست که ما بهش می دیم ؟

https://redis.io/commands/expire

https://redis.io/commands/setex

Redix هر دستور که تو docs ردیس هست میتونی بدی بهش بعد زمان که میگذاره کلید اتوماتیک از بین میره

1 پسندیده