Redis/NewLife.Redis/FullRedis.cs

156 lines
5.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using NewLife.Data;
using NewLife.Log;
using NewLife.Model;
namespace NewLife.Caching
{
/// <summary>Redis缓存</summary>
public class FullRedis : Redis
{
#region
static FullRedis()
{
ObjectContainer.Current.AutoRegister<Redis, FullRedis>();
}
/// <summary>注册</summary>
public static void Register() { }
/// <summary>根据连接字符串创建</summary>
/// <param name="config"></param>
/// <returns></returns>
public static FullRedis Create(String config)
{
var rds = new FullRedis();
rds.Init(config);
return rds;
}
#endregion
#region
///// <summary>性能计数器</summary>
//public PerfCounter Counter { get; set; } = new PerfCounter();
#endregion
#region
#endregion
#region
///// <summary>重载执行,统计性能</summary>
///// <typeparam name="T"></typeparam>
///// <param name="func"></param>
///// <param name="write">是否写入操作</param>
///// <returns></returns>
//public override T Execute<T>(Func<RedisClient, T> func, Boolean write = false)
//{
// var sw = Counter.StartCount();
// try
// {
// return base.Execute(func, write);
// }
// finally
// {
// Counter.StopCount(sw);
// }
//}
#endregion
#region
/// <summary>获取列表</summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public override IList<T> GetList<T>(String key) => new RedisList<T>(this, key);
/// <summary>获取哈希</summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public override IDictionary<String, T> GetDictionary<T>(String key) => new RedisHash<String, T>(this, key);
/// <summary>获取队列</summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public override IProducerConsumer<T> GetQueue<T>(String key) => new RedisQueue<T>(this, key);
/// <summary>获取Set</summary>
/// <typeparam name="T"></typeparam>
/// <param name="key"></param>
/// <returns></returns>
public override ICollection<T> GetSet<T>(String key) => new RedisSet<T>(this, key);
#endregion
#region
/// <summary>附加字符串</summary>
/// <param name="key"></param>
/// <param name="value"></param>
/// <returns>返回字符串长度</returns>
public virtual Int32 Append(String key, String value) => Execute(r => r.Execute<Int32>("APPEND", key, value), true);
/// <summary>获取字符串区间</summary>
/// <param name="key"></param>
/// <param name="start"></param>
/// <param name="end"></param>
/// <returns></returns>
public virtual String GetRange(String key, Int32 start, Int32 end) => Execute(r => r.Execute<String>("GETRANGE", key, start, end));
/// <summary>设置字符串区间</summary>
/// <param name="key"></param>
/// <param name="offset"></param>
/// <param name="value"></param>
/// <returns></returns>
public virtual String SetRange(String key, Int32 offset, String value) => Execute(r => r.Execute<String>("SETRANGE", key, offset, value), true);
/// <summary>字符串长度</summary>
/// <param name="key"></param>
/// <returns></returns>
public virtual Int32 StrLen(String key) => Execute(r => r.Execute<Int32>("STRLEN", key));
#endregion
#region
/// <summary>重命名指定键</summary>
/// <param name="key"></param>
/// <param name="newKey"></param>
/// <param name="overwrite"></param>
/// <returns></returns>
public virtual Boolean Rename(String key, String newKey, Boolean overwrite = true)
{
var cmd = overwrite ? "RENAME" : "RENAMENX";
return Execute(r => r.Execute<Boolean>(cmd, key, newKey), true);
}
/// <summary>模糊搜索,支持?和*</summary>
/// <param name="pattern"></param>
/// <returns></returns>
public virtual String[] Search(String pattern) => Execute(r => r.Execute<String[]>("KEYS", pattern));
/// <summary>模糊搜索,支持?和*</summary>
/// <param name="pattern"></param>
/// <param name="count"></param>
/// <param name="position"></param>
/// <returns></returns>
public virtual String[] Search(String pattern, Int32 count, ref Int32 position)
{
var p = position;
var rs = Execute(r => r.Execute<Object[]>("SCAN", p, "MATCH", pattern + "", "COUNT", count));
if (rs != null)
{
position = (rs[0] as Packet).ToStr().ToInt();
var ps = rs[1] as Object[];
var ss = ps.Select(e => (e as Packet).ToStr()).ToArray();
return ss;
}
return null;
}
#endregion
}
}