对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;
}
public static void SetHashByPipe(string hashname, Dictionary<string, string> value)
{
var pipeline = client.CreatePipeline();
pipeline.QueueCommand(r => r.SetRangeInHash(hashname, value));
pipeline.Flush();
pipeline.Dispose();
}
public static List<string> GetHashByPipe(string hashname, List<string> keys)
{
var result = new List<string>();
var pipeline = client.CreatePipeline();
foreach (var item in keys)
{
pipeline.QueueCommand((r => r.GetValueFromHash(hashname, item)), 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万多条数据。
就是这么强大。烦恼!