|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599 |
- using System;
- using System.Collections.Generic;
- using System.IO;
- using System.Linq;
- using System.Runtime.Serialization.Formatters.Binary;
- using System.Threading.Tasks;
- using Microsoft.Extensions.Configuration;
- using StackExchange.Redis;
-
- namespace Permission.Redis
- {
- public class RedisService : IRedisService
- {
- private readonly IConfiguration _config;
- private IDatabase _db;
-
- public RedisService(IConfiguration config, string databaseName, int db = 0)
- {
- _config = config;
- _db = RedisClientSingleton.GetInstance(_config).GetDatabase(databaseName, db);
- }
-
- #region String 操作
-
- public bool StringSet(string redisKey, string redisValue, TimeSpan? expiry = null)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.StringSet(redisKey, redisValue, expiry);
- }
-
- public bool StringSet(IEnumerable<KeyValuePair<string, string>> keyValuePairs)
- {
- var pairs = keyValuePairs.Select(x => new KeyValuePair<RedisKey, RedisValue>(AddKeyPrefix(x.Key), x.Value));
- return _db.StringSet(pairs.ToArray());
- }
-
- public string StringGet(string redisKey, TimeSpan? expiry = null)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.StringGet(redisKey);
- }
-
- public bool StringSet<T>(string redisKey, T redisValue, TimeSpan? expiry = null)
- {
- redisKey = AddKeyPrefix(redisKey);
- var json = Serialize(redisValue);
- return _db.StringSet(redisKey, json, expiry);
- }
-
- public T StringGet<T>(string redisKey, TimeSpan? expiry = null)
- {
- redisKey = AddKeyPrefix(redisKey);
- return Deserialize<T>(_db.StringGet(redisKey));
- }
-
- #region String 异步操作
-
- public async Task<bool> StringSetAsync(string redisKey, string redisValue, TimeSpan? expiry = null)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.StringSetAsync(redisKey, redisValue, expiry);
- }
-
- public async Task<bool> StringSetAsync(IEnumerable<KeyValuePair<string, string>> keyValuePairs)
- {
- var pairs = keyValuePairs.Select(x => new KeyValuePair<RedisKey, RedisValue>(AddKeyPrefix(x.Key), x.Value));
- return await _db.StringSetAsync(pairs.ToArray());
- }
-
- public async Task<string> StringGetAsync(string redisKey, string redisValue, TimeSpan? expiry = null)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.StringGetAsync(redisKey);
- }
-
- public async Task<bool> StringSetAsync<T>(string redisKey, T redisValue, TimeSpan? expiry = null)
- {
- redisKey = AddKeyPrefix(redisKey);
- var json = Serialize(redisValue);
- return await _db.StringSetAsync(redisKey, json, expiry);
- }
-
- public async Task<T> StringGetAsync<T>(string redisKey, TimeSpan? expiry = null)
- {
- redisKey = AddKeyPrefix(redisKey);
- return Deserialize<T>(await _db.StringGetAsync(redisKey));
- }
-
- #endregion
-
- #endregion
-
- #region Hash 操作
-
- public bool HashExists(string redisKey, string hashField)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.HashExists(redisKey, hashField);
- }
-
- public bool HashDelete(string redisKey, string hashField)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.HashDelete(redisKey, hashField);
- }
-
- public long HashDelete(string redisKey, IEnumerable<string> hashFields)
- {
- redisKey = AddKeyPrefix(redisKey);
- var fields = hashFields.Select(x => (RedisValue)x);
- return _db.HashDelete(redisKey, fields.ToArray());
- }
-
- public bool HashSet(string redisKey, string hashField, string value)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.HashSet(redisKey, hashField, value);
- }
-
- public void HashSet(string redisKey, IEnumerable<KeyValuePair<string, string>> hashFields)
- {
- redisKey = AddKeyPrefix(redisKey);
- var entries = hashFields.Select(x => new HashEntry(x.Key, x.Value));
- _db.HashSet(redisKey, entries.ToArray());
- }
-
- public string HashGet(string redisKey, string hashField)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.HashGet(redisKey, hashField);
- }
-
- public IEnumerable<string> HashGet(string redisKey, IEnumerable<string> hashFields)
- {
- redisKey = AddKeyPrefix(redisKey);
- var fields = hashFields.Select(x => (RedisValue)x);
- return ConvertStrings(_db.HashGet(redisKey, fields.ToArray()));
- }
-
- public IEnumerable<string> HashKeys(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return ConvertStrings(_db.HashKeys(redisKey));
- }
-
- public IEnumerable<string> HashValues(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return ConvertStrings(_db.HashValues(redisKey));
- }
-
- public bool HashSet<T>(string redisKey, string hashField, T redisValue)
- {
- redisKey = AddKeyPrefix(redisKey);
- var json = Serialize(redisValue);
- return _db.HashSet(redisKey, hashField, json);
- }
-
- public T HashGet<T>(string redisKey, string hashField)
- {
- redisKey = AddKeyPrefix(redisKey);
- return Deserialize<T>(_db.HashGet(redisKey, hashField));
- }
-
- #region Hash 异步操作
-
- public async Task<bool> HashExistsAsync(string redisKey, string hashField)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.HashExistsAsync(redisKey, hashField);
- }
-
- public async Task<bool> HashDeleteAsync(string redisKey, string hashField)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.HashDeleteAsync(redisKey, hashField);
- }
-
- public async Task<long> HashDeleteAsync(string redisKey, IEnumerable<string> hashFields)
- {
- redisKey = AddKeyPrefix(redisKey);
- var fields = hashFields.Select(x => (RedisValue)x);
- return await _db.HashDeleteAsync(redisKey, fields.ToArray());
- }
-
- public async Task<bool> HashSetAsync(string redisKey, string hashField, string value)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.HashSetAsync(redisKey, hashField, value);
- }
-
- public async Task HashSetAsync(string redisKey, IEnumerable<KeyValuePair<string, string>> hashFields)
- {
- redisKey = AddKeyPrefix(redisKey);
- var entries = hashFields.Select(x => new HashEntry(AddKeyPrefix(x.Key), x.Value));
- await _db.HashSetAsync(redisKey, entries.ToArray());
- }
-
- public async Task<string> HashGetAsync(string redisKey, string hashField)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.HashGetAsync(redisKey, hashField);
- }
-
- public async Task<IEnumerable<string>> HashGetAsync(string redisKey, IEnumerable<string> hashFields, string value)
- {
- redisKey = AddKeyPrefix(redisKey);
- var fields = hashFields.Select(x => (RedisValue)x);
- return ConvertStrings(await _db.HashGetAsync(redisKey, fields.ToArray()));
- }
-
- public async Task<IEnumerable<string>> HashKeysAsync(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return ConvertStrings(await _db.HashKeysAsync(redisKey));
- }
-
- public async Task<IEnumerable<string>> HashValuesAsync(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return ConvertStrings(await _db.HashValuesAsync(redisKey));
- }
-
- public async Task<bool> HashSetAsync<T>(string redisKey, string hashField, T value)
- {
- redisKey = AddKeyPrefix(redisKey);
- var json = Serialize(value);
- return await _db.HashSetAsync(redisKey, hashField, json);
- }
-
- public async Task<T> HashGetAsync<T>(string redisKey, string hashField)
- {
- redisKey = AddKeyPrefix(redisKey);
- return Deserialize<T>(await _db.HashGetAsync(redisKey, hashField));
- }
-
- #endregion
-
- #endregion
-
- #region List 操作
-
-
- public string ListLeftPop(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.ListLeftPop(redisKey);
- }
-
- public string ListRightPop(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.ListRightPop(redisKey);
- }
-
- public long ListRemove(string redisKey, string redisValue)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.ListRemove(redisKey, redisValue);
- }
-
- public long ListRightPush(string redisKey, string redisValue)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.ListRightPush(redisKey, redisValue);
- }
-
- public long ListLeftPush(string redisKey, string redisValue)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.ListLeftPush(redisKey, redisValue);
- }
-
- public long ListLength(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.ListLength(redisKey);
- }
-
- public IEnumerable<string> ListRange(string redisKey, long start = 0, long stop = -1)
- {
- redisKey = AddKeyPrefix(redisKey);
- return ConvertStrings(_db.ListRange(redisKey, start, stop));
- }
-
- public T ListLeftPop<T>(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return Deserialize<T>(_db.ListLeftPop(redisKey));
- }
-
- public T ListRightPop<T>(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return Deserialize<T>(_db.ListRightPop(redisKey));
- }
-
- public long ListRightPush<T>(string redisKey, T redisValue)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.ListRightPush(redisKey, Serialize(redisValue));
- }
-
- public long ListLeftPush<T>(string redisKey, T redisValue)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.ListLeftPush(redisKey, Serialize(redisValue));
- }
-
- #region List 异步操作
-
- public async Task<string> ListLeftPopAsync(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.ListLeftPopAsync(redisKey);
- }
-
- public async Task<string> ListRightPopAsync(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.ListRightPopAsync(redisKey);
- }
-
- public async Task<long> ListRemoveAsync(string redisKey, string redisValue)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.ListRemoveAsync(redisKey, redisValue);
- }
-
- public async Task<long> ListRightPushAsync(string redisKey, string redisValue)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.ListRightPushAsync(redisKey, redisValue);
- }
-
- public async Task<long> ListLeftPushAsync(string redisKey, string redisValue)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.ListLeftPushAsync(redisKey, redisValue);
- }
-
- public async Task<long> ListLengthAsync(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.ListLengthAsync(redisKey);
- }
-
- public async Task<IEnumerable<string>> ListRangeAsync(string redisKey, long start = 0, long stop = -1)
- {
- redisKey = AddKeyPrefix(redisKey);
- var query = await _db.ListRangeAsync(redisKey, start, stop);
- return query.Select(x => x.ToString());
- }
-
- public async Task<T> ListLeftPopAsync<T>(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return Deserialize<T>(await _db.ListLeftPopAsync(redisKey));
- }
-
- public async Task<T> ListRightPopAsync<T>(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return Deserialize<T>(await _db.ListRightPopAsync(redisKey));
- }
-
- public async Task<long> ListRightPushAsync<T>(string redisKey, T redisValue)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.ListRightPushAsync(redisKey, Serialize(redisValue));
- }
-
- public async Task<long> ListLeftPushAsync<T>(string redisKey, T redisValue)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.ListLeftPushAsync(redisKey, Serialize(redisValue));
- }
-
- #endregion
-
- #endregion
-
- #region SortedSet 操作
-
- public bool SortedSetAdd(string redisKey, string member, double score)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.SortedSetAdd(redisKey, member, score);
- }
-
- public IEnumerable<string> SortedSetRangeByRank(string redisKey, long start = 0L, long stop = -1L,
- OrderType order = OrderType.Ascending)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.SortedSetRangeByRank(redisKey, start, stop, (Order)order).Select(x => x.ToString());
- }
-
- public long SortedSetLength(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.SortedSetLength(redisKey);
- }
-
- public bool SortedSetLength(string redisKey, string memebr)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.SortedSetRemove(redisKey, memebr);
- }
-
- public bool SortedSetAdd<T>(string redisKey, T member, double score)
- {
- redisKey = AddKeyPrefix(redisKey);
- var json = Serialize(member);
- return _db.SortedSetAdd(redisKey, json, score);
- }
-
- public double SortedSetIncrement(string redisKey, string member, double value = 1)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.SortedSetIncrement(redisKey, member, value);
- }
-
- #region SortedSet 异步操作
-
- public async Task<bool> SortedSetAddAsync(string redisKey, string member, double score)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.SortedSetAddAsync(redisKey, member, score);
- }
-
- public async Task<IEnumerable<string>> SortedSetRangeByRankAsync(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return ConvertStrings(await _db.SortedSetRangeByRankAsync(redisKey));
- }
-
- public async Task<long> SortedSetLengthAsync(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.SortedSetLengthAsync(redisKey);
- }
-
- public async Task<bool> SortedSetRemoveAsync(string redisKey, string memebr)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.SortedSetRemoveAsync(redisKey, memebr);
- }
-
- public async Task<bool> SortedSetAddAsync<T>(string redisKey, T member, double score)
- {
- redisKey = AddKeyPrefix(redisKey);
- var json = Serialize(member);
- return await _db.SortedSetAddAsync(redisKey, json, score);
- }
-
- public async Task<double> SortedSetIncrementAsync(string redisKey, string member, double value = 1)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.SortedSetIncrementAsync(redisKey, member, value);
- }
-
- #endregion
-
- #endregion
-
- #region key 操作
-
- public bool KeyDelete(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.KeyDelete(redisKey);
- }
-
- public long KeyDelete(IEnumerable<string> redisKeys)
- {
- var keys = redisKeys.Select(x => (RedisKey)AddKeyPrefix(x));
- return _db.KeyDelete(keys.ToArray());
- }
-
- public bool KeyExists(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.KeyExists(redisKey);
- }
-
- public bool KeyRename(string redisKey, string redisNewKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.KeyRename(redisKey, redisNewKey);
- }
-
- public bool KeyExpire(string redisKey, TimeSpan? expiry)
- {
- redisKey = AddKeyPrefix(redisKey);
- return _db.KeyExpire(redisKey, expiry);
- }
-
- #region key 异步操作
-
- public async Task<bool> KeyDeleteAsync(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.KeyDeleteAsync(redisKey);
- }
-
- public async Task<long> KeyDeleteAsync(IEnumerable<string> redisKeys)
- {
- var keys = redisKeys.Select(x => (RedisKey)AddKeyPrefix(x));
- return await _db.KeyDeleteAsync(keys.ToArray());
- }
-
- public async Task<bool> KeyExistsAsync(string redisKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.KeyExistsAsync(redisKey);
- }
-
- public async Task<bool> KeyRenameAsync(string redisKey, string redisNewKey)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.KeyRenameAsync(redisKey, redisNewKey);
- }
-
- public async Task<bool> KeyExpireAsync(string redisKey, TimeSpan? expiry)
- {
- redisKey = AddKeyPrefix(redisKey);
- return await _db.KeyExpireAsync(redisKey, expiry);
- }
-
- #endregion
-
- #endregion
-
- #region 序列化对象
-
- /// <summary>
- /// 添加 Key 的前缀
- /// </summary>
- /// <param name="key"></param>
- /// <returns></returns>
- private string AddKeyPrefix(string key)
- {
- var syskey = _config.GetSection("RedisConfig:RedisKey").Value;
- return syskey + key;
- }
-
- /// <summary>
- /// 转换为字符串
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="list"></param>
- /// <returns></returns>
- private static IEnumerable<string> ConvertStrings<T>(IEnumerable<T> list) where T : struct
- {
- if (list == null) throw new ArgumentNullException(nameof(list));
- return list.Select(x => x.ToString());
- }
-
- /// <summary>
- /// 序列化对象
- /// </summary>
- /// <param name="o"></param>
- /// <returns></returns>
- static byte[] Serialize(object obj)
- {
- if (obj == null)
- return null;
-
- var binaryFormatter = new BinaryFormatter();
- using (var memoryStream = new MemoryStream())
- {
- binaryFormatter.Serialize(memoryStream, obj);
- var data = memoryStream.ToArray();
- return data;
- }
- }
-
- /// <summary>
- /// 反序列化对象
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="data"></param>
- /// <returns></returns>
- static T Deserialize<T>(byte[] data)
- {
- if (data == null)
- return default(T);
-
- var binaryFormatter = new BinaryFormatter();
- using (var memoryStream = new MemoryStream(data))
- {
- var result = (T)binaryFormatter.Deserialize(memoryStream);
- return result;
- }
- }
-
- #endregion
- }
- }
|