|
原文:
.net core redis的全套操作
Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。 Redis支持主從同步。數據可以從主服務器向任意數量的從服務器上同步,從服務器可以是關聯其他從服務器的主服務器。這使得Redis可執行單層樹復制。存盤可以有意無意的對數據進行寫操作。 目錄 一、在centos7上安裝redis 二、redis string類型 三、redis list 類型 四、redis hash類型 五、redis sortedset類型 六、redis Subscribe 與 Publish 七、redis數據遷移
准備條件
實戰之路 一、在centos7上安裝redis 下載最新Remi的軟件源
安裝redis
啟動redis
設置redis開機啟動
二、redis string類型 1、string 是 redis 最基本的類型,你可以理解成與 Memcached 一模一樣的類型,一個 key 對應一個 value。 string 類型是二進制安全的。意思是 redis 的 string 可以包含任何數據。比如jpg圖片或者序列化的對象。 string 類型是 Redis 最基本的數據類型,string 類型的值最大能存儲 512MB。
2、在.netcore 中的調用。 var flag = redisManager.StringSet("dylan", "公眾號為:sharecore");v
ar value = redisManager.StringGet("dylan");Console.WriteLine($"獲取緩存值為:{value}");
三、redis list 類型 1、Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊)。
個人認為list是非常好用的一個類型,我們可以把Redis的list當成消息隊列使用,比如向注冊用戶發送歡迎郵件的工作,可以在注冊的流程中把要發送郵件的郵箱放到list中,另一個程序從list中pop獲取郵件來發送。生產者、消費者模式。把生產過程和消費過程隔離。
List類型的所有操作方法。 #region List
#region 同步方法
/// <summary>
/// 移除指定ListId的內部List的值
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public void ListRemove<T>(string key, T value)
{
key = AddSysCustomKey(key);
Do(db => db.ListRemove(key, ConvertJson(value)));
}
/// <summary>
/// 獲取指定key的List
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public List<T> ListRange<T>(string key)
{
key = AddSysCustomKey(key);
return Do(redis =>
{
var values = redis.ListRange(key);
return ConvetList<T>(values);
});
}
/// <summary>
/// 入隊
/// </summary>
/// <param name="key"></param>
/// <param name="value"></param>
public void ListRightPush<T>(string key, T value)
{
key = AddSysCustomKey(key);
Do(db => db.ListRightPush(key, ConvertJson(value)));
}
/// <summary>
/// 出隊
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public T ListRightPop<T>(string key)
{
key = AddSysCustomKey(key);
return Do(db =>
{
var value = db.ListRightPop(key);
return ConvertObj<T>(value);
});
}
/// <summary>
/// 入棧
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <param name="value"></param>
public void ListLeftPush<T>(string key, T value)
{
key = AddSysCustomKey(key);
Do(db => db.ListLeftPush(key, ConvertJson(value)));
}
/// <summary>
/// 出棧
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public T ListLeftPop<T>(string key)
{
key = AddSysCustomKey(key);
return Do(db =>
{
var value = db.ListLeftPop(key);
return ConvertObj<T>(value);
});
}
/// <summary>
/// 獲取集合中的數量
/// </summary>
/// <param name="key"></param>
/// <returns></returns>
public long ListLength(string key)
{
key = AddSysCustomKey(key);
return Do(redis => redis.ListLength(key));
}
#endregion 同步方法
#region 異步方法
直接復制同步的方法,在方法外后面加上Async即可
#endregion 異步方法
#endregion List
2、在.netcore 中的調用。 入隊: redisManager.ListRightPush("dylan", "sharecore我是入隊的");//入隊
出隊: redisManager.ListLeftPush("dylan", "sharecore我是入棧的");//入棧
四、redis hash類型 1、Redis hash 是一個鍵值(key=>value)對集合。 Redis hash 是一個 string 類型的 field 和 value 的映射表,hash 特別適合用於存儲對象。
以下是對Hash類型的所有操作方法。 #region Hash
#region 同步方法
/// <summary>
/// 判斷某個數據是否已經被緩存
/// </summary>
/// <param name="key"></param>
/// <param name="dataKey"></param>
/// <returns></returns>
public bool HashExists(string key, string dataKey)
{
key = AddSysCustomKey(key);
return Do(db => db.HashExists(key, dataKey));
}
/// <summary>
/// 存儲數據到hash表
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <param name="dataKey"></param>
/// <param name="t"></param>
/// <returns></returns>
public bool HashSet<T>(string key, string dataKey, T t)
{
key = AddSysCustomKey(key);
return Do(db =>
{
string json = ConvertJson(t);
return db.HashSet(key, dataKey, json);
});
}
/// <summary>
/// 移除hash中的某值
/// </summary>
/// <param name="key"></param>
/// <param name="dataKey"></param>
/// <returns></returns>
public bool HashDelete(string key, string dataKey)
{
key = AddSysCustomKey(key);
return Do(db => db.HashDelete(key, dataKey));
}
/// <summary>
/// 移除hash中的多個值
/// </summary>
/// <param name="key"></param>
/// <param name="dataKeys"></param>
/// <returns></returns>
public long HashDelete(string key, List<RedisValue> dataKeys)
{
key = AddSysCustomKey(key);
//List<RedisValue> dataKeys1 = new List<RedisValue>() {"1","2"};
return Do(db => db.HashDelete(key, dataKeys.ToArray()));
}
/// <summary>
/// 從hash表獲取數據
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <param name="dataKey"></param>
/// <returns></returns>
public T HashGet<T>(string key, string dataKey)
{
key = AddSysCustomKey(key);
return Do(db =>
{
string value = db.HashGet(key, dataKey);
return ConvertObj<T>(value);
});
}
/// <summary>
/// 為數字增長val
/// </summary>
/// <param name="key"></param>
/// <param name="dataKey"></param>
/// <param name="val">可以為負</param>
/// <returns>增長后的值</returns>
public double HashIncrement(string key, string dataKey, double val = 1)
{
key = AddSysCustomKey(key);
return Do(db => db.HashIncrement(key, dataKey, val));
}
/// <summary>
/// 為數字減少val
/// </summary>
/// <param name="key"></param>
/// <param name="dataKey"></param>
/// <param name="val">可以為負</param>
/// <returns>減少后的值</returns>
public double HashDecrement(string key, string dataKey, double val = 1)
{
key = AddSysCustomKey(key);
return Do(db => db.HashDecrement(key, dataKey, val));
}
/// <summary>
/// 獲取hashkey所有Redis key
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public List<T> HashKeys<T>(string key)
{
key = AddSysCustomKey(key);
return Do(db =>
{
RedisValue[] values = db.HashKeys(key);
return ConvetList<T>(values);
});
}
/// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public List<T> HashValues<T>(string key)
{
var result = new List<T>();
key = AddSysCustomKey(key);
return Do(db =>
{
HashEntry[] arr = db.HashGetAll(key);
foreach (var item in arr)
{
if (!item.Value.IsNullOrEmpty)
{
result.Add(JsonConvert.DeserializeObject<T>(item.Value));
}
}
return result;
});
}
#endregion 同步方法
#region 異步方法
直接復制同步的方法,在方法外后面加上Async即可
#endregion 異步方法
#endregion Hash
2、在.netcore 中的調用。 var data = new
{
name = "dylan",
code = "sharecore",
};
bool flag = redisManager.HashExists("dylan", "key1");
if (!flag)
{
redisManager.HashSet<object>("dylan", "key1", data);
redisManager.HashSet<object>("dylan", "key2", data);
}
var value = redisManager.HashValues<QueueValue>("dylan");
五、redis sorted類型 1、Redis zset 和 set 一樣也是string類型元素的集合,且不允許重復的成員。 不同的是每個元素都會關聯一個double類型的分數。redis正是通過分數來為集合中的成員進行從小到大的排序。 zset的成員是唯一的,但分數(score)卻可以重復。
以下是對SortedSet類型的所有操作方法。
2、在.netcore中的調用 var data = new
{
name = "dylan",
code = "sharecore",
};
redisManager.SortedSetAdd("dylan", data, 1.0);//添加
redisManager.SortedSetRemove("dylan",data);//刪除
redisManager.SortedSetRangeByRank<QueueValue>("dylan");//獲取全部
redisManager.SortedSetLength("dylan");//獲取數量
六、redis Subscribe 與 Publish 1、Redis 發布訂閱(pub/sub)是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。
以下是對Subscribe 與 Publish類型的所有操作方法。 #region 發布訂閱
/// <summary>
/// Redis發布訂閱 訂閱
/// </summary>
/// <param name="subChannel"></param>
/// <param name="handler"></param>
public void Subscribe(string subChannel, Action<RedisChannel, RedisValue> handler = null)
{
ISubscriber sub = _conn.GetSubscriber();
sub.Subscribe(subChannel, (channel, message) =>
{
if (handler == null)
{
Console.WriteLine(subChannel + " 訂閱收到消息:" + message);
}
else
{
handler(channel, message);
}
});
}
/// <summary>
/// Redis發布訂閱 發布
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="channel"></param>
/// <param name="msg"></param>
/// <returns></returns>
public long Publish<T>(string channel, T msg)
{
ISubscriber sub = _conn.GetSubscriber();
return sub.Publish(channel, ConvertJson(msg));
}
/// <summary>
/// Redis發布訂閱 取消訂閱
/// </summary>
/// <param name="channel"></param>
public void Unsubscribe(string channel)
{
ISubscriber sub = _conn.GetSubscriber();
sub.Unsubscribe(channel);
}
/// <summary>
/// Redis發布訂閱 取消全部訂閱
/// </summary>
public void UnsubscribeAll()
{
ISubscriber sub = _conn.GetSubscriber();
sub.UnsubscribeAll();
}
#endregion 發布訂閱
2、在.netcore中的調用 訂閱: redisManager.Subscribe("dylan", (channel, value) =>
{
Console.WriteLine(channel.ToString() + ":" + value.ToString());
});
發布: var data = new
{
name= "dylan",
code = "sharecore"
};
redisManager.Publish("dylan", data);
注:如果在是控制台要一直在運行中。 六、redis 數據遷移 1.默認redis數據存放在/var/lib/redis
1.保存redis最新數據
3.將dump.rdb傳入到新服務器目錄/var/lib/redis,重命名為dump.rdb.back 接着進入目錄,運行ll命令查看該目錄下有一個dump.rdb文件,該文件就是redis數據備份文件:
將dump.rdb文件保存,傳到新服務器/var/lib/redis目錄,重命名為dump.rdb.back。(可以使用FTP)
新服務器 連新服務器,進入到redis數據備份存放的目錄:
可以看到此時目錄下有一個dump.rdb.back文件,先進入redis命令行模式,關閉redis:
接着把dump.rdb.back 復制為dump.rdb: [root@localhost redis]# cp dump.rdb.back dump.rdb 3、重啟新服務器redis服務,完成 [root@localhost redis]# systemctl restart redis
總結 Memcached只能當緩存服務器用,也是最合適的;Redis不僅可以做緩存服務器(性能沒有Memcached好),還可以存儲業務復雜數據。 |



