對C#的不公正待遇表示下強烈的不滿
就沒了?就沒有C#使用redis??
話不多說,沖!
1:首先自己下載下傳安裝一個windows版本的redis,安裝後運作伺服器。
2:然後在VS2015中,右鍵項目名稱,點選nuget
我這邊安裝的是這個
這邊自己寫了一個封裝類
public class RedisHelper
{
private bool _disposed = false;
[DefaultValue("127.0.0.1")]
private static string _ip = "127.0.0.1";
[DefaultValue(6379)]
private static int _port = 6379;
private static ServiceStack.Redis.RedisClient client = new ServiceStack.Redis.RedisClient(_ip, _port);
public static string Ip
{
get
{
return _ip;
}
set
{
_ip = value;
}
}
public static int Port
{
get
{
return _port;
}
set
{
_port = value;
}
}
/// <summary>
/// 設定字元串類型
/// </summary>
/// <param name="keys"></param>
/// <param name="value"></param>
public static void SetString(string keys, string value)
{
client.Set<string>(keys, value);
}
/// <summary>
/// 擷取字元串類型
/// </summary>
/// <param name="keys"></param>
/// <returns></returns>
public static string GetString(string keys)
{
return client.Get<string>(keys);
}
public static bool HasContains(string Hasname, string key)
{
return client.HExists(Hasname, Encoding.ASCII.GetBytes(key)) > 0;
}
/// <summary>
/// 設定哈希值
/// </summary>
/// <param name="HasName"></param>
/// <param name="filedname"></param>
/// <param name="filedvalue"></param>
public static void SetHas(string HasName, string filedname, string filedvalue)
{
byte[] d = Encoding.ASCII.GetBytes(filedname);
d = Encoding.ASCII.GetBytes(filedvalue);
client.HSet(HasName, Encoding.ASCII.GetBytes(filedname), Encoding.ASCII.GetBytes(filedvalue));
}
/// <summary>
/// 設定多個哈希值
/// </summary>
/// <param name="HasName"></param>
/// <param name="filedname"></param>
/// <param name="filedvalue"></param>
public static void SetHas(string HasName, string[] filedname, string[] filedvalue)
{
byte[][] keys = new byte[filedname.Length][];
byte[][] values = new byte[filedvalue.Length][];
for (int j = 0; j < filedname.Length; j++)
{
keys[j] = Encoding.ASCII.GetBytes(filedname[j]);
values[j] = Encoding.ASCII.GetBytes(filedvalue[j] == null ? "" : filedvalue[j]);
}
client.HMSet(HasName, keys, values);
}
public static string[] GetHasKey(string HasName)
{
byte[][] result = client.HKeys(HasName);
if (result == null)
return null;
string[] ReturnValues = new string[result.Length];
for (int j = 0; j < result.Length; j++)
{
ReturnValues[j] = Encoding.ASCII.GetString(result[j]);
}
return ReturnValues;
}
/// <summary>
/// 擷取哈希值
/// </summary>
/// <param name="HasName"></param>
/// <param name="filedname"></param>
/// <returns></returns>
public static string GetHas(string HasName, string filedname)
{
byte[] result = client.HGet(HasName, Encoding.ASCII.GetBytes(filedname));
string s = Encoding.ASCII.GetString(result);
return result == null ? "" : Encoding.ASCII.GetString(result);
}
/// <summary>
/// 擷取哈希值
/// </summary>
/// <param name="HasName"></param>
/// <param name="filedname"></param>
/// <returns></returns>
public static string[] GetHas(string HasName, string[] filedname)
{
byte[][] parms = new byte[filedname.Length][];
for (int j = 0; j < filedname.Length; j++)
{
parms[j] = Encoding.ASCII.GetBytes(filedname[j]);
}
byte[][] values = client.HMGet(HasName, parms);
string[] ReturnValues = new string[values.Length];
for (int j = 0; j < values.Length; j++)
{
ReturnValues[j] = Encoding.ASCII.GetString(values[j]);
}
return ReturnValues;
}
/// <summary>
/// 設定Set類型的資料
/// </summary>
/// <param name="Setname"></param>
/// <param name="value"></param>
public static void SetSet(string Setname, string value) //set集合是 String 類型的無序集合。集合成員是唯一的。
{
if (!client.ContainsKey(Setname))
{
byte[] data = Encoding.ASCII.GetBytes(value);
client.SAdd(Setname, data);
}
}
/// <summary>
/// 擷取Set類型的資料
/// </summary>
/// <param name="Setname"></param>
/// <returns></returns>
public static string[] GetSet(string Setname)
{
if (client.ContainsKey(Setname))
{
byte[][] data = client.SMembers(Setname);
string[] ReturnValues = new string[data.Length];
for (int j = 0; j < data.Length; j++)
{
ReturnValues[j] = Encoding.ASCII.GetString(data[j]);
}
return ReturnValues;
}
return null;
}
/// <summary>
/// 添加list清單的資料。
/// </summary>
/// <param name="ListName"></param>
/// <param name="value"></param>
public static void SetList(string ListName, string value)
{
byte[] result = Encoding.ASCII.GetBytes(value);
client.LPush(ListName, result);
}
public static string GetList(string ListName)
{
//list清單的第一個元素為最後插入的這個元素,後進先出的原則
//byte[] result = client.LPop(ListName);//移出并擷取清單的第一個元素
byte[] result = client.RPop(ListName);//移除并擷取清單的最後一個元素
return Encoding.ASCII.GetString(result);
}
/// <summary>
/// 設定有序集合的值
/// </summary>
/// <param name="SortedSetName"></param>
/// <param name="score"></param>
/// <param name="value"></param>
public static void SetSortedSet(string SortedSetName,double score, string value)
{
byte[] result = Encoding.ASCII.GetBytes(value);
client.ZAdd(SortedSetName, score, result);
}
//有序集合和集合一樣也是 string 類型元素的集合,且不允許重複的成員
//不同的是每個元素都會關聯一個 double 類型的分數。redis 正是通過分數來為集合中的成員進行從小到大的排序。
//有序集合的成員是唯一的,但分數(score)卻可以重複。
/// <summary>
/// 擷取有序集合的值
/// </summary>
/// <param name="SortedSetName"></param>
/// <param name="min"></param>
/// <param name="max"></param>
/// <returns></returns>
public static string[] GetSortedSet(string SortedSetName,int min,int max)
{
byte[][] data = client.ZRangeWithScores(SortedSetName, min, max);//同時傳回值和分數
string[] ReturnValues = new string[data.Length];
for (int j = 0; j < data.Length; j++)
{
ReturnValues[j] = Encoding.ASCII.GetString(data[j]);
}
return ReturnValues;
}
/// <summary>
/// 使用管道傳輸資料至redis
/// </summary>
/// <param name="keys"></param>
/// <param name="values"></param>
public static void SetStringByPipe(List<string> keys, List<string> values)
{
var pipeline = client.CreatePipeline();
for (int j = 0; j < keys.Count; j++)
{
pipeline.QueueCommand(r => r.Set(keys[j], values[j]));
}
pipeline.Flush();
pipeline.Dispose();
}
/// <summary>
/// 使用管道傳輸從redis裡面擷取資料
/// </summary>
/// <param name="keys"></param>
/// <returns></returns>
public static List<string> GetStringByPipe(List<string> keys)
{
var result = new List<string>();
var pipeline = client.CreatePipeline();
for (int j = 0; j < keys.Count; j++)
{
pipeline.QueueCommand((r => r.Get<string>(keys[j])), result.Add);
}
pipeline.Flush();
pipeline.Dispose();
return result;
}
#region redis管理
/// <summary>
/// 關閉連接配接
/// </summary>
public static void CloseClient()
{
client.CloneClient();
client.Dispose();
}
protected virtual void Dispose(bool disposing)
{
if (!this._disposed)
{
if (disposing)
{
client.Dispose();
client = null;
}
}
this._disposed = true;
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
/// <summary>
/// 儲存資料DB檔案到硬碟
/// </summary>
public void Save()
{
client.Save();
}
/// <summary>
/// 異步儲存資料DB檔案到硬碟
/// </summary>
public void SaveAsync()
{
client.SaveAsync();
}
#endregion
}
使用隻要調用寫好的封裝方法即可。
//設定字元串
RedisHelper.SetString("string", "good");
//擷取字元串
string value = RedisHelper.GetString("string");
//設定哈希值
RedisHelper.SetHas("hash", "set", "ok");
//擷取哈希值
string value= RedisHelper.GetHas("hash", "set");
//擷取所有的哈希keys
string[] hashkeys = RedisHelper.GetHasKey("hash");
//設定list清單
RedisHelper.SetList("List","Value1");
RedisHelper.SetList("List", "Value2");
RedisHelper.SetList("List", "Value3");
//擷取list清單
string value = RedisHelper.GetList("List");
//設定set集合資料
RedisHelper.SetSet("set","value1");
RedisHelper.SetSet("set", "value2");
//擷取set類型集合資料
string[] value=RedisHelper.GetSet("set");
//設定有序集合的值
RedisHelper.SetSortedSet("sortset",1,"aaa");
RedisHelper.SetSortedSet("sortset", 2, "bbb");
RedisHelper.SetSortedSet("sortset", 3, "ccc");
//擷取有序集合的值
string[] value= RedisHelper.GetSortedSet("sortset", 0,2);
展示管道傳輸:
這邊準備了53萬3千多條資料,準備進行管道傳輸。讓我們來看看它的速度。
隻花了2.4s就插入成功!
接下來我們看看讀取
可以看到,隻花了1.87s就讀取成功53萬多條資料。
就是這麼強大。煩惱!