.NET中Redis安裝部署及使用方法簡介附->開源Redis操作輔助類

  

  Redis是一個用的比較廣泛的Key/Value的內存數據庫,新浪微博、Github、StackOverflow等大型應用中都用其作爲緩存,Redis的官網爲http://redis.io/

  Redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,爲了保證效率,數據都是緩存在內存中。區別的是redis會週期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
  Redis 是一個高性能的key-value數據庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合可以對關係數據庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。
  Redis支持主從同步。數據可以從主服務器向任意數量的從服務器上同步,從服務器可以是關聯其他從服務器的主服務器。這使得Redis可執行單層樹複製。存盤可以有意無意的對數據進行寫操作。由於完全實現了發佈/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道並接收主服務器完整的消息發佈記錄。同步對讀取操作的可擴展性和數據冗餘很有幫助。

  在這篇文章中我們將記錄一下Redis的安裝,以及如何在.NET中使用Redis。

  工具下載位置:http://pan.baidu.com/s/1jILIzLs,包括服務端配置以及查看緩存的工具。

 一、Redis服務端以服務方式運行

  服務端是以服務的形式運行,將Redis服務端解壓到某個目錄,然後以管理員方式運行cmd執行命令進行安裝:

redis-server.exe --service-install redis.windows.conf --loglevel verbose

  注意卸載服務的命令爲:

redis-server.exe --service-uninstall redis.windows.conf --loglevel verbose

  注意事項,修改Redis端口及密碼的配置在文件redis.windows-service.conf中:(使用redis284.rar中解壓文件

修改端口,壓縮文件中配置的是6488:

修改密碼

修改庫的數量

配置完成後,執行

redis-server.exe --service-install redis.windows.conf --loglevel verbose

到控制面板查看服務已經安裝成功了,注意首次安裝時默認沒有啓動,單擊啓動即可。

工具配置,安裝後如下圖

連接成功後,就可以查看緩存中的數據了

 二、Redis服務端以控制檯方式運行

  解壓下載的redis64-2.6.12.1.rar文件,如下圖:

 第一步(配置本地服務)

  點擊run這個DOS執行命令
  因爲是自己的電腦測試的,所以這個Redis默認的端口我們就不用修改了,如果到了正式的服務器,一定要修改端口號,防止黑客攻擊,獲取到你的數據,畢竟信息安全很重要,可以通過它的配置文件來修改。
 
看下用NotePad++打開配置文件,修改過後的效果圖,這裏我修改成了6380這個端口
這個就是更改過後的效果圖了,只要改了端口,再啓動run就可以發現端口號確實已經變了,第一步也已經完成了。

第二部(安裝和配置客戶端)

文件中的“redis-desktop-manager-0.8.2.3849.exe“是2015-11-23 從Redis的官網下載的客戶端安裝包,如果有更新可以去官網下載最新的Redis,這是鏈接:http://redis.io/

1.點擊客戶端安裝程序,下一步....,完成打開客戶端界面就可以了,省略安裝截圖。

  2.打開界面,客戶端默認讀取到6379的端口,會創建一個6379的Redis服務器

  由於我更改了6379的端口號,導致Redis客戶端默認創建的localhost服務器啓動不成功,這裏只需要右擊修改一下端口號就可以了。

三、C#訪問Redis

下載ServiceStack.Redis

和MongoDB一樣,在.NET中使用Redis其實也是使用第三方驅動,官網推薦的是使用ServiceStack.Redis下載後解壓得到如下dll

.NET項目中使用Redis

ServerStack中有很多方法可以在.NET中調用,其類結構圖如下:

Redis公共類庫參考

using System;
using System.Collections.Generic;
using System.Linq;

namespace RDIFramework.Utilities
{
using ServiceStack.Redis;
using ServiceStack.Redis.Generic;

/// <summary>
/// Redis公共輔助類庫
/// </summary>
public class RedisHelper : IDisposable
{
public RedisClient Redis = new RedisClient("127.0.0.1", 6379);
//緩存池
PooledRedisClientManager prcm = new PooledRedisClientManager();

//默認緩存過期時間單位秒
public int secondsTimeOut = 30 * 60;

/// <summary>
/// 緩衝池
/// </summary>
/// <param name="readWriteHosts"></param>
/// <param name="readOnlyHosts"></param>
/// <returns></returns>
public static PooledRedisClientManager CreateManager(
string[] readWriteHosts, string[] readOnlyHosts)
{
return new PooledRedisClientManager(readWriteHosts, readOnlyHosts,
new RedisClientManagerConfig
{
MaxWritePoolSize = readWriteHosts.Length * 5,
MaxReadPoolSize = readOnlyHosts.Length * 5,
AutoStart = true,
});// { RedisClientFactory = (IRedisClientFactory)RedisCacheClientFactory.Instance.CreateRedisClient("127.0.0.1", 6379) };
}
/// <summary>
/// 構造函數
/// </summary>
/// <param name="openPooledRedis">是否開啓緩衝池</param>
public RedisHelper(bool openPooledRedis = false)
{
if (openPooledRedis)
{
prcm = CreateManager(new string[] { "127.0.0.1:6379" }, new string[] { "127.0.0.1:6379" });
Redis = prcm.GetClient() as RedisClient;
}
}

#region Key/Value存儲
/// <summary>
/// 設置緩存
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key">緩存建</param>
/// <param name="t">緩存值</param>
/// <param name="timeout">過期時間,單位秒,-1:不過期,0:默認過期時間</param>
/// <returns></returns>
public bool Set<T>(string key, T t, int timeout = 0)
{
if (timeout >= 0)
{
if (timeout > 0)
{
secondsTimeOut = timeout;
}
Redis.Expire(key, secondsTimeOut);
}

return Redis.Add<T>(key, t);
}
/// <summary>
/// 獲取
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public T Get<T>(string key)
{
return Redis.Get<T>(key);
}
/// <summary>
/// 刪除
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public bool Remove(string key)
{
return Redis.Remove(key);
}

public bool Add<T>(string key, T t, int timeout)
{
if (timeout >= 0)
{
if (timeout > 0)
{
secondsTimeOut = timeout;
}
Redis.Expire(key, secondsTimeOut);
}
return Redis.Add<T>(key, t);
}
#endregion

#region 鏈表操作
/// <summary>
/// 根據IEnumerable數據添加鏈表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listId"></param>
/// <param name="values"></param>
/// <param name="timeout"></param>
public void AddList<T>(string listId, IEnumerable<T> values, int timeout = 0)
{
Redis.Expire(listId, 60);
IRedisTypedClient<T> iredisClient = Redis.As<T>();
if (timeout >= 0)
{
if (timeout > 0)
{
secondsTimeOut = timeout;
}
Redis.Expire(listId, secondsTimeOut);
}
var redisList = iredisClient.Lists[listId];
redisList.AddRange(values);
iredisClient.Save();
}
/// <summary>
/// 添加單個實體到鏈表中
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listId"></param>
/// <param name="Item"></param>
/// <param name="timeout"></param>
public void AddEntityToList<T>(string listId, T Item, int timeout = 0)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
if (timeout >= 0)
{
if (timeout > 0)
{
secondsTimeOut = timeout;
}
Redis.Expire(listId, secondsTimeOut);
}
var redisList = iredisClient.Lists[listId];
redisList.Add(Item);
iredisClient.Save();
}
/// <summary>
/// 獲取鏈表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listId"></param>
/// <returns></returns>
public IEnumerable<T> GetList<T>(string listId)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
return iredisClient.Lists[listId];
}
/// <summary>
/// 在鏈表中刪除單個實體
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listId"></param>
/// <param name="t"></param>
public void RemoveEntityFromList<T>(string listId, T t)
{
IRedisTypedClient<T> iredisClient = Redis.As<T>();
var redisList = iredisClient.Lists[listId];
redisList.RemoveValue(t);
iredisClient.Save();
}
/// <summary>
/// 根據lambada表達式刪除符合條件的實體
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="listId"></param>
/// <param name="func"></param>
public void RemoveEntityFromList<T>(string listId, Func<T, bool> func)
{
using (IRedisTypedClient<T> iredisClient = Redis.As<T>())
{
var redisList = iredisClient.Lists[listId];
T value = redisList.Where(func).FirstOrDefault();
redisList.RemoveValue(value);
iredisClient.Save();
}
}
#endregion
//釋放資源
public void Dispose()
{
if (Redis != null)
{
Redis.Dispose();
Redis = null;
}
GC.Collect();
}
}
}


 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章