Redis C# 驅動 StackExchange.Redis 應用實例


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;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM