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

रेडिस क्लाइंट एपीआई के साथ शुरुआत करना

रेडिस की कुछ उन्नत डेटा संरचनाओं का उपयोग करना कितना आसान है, इसका स्वाद देने के लिए नीचे एक सरल उदाहरण दिया गया है - इस मामले में रेडिस सूचियां:इस उदाहरण का पूर्ण स्रोत कोड ऑनलाइन देखा जा सकता है

using var redisClient = new RedisClient();
//Create a 'strongly-typed' API that makes all Redis Value operations to apply against Shippers
IRedisTypedClient<Shipper> redis = redisClient.As<Shipper>();

//Redis lists implement IList<T> while Redis sets implement ICollection<T>
var currentShippers = redis.Lists["urn:shippers:current"];
var prospectiveShippers = redis.Lists["urn:shippers:prospective"];

currentShippers.Add(
    new Shipper {
        Id = redis.GetNextSequence(),
        CompanyName = "Trains R Us",
        DateCreated = DateTime.UtcNow,
        ShipperType = ShipperType.Trains,
        UniqueRef = Guid.NewGuid()
    });

currentShippers.Add(
    new Shipper {
        Id = redis.GetNextSequence(),
        CompanyName = "Planes R Us",
        DateCreated = DateTime.UtcNow,
        ShipperType = ShipperType.Planes,
        UniqueRef = Guid.NewGuid()
    });

var lameShipper = new Shipper {
    Id = redis.GetNextSequence(),
    CompanyName = "We do everything!",
    DateCreated = DateTime.UtcNow,
    ShipperType = ShipperType.All,
    UniqueRef = Guid.NewGuid()
};

currentShippers.Add(lameShipper);

Dump("ADDED 3 SHIPPERS:", currentShippers);

currentShippers.Remove(lameShipper);

Dump("REMOVED 1:", currentShippers);

prospectiveShippers.Add(
    new Shipper {
        Id = redis.GetNextSequence(),
        CompanyName = "Trucks R Us",
        DateCreated = DateTime.UtcNow,
        ShipperType = ShipperType.Automobiles,
        UniqueRef = Guid.NewGuid()
    });

Dump("ADDED A PROSPECTIVE SHIPPER:", prospectiveShippers);

redis.PopAndPushBetweenLists(prospectiveShippers, currentShippers);

Dump("CURRENT SHIPPERS AFTER POP n' PUSH:", currentShippers);
Dump("PROSPECTIVE SHIPPERS AFTER POP n' PUSH:", prospectiveShippers);

var poppedShipper = redis.PopFromList(currentShippers);
Dump("POPPED a SHIPPER:", poppedShipper);
Dump("CURRENT SHIPPERS AFTER POP:", currentShippers);

//reset sequence and delete all lists
redis.SetSequence(0);
redis.Remove(currentShippers, prospectiveShippers);
Dump("DELETING CURRENT AND PROSPECTIVE SHIPPERS:", currentShippers);

उदाहरण आउटपुट:

ADDED 3 SHIPPERS:
Id:1,CompanyName:Trains R Us,ShipperType:Trains,DateCreated:2010-01-31T11:53:37.7169323Z,UniqueRef:d17c5db0415b44b2ac5da7b6ebd780f5
Id:2,CompanyName:Planes R Us,ShipperType:Planes,DateCreated:2010-01-31T11:53:37.799937Z,UniqueRef:e02a73191f4b4e7a9c44eef5b5965d06
Id:3,CompanyName:We do everything!,ShipperType:All,DateCreated:2010-01-31T11:53:37.8009371Z,UniqueRef:d0c249bbbaf84da39fc4afde1b34e332

REMOVED 1:
Id:1,CompanyName:Trains R Us,ShipperType:Trains,DateCreated:2010-01-31T11:53:37.7169323Z,UniqueRef:d17c5db0415b44b2ac5da7b6ebd780f5
Id:2,CompanyName:Planes R Us,ShipperType:Planes,DateCreated:2010-01-31T11:53:37.799937Z,UniqueRef:e02a73191f4b4e7a9c44eef5b5965d06

ADDED A PROSPECTIVE SHIPPER:
Id:4,CompanyName:Trucks R Us,ShipperType:Automobiles,DateCreated:2010-01-31T11:53:37.8539401Z,UniqueRef:67d7d4947ebc4b0ba5c4d42f5d903bec

CURRENT SHIPPERS AFTER POP n' PUSH:
Id:4,CompanyName:Trucks R Us,ShipperType:Automobiles,DateCreated:2010-01-31T11:53:37.8539401Z,UniqueRef:67d7d4947ebc4b0ba5c4d42f5d903bec
Id:1,CompanyName:Trains R Us,ShipperType:Trains,DateCreated:2010-01-31T11:53:37.7169323Z,UniqueRef:d17c5db0415b44b2ac5da7b6ebd780f5
Id:2,CompanyName:Planes R Us,ShipperType:Planes,DateCreated:2010-01-31T11:53:37.799937Z,UniqueRef:e02a73191f4b4e7a9c44eef5b5965d06

PROSPECTIVE SHIPPERS AFTER POP n' PUSH:

POPPED a SHIPPER:
Id:2,CompanyName:Planes R Us,ShipperType:Planes,DateCreated:2010-01-31T11:53:37.799937Z,UniqueRef:e02a73191f4b4e7a9c44eef5b5965d06

CURRENT SHIPPERS AFTER POP:
Id:4,CompanyName:Trucks R Us,ShipperType:Automobiles,DateCreated:2010-01-31T11:53:37.8539401Z,UniqueRef:67d7d4947ebc4b0ba5c4d42f5d903bec
Id:1,CompanyName:Trains R Us,ShipperType:Trains,DateCreated:2010-01-31T11:53:37.7169323Z,UniqueRef:d17c5db0415b44b2ac5da7b6ebd780f5

DELETING CURRENT AND PROSPECTIVE SHIPPERS:

अधिक उदाहरण [RedisExamples Redis उदाहरण पृष्ठ] और व्यापक परीक्षण सूट में उपलब्ध हैं

गति #

रेडिस के बारे में सबसे अच्छी चीजों में से एक गति है - यह तेज़ है।

नीचे दिया गया यह उदाहरण संपूर्ण नॉर्थविंड डेटाबेस (3202 रिकॉर्ड) को 1.2 सेकंड से कम में संग्रहीत और प्राप्त करता है - हमने इसे इतनी जल्दी कभी नहीं खाया!

(3 साल पुराने iMac पर VS.NET/R# यूनिट टेस्ट के अंदर दौड़ना)

using var client = new RedisClient();

var before = DateTime.Now;
client.StoreAll(NorthwindData.Categories);
client.StoreAll(NorthwindData.Customers);
client.StoreAll(NorthwindData.Employees);
client.StoreAll(NorthwindData.Shippers);
client.StoreAll(NorthwindData.Orders);
client.StoreAll(NorthwindData.Products);
client.StoreAll(NorthwindData.OrderDetails);
client.StoreAll(NorthwindData.CustomerCustomerDemos);
client.StoreAll(NorthwindData.Regions);
client.StoreAll(NorthwindData.Territories);
client.StoreAll(NorthwindData.EmployeeTerritories);

Console.WriteLine("Took {0}ms to store the entire Northwind database ({1} records)",
    (DateTime.Now - before).TotalMilliseconds, totalRecords);

before = DateTime.Now;
var categories = client.GetAll<Category>();
var customers = client.GetAll<Customer>();
var employees = client.GetAll<Employee>();
var shippers = client.GetAll<Shipper>();
var orders = client.GetAll<Order>();
var products = client.GetAll<Product>();
var orderDetails = client.GetAll<OrderDetail>();
var customerCustomerDemos = client.GetAll<CustomerCustomerDemo>();
var regions = client.GetAll<Region>();
var territories = client.GetAll<Territory>();
var employeeTerritories = client.GetAll<EmployeeTerritory>();

Console.WriteLine("Took {0}ms to get the entire Northwind database ({1} records)",
    (DateTime.Now - before).TotalMilliseconds, totalRecords);
/*
== EXAMPLE OUTPUT ==

Took 1020.0583ms to store the entire Northwind database (3202 records)
Took 132.0076ms to get the entire Northwind database (3202 records)
*/

नोट:कुल समय में प्रत्येक रिकॉर्ड के लिए प्रत्येक प्रकार के लिए एक रेडिस सेट में आईडी को स्टोर करने के साथ-साथ सर्विस स्टैक के टाइपसेरियलाइज़र का उपयोग करके प्रत्येक रिकॉर्ड को क्रमबद्ध और डी-सीरियलाइज़ करने के लिए एक अतिरिक्त रेडिस ऑपरेशन शामिल है।

लेक्स ऑपरेशंस #

नया ZRANGEBYLEX सॉर्ट किया गया सेट ऑपरेशन आपको एक सॉर्ट किए गए सेट को शाब्दिक रूप से क्वेरी करने की अनुमति देता है। इसके लिए एक अच्छा शोकेस autocomplete.redis.io पर उपलब्ध है।

ये नए ऑपरेशन IRedisNativeClient पर रेडिस-सर्वर के साथ 1:1 मैपिंग के रूप में उपलब्ध हैं। :

public interface IRedisNativeClient
{
    ...
    byte[][] ZRangeByLex(string setId, string min, string max, int? skip, int? take);
    long ZLexCount(string setId, string min, string max);
    long ZRemRangeByLex(string setId, string min, string max);
}

और IRedisClient . के अंतर्गत अधिक उपयोगकर्ता-अनुकूल API :

public interface IRedisClient
{
    ...
    List<string> SearchSortedSet(string setId, string start=null, string end=null);
    long SearchSortedSetCount(string setId, string start=null, string end=null);
    long RemoveRangeFromSortedSetBySearch(string setId, string start=null, string end=null);
}

NuGet संस्करण मिलानकर्ताओं की तरह, Redis [ . का उपयोग करता है समावेशिता व्यक्त करने के लिए चार और ( विशिष्टता के लिए चार। चूंकि IRedisClient एपीआई डिफ़ॉल्ट रूप से समावेशी खोजों के लिए है, ये दो एपीआई समान हैं:

Redis.SearchSortedSetCount("zset", "a", "c")
Redis.SearchSortedSetCount("zset", "[a", "[c")

वैकल्पिक रूप से आप ( . का उपयोग करके अनन्य होने के लिए एक या दोनों सीमाओं को निर्दिष्ट कर सकते हैं उपसर्ग, उदा:

Redis.SearchSortedSetCount("zset", "a", "(c")
Redis.SearchSortedSetCount("zset", "(a", "(c")

अधिक API उदाहरण LexTests.cs में उपलब्ध हैं।

HyperLog API #

रेडिस सर्वर की विकास शाखा (v3.0 जारी होने पर उपलब्ध) में अधिकतम स्थान और समय दक्षता वाले सेट में अद्वितीय तत्वों का अनुमान लगाने के लिए एक सरल एल्गोरिदम शामिल है। यह कैसे काम करता है इसके बारे में विवरण के लिए रेडिस के निर्माता सल्वाटोर का ब्लॉग देखें जो इसे बहुत विस्तार से बताता है। अनिवार्य रूप से यह आपको अपने तत्वों को संग्रहीत किए बिना एक सेट में अद्वितीय तत्वों को गिनने और मर्ज करने का एक कुशल तरीका बनाए रखने देता है। कार्रवाई में इसका एक सरल उदाहरण:

redis.AddToHyperLog("set1", "a", "b", "c");
redis.AddToHyperLog("set1", "c", "d");
var count = redis.CountHyperLog("set1"); //4

redis.AddToHyperLog("set2", "c", "d", "e", "f");

redis.MergeHyperLogs("mergedset", "set1", "set2");

var mergeCount = redis.CountHyperLog("mergedset"); //6

एपीआई स्कैन करें #

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

public interface IRedisClient
{
    ...
    IEnumerable<string> ScanAllKeys(string pattern = null, int pageSize = 1000);
    IEnumerable<string> ScanAllSetItems(string setId, string pattern = null, int pageSize = 1000);
    IEnumerable<KeyValuePair<string, double>> ScanAllSortedSetItems(string setId, string pattern = null, int pageSize = 1000);
    IEnumerable<KeyValuePair<string, string>> ScanAllHashEntries(string hashId, string pattern = null, int pageSize = 1000);    
}

public interface IRedisClientAsync
{
    IAsyncEnumerable<string> ScanAllKeysAsync(string pattern = null, int pageSize, CancellationToken ct);
    IAsyncEnumerable<string> ScanAllSetItemsAsync(string setId, string pattern = null, int pageSize, CancellationToken ct);
    IAsyncEnumerable<KeyValuePair<string, double>> ScanAllSortedSetItemsAsync(string setId, string pattern = null, int pageSize, ct);
    IAsyncEnumerable<KeyValuePair<string, string>> ScanAllHashEntriesAsync(string hashId, string pattern = null, int pageSize, ct);
}

//Low-level API
public interface IRedisNativeClient
{
    ...
    ScanResult Scan(ulong cursor, int count = 10, string match = null);
    ScanResult SScan(string setId, ulong cursor, int count = 10, string match = null);
    ScanResult ZScan(string setId, ulong cursor, int count = 10, string match = null);
    ScanResult HScan(string hashId, ulong cursor, int count = 10, string match = null);
}

public interface IRedisNativeClientAsync 
{
    ValueTask<ScanResult> ScanAsync(ulong cursor, int count = 10, string match = null, CancellationToken ct);
    ValueTask<ScanResult> SScanAsync(string setId, ulong cursor, int count = 10, string match = null, CancellationToken ct);
    ValueTask<ScanResult> ZScanAsync(string setId, ulong cursor, int count = 10, string match = null, CancellationToken ct);
    ValueTask<ScanResult> HScanAsync(string hashId, ulong cursor, int count = 10, string match = null, CancellationToken ct);
}

IRedisClient एक उच्च-स्तरीय एपीआई प्रदान करता है जो क्लाइंट कर्सर को एक आलसी एन्यूमरेबल अनुक्रम का पर्दाफाश करने के लिए दूर करता है ताकि स्कैन किए गए परिणामों को स्ट्रीम करने का एक इष्टतम तरीका प्रदान किया जा सके जो LINQ के साथ अच्छी तरह से एकीकृत हो, उदाहरण:

var scanUsers = Redis.ScanAllKeys("urn:User:*");
var sampleUsers = scanUsers.Take(10000).ToList(); //Stop after retrieving 10000 user keys 

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. एक्शनकंट्रोलर का उपयोग कैसे करें ::रेस्क्यू + रेडिस के साथ लाइव (चैट एप्लिकेशन के लिए)

  2. रेडिस स्वतः पूर्ण

  3. गोलांग + रेडिस समवर्ती अनुसूचक प्रदर्शन मुद्दा

  4. रेडिस हैश बनाम कई कुंजियों का उपयोग करने की प्रदर्शन तुलना

  5. रेडिस दृढ़ता के साथ मासट्रांसिट गाथा देता है मेथड एक्पेट में कार्यान्वयन अपवाद नहीं है