Redis
 sql >> डेटाबेस >  >> NoSQL >> Redis

RedisClient LUA APIs

IRedisClient रेडिस सर्वर-साइड एलयूए समर्थन के लिए एपीआई को नीचे अधिक उपयोगकर्ता के अनुकूल एपीआई में फिर से शामिल किया गया है:

public interface IRedisClient 
{
    //Eval/Lua operations 
    T ExecCachedLua<T>(string scriptBody, Func<string, T> scriptSha1);

    RedisText ExecLua(string body, params string[] args);
    RedisText ExecLua(string luaBody, string[] keys, string[] args);
    RedisText ExecLuaSha(string sha1, params string[] args);
    RedisText ExecLuaSha(string sha1, string[] keys, string[] args);

    string ExecLuaAsString(string luaBody, params string[] args);
    string ExecLuaAsString(string luaBody, string[] keys, string[] args);
    string ExecLuaShaAsString(string sha1, params string[] args);
    string ExecLuaShaAsString(string sha1, string[] keys, string[] args);
    
    int ExecLuaAsInt(string luaBody, params string[] args);
    int ExecLuaAsInt(string luaBody, string[] keys, string[] args);
    int ExecLuaShaAsInt(string sha1, params string[] args);
    int ExecLuaShaAsInt(string sha1, string[] keys, string[] args);

    List<string> ExecLuaAsList(string luaBody, params string[] args);
    List<string> ExecLuaAsList(string luaBody, string[] keys, string[] args);
    List<string> ExecLuaShaAsList(string sha1, params string[] args);
    List<string> ExecLuaShaAsList(string sha1, string[] keys, string[] args);

    string CalculateSha1(string luaBody);
    
    bool HasLuaScript(string sha1Ref);
    Dictionary<string, bool> WhichLuaScriptsExists(params string[] sha1Refs);
    void RemoveAllLuaScripts();
    void KillRunningLuaScript();
    string LoadLuaScript(string body);
}

LUA में कुशल स्कैन #

नीचे दिया गया C# API key:* . से मेल खाने वाले पहले 10 परिणाम देता है पैटर्न:

var keys = Redis.ScanAllKeys(pattern: "key:*", pageSize: 10)
    .Take(10).ToList();

हालांकि, उपरोक्त सी # स्ट्रीमिंग एपीआई को अनुरोध को पूरा करने के लिए अज्ञात संख्या में रेडिस ऑपरेशंस (रेडिस में चाबियों की संख्या तक सीमित) की आवश्यकता होती है। एक उच्चतर pageSize . चुनकर स्कैन कॉल की संख्या को कम किया जा सकता है हर बार स्कैन ऑपरेशन को कॉल करने पर रेडिस को अधिक कुंजियों को स्कैन करने के लिए कहना।

चूंकि एपीआई कॉलों की संख्या में बड़ी संख्या में रेडिस ऑपरेशंस के परिणामस्वरूप होने की क्षमता है, यह कई निर्भर रिमोट नेटवर्क कॉलों की विलंबता के कारण अस्वीकार्य देरी उत्पन्न कर सकता है। एक आसान समाधान यह है कि इसके बजाय कई स्कैन कॉलों को रेडिस सर्वर पर इन-प्रोसेस किया जाए, जिससे कई स्कैन कॉलों की नेटवर्क विलंबता समाप्त हो जाए, जैसे:

const string FastScanScript = @"
local limit = tonumber(ARGV[2])
local pattern = ARGV[1]
local cursor = 0
local len = 0
local results = {}
repeat
    local r = redis.call('scan', cursor, 'MATCH', pattern, 'COUNT', limit)
    cursor = tonumber(r[1])
    for k,v in ipairs(r[2]) do
        table.insert(results, v)
        len = len + 1
        if len == limit then break end
    end
until cursor == 0 or len == limit
return results";

RedisText r = redis.ExecLua(FastScanScript, "key:*", "10");
r.Children.Count.Print() //= 10

ExecLua एपीआई इस जटिल LUA तालिका प्रतिक्रिया को Children . में लौटाता है RedisText . का संग्रह प्रतिक्रिया।

वैकल्पिक जटिल API प्रतिक्रिया #

LUA ऑपरेशन में जटिल डेटा संरचनाओं को वापस करने का दूसरा तरीका परिणाम को JSON के रूप में क्रमबद्ध करना है

return cjson.encode(results)

जिसे आप स्ट्रिंग के रूप में प्रतिक्रिया को पार्स करके कच्चे JSON के रूप में एक्सेस कर सकते हैं:

string json = redis.ExecLuaAsString(FastScanScript, "key:*", "10");

जानकारी

Redis React की RedisServices में भी यही तरीका इस्तेमाल किया जाता है।

ExecCachedLua #

ExecCachedLua एक सुविधाजनक उच्च-स्तरीय एपीआई है जो उच्च-प्रदर्शन सर्वर LUA लिपियों को निष्पादित करने के लिए आवश्यक बहीखाता पद्धति को समाप्त करता है जो RDBMS संग्रहीत प्रक्रियाओं में कई समस्याओं से ग्रस्त है जो RDBMS में पहले से मौजूद स्थिति पर निर्भर करती है जिसे अद्यतन करने की आवश्यकता है संग्रहित प्रक्रिया का नवीनतम संस्करण।

Redis LUA के साथ आपके पास या तो भेजने, पार्स करने, लोड करने का विकल्प होता है, फिर हर बार इसे कॉल करने पर संपूर्ण LUA स्क्रिप्ट निष्पादित करें या वैकल्पिक रूप से आप LUA स्क्रिप्ट को स्टार्टअप पर एक बार Redis में प्री-लोड कर सकते हैं और फिर स्क्रिप्ट के SHA1 हैश का उपयोग करके इसे निष्पादित कर सकते हैं। इसके साथ मुद्दा यह है कि यदि रेडिस सर्वर गलती से फ्लश हो जाता है तो आपके पास पहले से मौजूद स्क्रिप्ट पर निर्भर एक टूटे हुए एप्लिकेशन के साथ छोड़ दिया जाता है जो अब नहीं है। नया ExecCachedLua एपीआई दोनों दुनिया के सर्वश्रेष्ठ प्रदान करता है जहां यह हमेशा संकलित SHA1 स्क्रिप्ट को निष्पादित करेगा, बैंडविड्थ और सीपीयू को बचाएगा, लेकिन अगर यह अब मौजूद नहीं है तो LUA स्क्रिप्ट को फिर से बनाएगा।

आप इसके बजाय इसके SHA1 पहचानकर्ता द्वारा संकलित LUA स्क्रिप्ट को निष्पादित कर सकते हैं, जो काम करना जारी रखता है, भले ही वह कभी अस्तित्व में न हो या रनटाइम पर हटा दिया गया हो, जैसे:

// #1: Loads LUA script and caches SHA1 hash in Redis Client
r = redis.ExecCachedLua(FastScanScript, sha1 =>
    redis.ExecLuaSha(sha1, "key:*", "10"));

// #2: Executes using cached SHA1 hash
r = redis.ExecCachedLua(FastScanScript, sha1 =>
    redis.ExecLuaSha(sha1, "key:*", "10"));

// Deletes all existing compiled LUA scripts 
redis.ScriptFlush();

// #3: Executes using cached SHA1 hash, gets NOSCRIPT Error, 
//     re-creates then re-executes the LUA script using its SHA1 hash
r = redis.ExecCachedLua(FastScanScript, sha1 =>
    redis.ExecLuaSha(sha1, "key:*", "10"));

उपयोग के उदाहरण #

यहां बताया गया है कि आप ZPOP . को कैसे लागू कर सकते हैं लुआ में क्रमबद्ध सेट से निम्नतम रैंक वाले आइटम को निकालने के लिए:

var luaBody = @"
    local val = redis.call('zrange', KEYS[1], 0, ARGV[1]-1)
    if val then redis.call('zremrangebyrank', KEYS[1], 0, ARGV[1]-1) end
    return val";

var i = 0;
var alphabet = 26.Times(c => ((char)('A' + c)).ToString());
alphabet.ForEach(x => Redis.AddItemToSortedSet("zalphabet", x, i++));

//Remove the letters with the lowest rank from the sorted set 'zalphabet'
var letters = Redis.ExecLuaAsList(luaBody, keys: new[] { "zalphabet" }, args: new[] { "3" });
letters.PrintDump(); //[A, B, C]

और कैसे कार्यान्वित करें ZREVPOP क्रमबद्ध सेट से उच्चतम रैंक वाले आइटम निकालने के लिए:

var luaBody = @"
    local val = redis.call('zrange', KEYS[1], -ARGV[1], -1)
    if val then redis.call('zremrangebyrank', KEYS[1], -ARGV[1], -1) end
    return val";

var i = 0;
var alphabet = 26.Times(c => ((char)('A' + c)).ToString());
alphabet.ForEach(x => Redis.AddItemToSortedSet("zalphabet", x, i++));

//Remove the letters with the highest rank from the sorted set 'zalphabet'
List<string> letters = Redis.ExecLuaAsList(luaBody, 
    keys: new[] { "zalphabet" }, args: new[] { "3" });

letters.PrintDump(); //[X, Y, Z]

अन्य उदाहरण #

एक int लौटा रहा है :

int intVal = Redis.ExecLuaAsInt("return 123"); //123
int intVal = Redis.ExecLuaAsInt("return ARGV[1] + ARGV[2]", "10", "20"); //30

एक string लौटा रहा है :

//Hello, Redis Lua!
var strVal = Redis.ExecLuaAsString(@"return 'Hello, ' .. ARGV[1] .. '!'", "Redis Lua");

एक List लौटा रहा है स्ट्रिंग्स की:

Enum.GetNames(typeof(DayOfWeek)).ToList()
    .ForEach(x => Redis.AddItemToList("DaysOfWeek", x));

var daysOfWeek = Redis.ExecLuaAsList("return redis.call('LRANGE', 'DaysOfWeek', 0, -1)");
daysOfWeek.PrintDump(); //[Sunday, Monday, Tuesday, ...]

अधिक उदाहरण Redis Eval Lua परीक्षणों में पाए जा सकते हैं


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. एक यूआरएल के तहत मैराथन (मेसोस) में रेडिस चलाएं

  2. क्या मैं रूबी डाइजेस्ट ::SHA1 इंस्टेंस ऑब्जेक्ट को क्रमबद्ध कर सकता हूं?

  3. रेडिस सर्वर रिबूट/स्केल के बाद रेडिस क्लाइंट को फिर से कैसे कनेक्ट करें

  4. अपने वर्डप्रेस इंस्टॉलेशन को गति देने के लिए रेडिस ऑब्जेक्ट कैश का उपयोग करना

  5. रेडिस के लिए पासवर्ड कैसे सेट करें?