اگر بخواهیم دستورات ردیس را مستقیما درون برنامه فراخوانی کنیم میتوانیم از LuaScript که در کتابخانه StackExchange.Redis قرار دارد استفاده کنیم. با استفاده از LuaScript میتوانیم چندین دستور ردیس را در یک ریکوئست اجرا کنیم.
سناریویی را در نظر بگیرید که تعداد دفعات فراخوانی شدن یک API یا یک متد برای شما مهم باشد و اگر از حدی بیشتر شد آن را اجرا نکنید و یا کاربر را بلاک کنید ( در این مثال هدف بررسی دستورات Redis میباشد ). برای این کار میتوانیم از متد INCR ردیس استفاده کنیم که با هربار اجرا شدن یک عدد برمیگرداند که مشخص میکند یک Key چندبار فراخوانی شده است. و سپس اگر تعداد ریکوئست ها از حدی بیشتر شد مقدار 1- برگشت داده شود و Key مربوطه پاک شود یا اکسپایر تایم آن به روز شود و یا... .
برای این کار ابتدا باید پکیج StackExchange.Redis را نصب کنید. سپس برای استفاده میتوانیم خودمان دستور مورد نیاز را بنویسیم و آن را به ردیس ارسال کنیم.
public async Task<int> Increment(string key, int maximum)
{
string script = @"local count
count = tonumber(redis.call('INCR', @key))
if(count > tonumber(@maximum))
then
redis.call('DEL', @key)
return -1
else
return count
end";
LuaScript incrementScript = LuaScript.Prepare(script);
var result = await _database
.ScriptEvaluateAsync(incrementScript, new
{
key = new RedisKey(key),
maximum
});
return (int)result;
}
در متغییر script دستور مربوط به ردیس را نوشته ایم که ابتدا متد INCR فراخوانی میشود و مقدار برگشت داده شده در متغییر محلی count قرار میگیرد و اگر مقدار برگشت داده شده از متغییر maximum بیشتر باشد key مورد نظر پاک میشود و مقدار 1- برگشت داده میشود در غیراینصورت همان مقدار برگشت داده شده از متد INCR برگشت داده میشود. اگر key مورد نظر شما در ردیس موجود نباشد، ابندا در ردیس ذخیره میشود و سپس مقدار 1 برگشت داده میشود.
با استفاده از متد ScriptEvaluateAsync میتوانید دستورات نوشته شده را اجرا کنید و در پارامتر اول آن باید اسکریپت نوشته شده را ارسال کنید و در پارمتر دوم باید پارامترهای موردنیاز اسکریپت را ارسال کنید که در این مثال یک key و یک maximum ارسال کرده ایم. مقدار برگشتی این متد یک RedisResult میباشد که باید به ریزالت مورد نظر خودتان آن را Cast کنید.
برای اتصال به ردیس از IConnectionMultiplexer استفاده کرده ایم که در سازنده کلاس RedisRepository نمونه سازی شده است.
private readonly IDatabase _database;
public RedisRepostitory(IConnectionMultiplexer connectionMultiplexer)
{
_database = connectionMultiplexer.GetDatabase();
}
سپس باید IConnectionMultiplexer را به DI رجیستر کنیم در Startup:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddSingleton<IRedisRepostitory, RedisRepostitory>();
services.AddSingleton<IConnectionMultiplexer>(ConnectionMultiplexer.Connect(Configuration["Redis:Host"]));
}
کدهای این مطلب را میتوانید از گیت هاب دانلود کنید.
;)
Powered by Froala Editor
مطالبی که منتشر میکنی عالی هستند.تشکر
ارسال شده در تاریخ پنج شنبه، ۱۶ دی ۱۴۰۰خواهش میکنم عثمان جان، لطف داری.
ارسال شده در تاریخ شنبه، ۱۸ دی ۱۴۰۰