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文件,如下圖:
第一步(配置本地服務)
第二部(安裝和配置客戶端)
文件中的“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();
}
}
}