版權聲明:本文為部落客原創文章,未經部落客允許不得轉載。 https://blog.csdn.net/chinahuyong/article/details/51753996
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SN5YzMzUTM1ITMtADM1kDN2IjNxQjM2AjNxAjMtIzN1cTNx8CX2AjNxAjMvwlM3UzN1EzLcd2bsJ2Lc12bj5ycn9Gbi52YuUTMwIzcldWYtl2Lc9CX6MHc0RHaiojIsJye.png)
。
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,這是連結:
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();
}
}
}