為什么選擇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();
