zoukankan      html  css  js  c++  java
  • redis

    工作中写的一个redis缓存服务类

    /// <summary>
    /// 缓存服务
    /// </summary>
    public class CacheService
    {
    #region redis

    /// <summary>
    /// redis连接池
    /// </summary>
    private readonly static PooledRedisClientManager pooledClientManager;
    /// <summary>
    /// redis读服务器集合
    /// </summary>
    private static IEnumerable<string> readHosts;
    /// <summary>
    /// redis写服务器集合
    /// </summary>
    private static IEnumerable<string> writeHosts;

    /// <summary>
    /// 初始化redis服务
    /// </summary>
    static CacheService()
    {
    readHosts = InitRedisServerIP("read");
    writeHosts = InitRedisServerIP("write");
    pooledClientManager = new PooledRedisClientManager(writeHosts, readHosts);
    }

    /// <summary>
    /// key是否存在
    /// </summary>
    /// <param name="key">key</param>
    /// <returns>bool结果</returns>
    public bool IsKeyExist(string key)
    {
    var result = false;
    try
    {
    using (var redis = pooledClientManager.GetReadOnlyClient())
    {
    if (redis != null)
    {
    result = redis.ContainsKey(key);
    }
    }
    }
    catch (Exception ex)
    {
    //日志
    }
    return result;
    }

    /// <summary>
    /// 根据传入的key,获取记录的值
    /// </summary>
    /// <typeparam name="T">类型</typeparam>
    /// <param name="key">key</param>
    /// <param name="isWrite">是否写节点</param>
    /// <returns>缓存对象</returns>
    public T Get<T>(string key, bool isWrite = false)
    {
    using (var redis = (isWrite == false ? pooledClientManager.GetReadOnlyClient() : pooledClientManager.GetClient()))
    {
    if (redis != null)
    {
    return redis.Get<T>(key);
    }
    }
    return default(T);
    }

    /// <summary>
    /// 根据传入的key修改一条记录的值,当key不存在则添加
    /// </summary>
    /// <typeparam name="T">类型</typeparam>
    /// <param name="key">key</param>
    /// <param name="value">实体值</param>
    /// <returns>bool结果</returns>
    public bool Set<T>(string key, T value)
    {
    using (var redis = pooledClientManager.GetClient())
    {
    if (redis != null)
    {
    return redis.Set(key, value);
    }
    }
    return false;
    }

    /// <summary>
    /// 根据传入的key 删除缓存
    /// </summary>
    /// <param name="key">key</param>
    /// <returns>bool结果</returns>
    public void Remove(string key)
    {
    using (var redis = pooledClientManager.GetClient())
    {
    if (redis != null)
    {
    redis.Remove(key);
    }
    }
    }
    #endregion

    #region redis xml
    /// <summary>
    /// 读取redis服务器ip配置文件
    /// </summary>
    /// <param name="parentElement">父节点</param>
    /// <returns>ip集合</returns>
    private static IEnumerable<string> InitRedisServerIP(string parentElement)
    {
    var list = new List<string>();
    try
    {

    //读配置文件
    var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"RedisCache.xml");
    var xml = XElement.Load(path);
    var elements = from ele in xml.Elements(parentElement)
    select ele;

    list.AddRange(elements.Select(element => element.Value));
    }
    catch (Exception ex)
    {
    LogService.Instance.Log(new LogRecordEntity
    {
    //日志
    }
    return list;
    }
    #endregion

    #region 序列化
    /// <summary>
    /// 将对象序列化成字符串
    /// </summary>
    /// <typeparam name="T">对象类型</typeparam>
    /// <param name="t">实体</param>
    /// <returns>字符串</returns>
    internal static string ToJson<T>(T t)
    {
    var timeConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" };
    return JsonConvert.SerializeObject(t, timeConverter);
    }

    /// <summary>
    /// 将字符串转换为对象
    /// </summary>
    /// <typeparam name="T">指定转换的对象</typeparam>
    /// <param name="str">待转换的object</param>
    /// <returns>对象类型</returns>
    internal static T ToModel<T>(string str) where T : class,new()
    {
    return str == null ? new T() : JsonConvert.DeserializeObject<T>(str);
    }
    #endregion

    #region queue
    /// <summary>
    /// 获取队列中记录的数量
    /// </summary>
    /// <param name="listKey">队列id</param>
    /// <returns>记录条数</returns>
    public int GetListCount(string listKey)
    {
    var count = 0;
    using (var redis = pooledClientManager.GetReadOnlyClient())
    {
    if (redis != null)
    {
    if (IsKeyExist(listKey))
    {
    count = (int)redis.GetListCount(listKey);
    }
    }
    }
    return count;
    }

    /// <summary>
    /// 入队列
    /// </summary>
    /// <typeparam name="T">类型</typeparam>
    /// <param name="listKey">队列id</param>
    /// <param name="value">对象</param>
    public void Push<T>(string listKey, List<T> value)
    {
    using (var redis = pooledClientManager.GetClient())
    {
    if (redis != null)
    {
    value.ForEach(x => redis.EnqueueItemOnList(listKey, ToJson(x)));
    }
    }
    }
    /// <summary>
    /// 出队列
    /// </summary>
    /// <typeparam name="T">类型</typeparam>
    /// <param name="listKey">队列id</param>
    /// <param name="count">出队列数量</param>
    /// <returns>对象实体</returns>
    public List<T> Pull<T>(string listKey, int count) where T : class,new()
    {
    var result = new List<T>();
    using (var redis = pooledClientManager.GetClient())
    {
    if (redis != null)
    {
    for (int i = 0; i < count; i++)
    {
    var entity = redis.DequeueItemFromList(listKey);
    if (entity == null)
    break;
    result.Add(ToModel<T>(entity));
    }
    }
    }
    return result;
    }
    #endregion
    }

    附上xml配置

    <?xml version="1.0" encoding="utf-8" ?>
    <!--redis 缓存服务器-->
    <redis>
    <!--读节点-->
    <read>
    <ip>192.168.0.1:6779</ip>
    <!--<ip>192.168.0.1:6779</ip>-->
    <!--<ip>192.168.0.1:6779</ip>-->
    </read>
    <!--写节点-->
    <write>
    <ip>192.168.0.1:6779</ip>
    <!--<ip>192.168.0.1:6779</ip>-->
    <!--<ip>192.168.0.1:6779</ip-->
    </write>
    </redis>

  • 相关阅读:
    /etc/fstab详解
    awk的简单用法2
    awk的简单用法3
    linux+nginx+mysql+php高性能服务器搭建
    awk的简单用法1
    ip_conntrack: table full, dropping packet.解决办法
    快速获得 Google Maps 地图页中心位置的经纬度
    Google 地图 教程收集
    第一章 Google Api Key的申请
    第二章 Google 常用功能
  • 原文地址:https://www.cnblogs.com/maomaokuaile/p/4309151.html
Copyright © 2011-2022 走看看