.net 5.0 - 使用CSRedisCore操作redis


 為什么選擇CSRedisCore

 ServiceStack.Redis 是商業版,免費版有限制;

 StackExchange.Redis 是免費版,但是內核在 .NETCore 運行有問題經常 Timeout,暫無法解決;

 CSRedis於2016年開始支持.NETCore一直迭代至今,實現了低門檻、高性能,和分區高級玩法的.NETCore redis-cli SDK;

 在v3.0版本更新中,CSRedis中的所有方法名稱進行了調整,使其和redis-cli保持一致,如果你熟悉redis-cli的命令的話,CSRedis可以直接上手,這樣學習成本就降低很多。

 如何集成:引用和配置
  •  引用包
CSRedisCore
  •  appsettings.json
{
  //Redis服務配置
  "Redis": {
    "Default": {
      "Connection": "192.168.1.101:6379",
      "InstanceName": "local",
      "DefaultDB": 0
    }
  }
}
 如何集成:redis 控制台 引用方式
  •  初始化
using CSRedis;

namespace RedisCommon
{
    public class RedisInit
    {
        public static void RedisInitialization()
        {
            string connection = Appsettings.Instance.GetByKey("Redis:Default:Connection");
            string defaultDB = Appsettings.Instance.GetByKey("Redis:Default:DefaultDB");
            var csRedis = new CSRedisClient($"{connection},defaultDatabase={defaultDB},prefix=test");
            RedisHelper.Initialization(csRedis);
        }
    }
}

 

static void Main(string[] args)
{
    //初始化Redis
    RedisInit.RedisInitialization();    
}
 如何集成:redis webapi 引用方式
  •  StartUp類配置
/// <summary>
/// 初始化Redis緩存
/// </summary>
private void InitRedis()
{
    //redis緩存
    var section = Configuration.GetSection("Redis:Default");
    //連接字符串
    string _connectionString = section.GetSection("Connection").Value;
    //默認數據庫 
    int _defaultDB = int.Parse(section.GetSection("DefaultDB").Value ?? "0");

    var csredis = new CSRedis.CSRedisClient($"{_connectionString},defaultDatabase={_defaultDB},idleTimeout=3000,poolsize=5,prefix=GYG-API:KEY_");
    RedisHelper.Initialization(csredis);
}

 鏈接字符串詳解

 127.0.0.1:6379,password=YourPassword,defaultDatabase=0,prefix=hr_

Parameter   Default Explain  說明 
 password  <Empty>  Redis server password  Redis服務器密碼
 defaultDatabase  0  Redis server database  Redis服務器數據庫
 asyncPipeline  false  The asynchronous method automatically uses pipeline, and the 10W concurrent time is 450ms (welcome to feedback)  異步方式自動使用管道,10W並發時間450ms(歡迎反饋)
 poolsize  50  Connection pool size  連接池大小
 idleTimeout  20000  idle time of elements in the connection pool(MS),suitable for connecting to remote redis server   連接池中元素的空閑時間(MS),適合連接到遠程redis服務器
 connectTimeout  5000  Connection timeout(MS)   連接超時(毫秒)
 syncTimeout  10000  Send / receive timeout(MS)   發送/接收超時(毫秒)
 preheat  5  Preheat connections, receive values such as preheat = 5 preheat 5 connections  預熱連接,接收值,例如Preheat=5 Preheat 5 connections
 autoDispose  true  Follow system exit event to release automatically   跟隨系統退出事件自動釋放
 ssl  false  Enable encrypted transmission  啟用加密傳輸
 testcluster  true  是否嘗試集群模式,阿里雲、騰訊雲集群需要設置此選項為false  
 tryit  0  Execution error, retry  attempts  執行錯誤,重試次數
 name  <Empty>  Connection name, use client list command to view  連接名稱,使用client list命令查看
 prefix  <Empty>  key前綴,所有方法都會附帶此前綴,csredis.Set(prefix + "key", 111);  
 0、通用指令
//查找所有分區節點中符合給定模式(pattern)的 key
string[] keyAll = RedisHelper.Keys("*");
            
//以秒為單位,返回給定 key 的剩余生存時間
long ttl1 = RedisHelper.Ttl("keyString1");

//用於在 key 存在時刪除 key
long del1 = RedisHelper.Del("keyString1");

//檢查給定 key 是否存在
bool isExists1 = RedisHelper.Exists("keyString1");

//為給定 key 設置過期時間
bool isExpire1 = RedisHelper.Expire("keyString1", 100);

//為給定 key 設置過期時間
RedisHelper.ExpireAt("keyString1", new DateTime(2021, 6, 11, 16, 0, 0));
 1、string(字符串)
  • 簡單操作
// 設置指定 key 值,默認不過期
bool set_string1 = RedisHelper.Set("keyString_String1", "測試值1");

// 設置指定 key 值,並設置過期時間(單位:秒)
bool set_string2 = RedisHelper.Set("keyString_String2", "測試值2", 1);

// 獲取指定 key 的值,不存在的 key,值返回null
string get_string1 = RedisHelper.Get("keyString_String1");

// 獲取指定 key 的值,不存在的 key,或者指定的 key 不是int型,則返回int類型的默認值0
int get_int1 = RedisHelper.Get<int>("keyString_String1");
  • 對整數類型進行自增,自減操作
bool set_int1 = RedisHelper.Set("keyString_Num1", "23");

// 將 key 所儲存的值加上指定的增量值(increment)
long incrBy1 = RedisHelper.IncrBy("keyString_Num1", 2);// #25

// 將 key 所儲存的值加上指定的增量值(increment),負數就是減量值
long incrBy2 = RedisHelper.IncrBy("keyString_Num1", -1);// #24
  • 在指定 key 的 value 末尾追加字符串
bool set_append1 = RedisHelper.Set("keyString_Append1", "qaz", 30);

// 將指定的 value 追加到該 key 原來值(value)的末尾
long append1 = RedisHelper.Append("keyString_Append1", "wsx");// #6 結果:key 中字符串的長度
 2、hash(哈希)
  • #HSet、HGet、HDel方法 [只能處理一個鍵值對]
// 將哈希表 key 中的字段 field 的值設為 value
bool set_hash_user1_uname = RedisHelper.HSet("User:10001", "uname", "gongyg"); // 冒號的作用相當於創建一個文件夾
bool set_hash_user1_upwd = RedisHelper.HSet("User:10001", "upassword", "123456");
bool set_hash_user1_uid = RedisHelper.HSet("User:10001", "uid", "12");

// 獲取存儲在哈希表中指定字段的值
string uName = RedisHelper.HGet("User:10001", "uname");

// 獲取存儲在哈希表中指定字段的值,並指定類型
int uId = RedisHelper.HGet<int>("User:10001", "uid");

// 刪除一個或多個哈希表字段,不能刪除key
long hDel1 = RedisHelper.HDel("User:10001", "uname");
  • #HGetAll、HKeys、HVals
// 獲取在哈希表中指定 key 的所有字段和值
Dictionary<string, string> user10001 = RedisHelper.HGetAll("User:10001");
foreach (var item in user10001)
{
    string key = item.Key;
    string value = item.Value;
}

// 獲取所有哈希表中的字段 [雖然使用HGetAll可以取出所有的value,但是有時候散列包含的值可能非常大,容易造成服務器的堵塞,為了避免這種情況,我們可以使用HKeys取到散列的所有鍵(HVals可以取出所有值),然后再使用HGet方法一個一個地取出鍵對應的值。]
string[] fields = RedisHelper.HKeys("User:10001");
foreach (string item in fields)
{
    string val = RedisHelper.HGet("User:10001", item);
}

// 獲取哈希表中所有的值
string[] vals = RedisHelper.HVals("User:10001");
  • #HMSet、HMGet [HGet和HSet方法執行一次只能處理一個鍵值對,而HMGet和HMSet是他們的多參數版本,一次可以處理多個鍵值對。]
//var keyValues = dic.Select(a => new [] { a.Key, a.Value.ToString() }).SelectMany(a => a).ToArray();
string[] user2 = new string[] { "uname", "gmd", "upwd", "123" };
// 同時將多個field-value(域-值)對設置到哈希表 key 中
bool set_hash_user2 = RedisHelper.HMSet("User:10002", user2);

string[] user_get2 = new string[] { "uname", "upwd", "sj" };
// 獲取存儲在哈希表中多個字段的值
string[] user_val2 = RedisHelper.HMGet("User:10002", user_get2); // #gmd,123,
  • #對散列中的值進行自增、自減操作
bool set_hash_user1_usex = RedisHelper.HSet("User:10003", "uage", "23");

// 為哈希表 key 中的指定字段和整數值加上增量(increment)自增(正數),自減(負數)
long hIncrBy = RedisHelper.HIncrBy("User:10001", "uage", 2);
 3、list(列表)
// 將一個或多個值插入到列表頭部
string[] lpush1 = new string[] { "003", "004" };
long len1 = RedisHelper.LPush("list", "000");
long len2 = RedisHelper.LPush("list", "001", "002");
long len3 = RedisHelper.LPush("list", lpush1);

// 在列表中添加一個或多個值 [列表尾部]
long len4 = RedisHelper.RPush("list", "010");

// 移除並獲取列表的第一個元素
string val1 = RedisHelper.LPop("list");

// 移除並獲取列表的最后一個元素
string val2 = RedisHelper.RPop("list");

// 獲取列表指定范圍內的元素[key, start, stop]
string[] lrang1 = RedisHelper.LRange("list", 0, 2); // #左側開始,獲取前3個元素
string[] lrang2 = RedisHelper.LRange("list", 0, -1); // #左側開始,獲取全部元素

// 將 list 最后一個元素彈出並壓入 list_another 的頭部 [只有一個元素的改變,源列表會少一個元素,目標列表多出一個元素]
RedisHelper.RPopLPush("list", "list_another");
RedisHelper.Expire("list_another", 30);
 4、set(無序集合)
  • #對集合中的成員進行操作
// 向集合添加一個或多個成員 [返回添加成功個數]
long sadd1 = RedisHelper.SAdd("my_set", "qaz");
long sadd2 = RedisHelper.SAdd("my_set", "tgb", "yhn");
string[] set1 = new string[] { "wsx", "edc" , "rfv" };
long sadd3 = RedisHelper.SAdd("my_set", set1);

// 判斷 member 元素是否是集合 key 的成員
bool isMember = RedisHelper.SIsMember("my_set", "qaz");

// 返回集合中的所有成員
string[] members = RedisHelper.SMembers("my_set");

// 返回集合中的一個隨機成員
string member1 = RedisHelper.SRandMember("my_set");

// 移除集合中一個或多個成員
long sRem = RedisHelper.SRem("my_set", "qaz");

// 移除並返回集合中一個隨機成員
string member2 = RedisHelper.SPop("my_set");
  • #對兩個集合進行交、並、差操作
RedisHelper.SAdd("set-a", "item1", "item2", "item3", "item4", "item5");
RedisHelper.SAdd("set-b", "item2", "item5", "item6", "item7");

// 差集
RedisHelper.SDiff("set-a", "set-b"); // "item1", "item3","item4"

// 交集
RedisHelper.SInter("set-a", "set-b"); // "item2","item5"

// 並集
RedisHelper.SUnion("set-a", "set-b"); // "item1","item2","item3","item4","item5","item6","item7"

//#另外還可以用SDiffStore,SInterStore,SUnionStore將操作后的結果存儲在新的集合中。
 5、zset(sorted set:有序集合)
  • 有序集合可以看作是可排序的散列,不過有序集合的val成為score分值,集合內的元素就是基於score進行排序的,score以雙精度浮點數的格式存儲。
// 向有序集合添加一個或多個成員,或者更新已存在成員的分數
RedisHelper.ZAdd("sorted_set", (1, "beijing"));
RedisHelper.ZAdd("sorted_set", (2, "shanghai"), (3, "shenzhen"));
(decimal, object)[] set1 = new (decimal, object)[] { (4, "guangzhou"), (5, "tianjing"), (6, "chengdu") };
RedisHelper.ZAdd("sorted_set", set1);

// 有序集合中對指定成員的分數加上增量 increment
decimal incr = RedisHelper.ZIncrBy("sorted_set", "beijing", -2);

// 通過索引區間返回有序集合成指定區域內的成員,分數從低到高 [key, start, stop] 
string[] zRange1 = RedisHelper.ZRange("sorted_set", 0, 2);
string[] zRange2 = RedisHelper.ZRange("sorted_set", 0, -1); // #stop=-1返回全部

// 返回有序集合中指定區域內的成員,通過索引,分數從高到底 [key, start, stop]
string[] zRevRange1 = RedisHelper.ZRevRange("sorted_set", 0 , 2);
string[] zRevRange2 = RedisHelper.ZRevRange("sorted_set", 0, -1); // #stop=-1返回全部

// 移除有序集合中一個或多個成員
RedisHelper.ZRem("sorted_set", "shenzhen");

// 獲取有序集合的成員數量
long number = RedisHelper.ZCard("sorted_set");

// 通過分數返回有序集合指定區間內的成員
string[] ZRangByScore1 = RedisHelper.ZRangeByScore("sorted_set", 2, 4);

// 通過索引區間返回有序集合成指定區間內的成員和分數
(string member, decimal score)[] sets = RedisHelper.ZRangeWithScores("Quiz", 0, -1);
 6、Geo(經緯度)
//1. 添加地點經緯度 [存儲到 sorted set 中]
RedisHelper.GeoAdd("myLocation", Convert.ToDecimal(116.20), Convert.ToDecimal(39.56), "北京");
RedisHelper.GeoAdd("myLocation", Convert.ToDecimal(120.51), Convert.ToDecimal(30.40), "上海");

//2. 求兩點之間的距離
var d1 = RedisHelper.GeoDist("myLocation", "北京", "上海", GeoUnit.km);
 7、事務
// 開啟事務
var pipe = RedisHelper.StartPipe();

//中間對redis進行操作
pipe.Set("pipe1", "wsx");

// 提交
pipe.EndPipe();

 


免責聲明!

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



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