StackExchange.Redis 是一個不錯的 Redis C# 驅動,使用起來也相對比較簡單。
1> 引用 StackExchange.redis
PM> Install-Package StackExchange.Redis
2> StackExchange.redsi 應用實例
由於 Redis 采用單線程單進程模型,所以 Redis 連接實例可以用單例來實現;
public class RedisContextOpertion { private static ConnectionMultiplexer _redisConnection; private static object objLock = new object(); static RedisContextOpertion() { if (_redisConnection == null) { lock (objLock) { if (_redisConnection == null) { //StackExchange.redsi 支持 Redis 集群; // string connString = "127.0.0.1:6379,127.0.0.1:6380"; string connString = "127.0.0.1:6379"; _redisConnection = ConnectionMultiplexer.Connect(connString); } } } } public static ConnectionMultiplexer RedisConnection { get { return _redisConnection; } } private RedisContextOpertion() { } }
調用方法:
var conn = RedisContextOpertion.RedisConnection; var resisDb = conn.GetDatabase();
StackExchang.redis 應用實例:
A :求有序集合(Sorted Sets)差集;
構造有序集合數據源: key1,key2;
var conn = RedisContextOpertion.RedisConnection; var redisDb = conn.GetDatabase(); SortedSetEntry[] entity = new SortedSetEntry[] {new SortedSetEntry("a",100),new SortedSetEntry("b",200) }; SortedSetEntry[] entity1 = new SortedSetEntry[] { new SortedSetEntry("b", 200), new SortedSetEntry("c", 300) }; redisDb.SortedSetAdd("key1", entity, CommandFlags.None); redisDb.SortedSetAdd("key2", entity1, CommandFlags.None);
key1:
key2:
計算代碼:
var conn = RedisContextOpertion.RedisConnection;
var redisDb = conn.GetDatabase();
//先求出兩個集合的並集,同時設置重合項的乘法因子為 0(),設置聚合方式為取最小值;
//("weights", 1, 0)weights 為關健字,1 為key1的乘法因子,0為key2的乘法因子,有多個 key 時,以此類推;
redisDb.Execute("ZUNIONSTORE", "newkey", 2, "key1", "key2", "weights", 1, 0, "aggregate", "min");
//去除 score 為零的的元素,得到差集;
redisDb.Execute("ZREMRANGEBYSCORE", "newkey", 0, 0);
var queryResult = redisDb.SortedSetRangeByScoreWithScores("newkey");
Console.WriteLine("value\tscore");
foreach (var item in queryResult)
{
Console.WriteLine("{0}\t{1}",item.Element,item.Score);
}
計算結果:
注意事項:此方法不能在 Redis 集群環境中運行,因為 Redis 不支持跨節點調用,也就是說 Redis Cluser 不支持,帶有兩個或以上 key 的命令;如果想要在集群環境中應用,就必需要保證 key1 , key2 和 newkey 存放在同一個 hash 槽內,以下實例實現不同的key存放在同一個 hash 槽內;
B:Redis 集群環境中,不同 key 存放在同一 hash 槽內
其實,要想使不同的 key 存放到同一 hash 槽內是比較簡單的,我們只需要使多個 key 擁有共同的部分,並用“{}”把共同的部分包裹起來就可以了。當然這樣做違背了集群均衡原則,我們只在特殊情況下使用。
var conn = RedisContextOpertion.RedisConnection;
var db = redis.GetDatabase();
var entity1 = new SortedSetEntry[] { new SortedSetEntry("a", 100), new SortedSetEntry("b", 200) };
var entity2 = new SortedSetEntry[] { new SortedSetEntry("b", 200), new SortedSetEntry("c", 300) };
var commKey = "{testkey}"; // 多個 key 的共同部分;
db.SortedSetAdd(commKey + "1", entity1);
db.SortedSetAdd(commKey + "2", entity2);
C:Redis 批量添加不同類型數據;
var conn = RedisContextOpertion.RedisConnection; var db = conn.GetDatabase(); List<Task> listTask = new List<Task>(); var batch = db.CreateBatch(); listTask.Add(batch.StringSetAsync("key1", "a")); //添加字符串類型數據; listTask.Add(batch.SortedSetAddAsync("key2", "b", 1)); // 添加有序集合數據; batch.Execute(); Task.WaitAll(listTask.ToArray());
D:Stack.Exchange.redis 推薦的寫法;
string value = await db.StringGetAsync(key); if (value == null) { value = await ComputeValueFromDatabase(...); db.StringSet(key, value, flags: CommandFlags.FireAndForget); } return value;