Dưới đây là một ví dụ đơn giản để cho bạn biết việc sử dụng một số cấu trúc dữ liệu nâng cao của Redis dễ dàng như thế nào - trong trường hợp này là Redis Liệt kê: Mã nguồn đầy đủ của ví dụ này có thể xem trực tuyến
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);
VÍ DỤ ĐẦU RA:
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:
Các ví dụ khác có sẵn trong [trang ví dụ RedisExamples Redis] và trong bộ thử nghiệm toàn diện
Tốc độ #
Một trong những điều tốt nhất về Redis là tốc độ - nó rất nhanh.
Ví dụ bên dưới này lưu trữ và nhận toàn bộ cơ sở dữ liệu Northwind (3202 bản ghi) trong vòng chưa đầy 1,2 giây - chúng tôi chưa bao giờ có nó nhanh như vậy!
(Chạy bên trong bài kiểm tra đơn vị VS.NET/R# trên iMac 3 năm tuổi)
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)
*/
Lưu ý:Tổng thời gian thực hiện bao gồm một thao tác Redis bổ sung cho mỗi bản ghi để lưu trữ id trong bộ Redis cho từng loại cũng như tuần tự hóa và hủy tuần tự từng bản ghi bằng cách sử dụng Service Stack's TypeSerializer.
Lex Operations #
Các hoạt động tập hợp được sắp xếp ZRANGEBYLEX mới cho phép bạn truy vấn từ điển một tập hợp đã sắp xếp đã được thêm vào. Một giới thiệu tốt về điều này có sẵn trên autocomplete.redis.io.
Các hoạt động mới này có sẵn dưới dạng ánh xạ 1:1 với redis-server trên IRedisNativeClient
:
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);
}
Và các API thân thiện với người dùng hơn trong IRedisClient
:
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);
}
Cũng giống như trình đối sánh phiên bản NuGet, Redis sử dụng [
char để thể hiện tính bao hàm và (
char cho tính độc quyền. Kể từ khi IRedisClient
Các API mặc định cho các tìm kiếm bao gồm, hai API này giống nhau:
Redis.SearchSortedSetCount("zset", "a", "c")
Redis.SearchSortedSetCount("zset", "[a", "[c")
Ngoài ra, bạn có thể chỉ định một hoặc cả hai giới hạn là độc quyền bằng cách sử dụng (
tiền tố, ví dụ:
Redis.SearchSortedSetCount("zset", "a", "(c")
Redis.SearchSortedSetCount("zset", "(a", "(c")
Có nhiều ví dụ về API hơn trong LexTests.cs.
HyperLog API #
Nhánh phát triển của máy chủ Redis (khả dụng khi phiên bản 3.0 được phát hành) bao gồm một thuật toán khéo léo để tính gần đúng các phần tử duy nhất trong một tập hợp với hiệu quả về không gian và thời gian tối đa. Để biết chi tiết về cách nó hoạt động, hãy xem blog của người sáng tạo Redis Salvatore, người giải thích nó rất chi tiết. Về cơ bản, nó cho phép bạn duy trì một cách hiệu quả để đếm và hợp nhất các phần tử duy nhất trong một tập hợp mà không cần phải lưu trữ các phần tử của nó. Một ví dụ đơn giản về nó trong hoạt động:
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
Quét API #
Redis v2.8 đã giới thiệu một hoạt động QUÉT mới tuyệt đẹp cung cấp một chiến lược tối ưu để duyệt toàn bộ bộ phím phiên bản redis trong các phần kích thước có thể quản lý chỉ sử dụng con trỏ phía máy khách và không giới thiệu bất kỳ trạng thái máy chủ nào. Đó là một giải pháp thay thế hiệu suất cao hơn và nên được sử dụng thay vì KEYS trong mã ứng dụng. SCAN và các hoạt động liên quan của nó để duyệt qua các thành viên của Bộ, Bộ được sắp xếp và Hàm băm hiện có sẵn trong Ứng dụng khách Redis trong các API sau:
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
cung cấp một API cấp cao hơn mà trừu tượng hóa con trỏ máy khách để hiển thị chuỗi Enumerable lười biếng nhằm cung cấp một cách tối ưu để phát trực tuyến các kết quả được quét tích hợp độc đáo với LINQ, ví dụ:
var scanUsers = Redis.ScanAllKeys("urn:User:*");
var sampleUsers = scanUsers.Take(10000).ToList(); //Stop after retrieving 10000 user keys