Redis在三层服务框架中应用(一)——Redis与Model的结合

个人声明:本系列所有文章旨在抛砖引玉,为有兴趣深入使用Redis的同学提供一些参考。本系列所有文章纯属原创,均是笔者在实际工作中的总结。本文所有引用的MDB系列组件均由米多网络架构部提供,在此向架构部表示感谢。笔者经验能力有限,如有不适之处还请多多指教。


一、为什么要使用Redis?

  • Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • Redis性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。

二、如何使用Redis?

  •  封装Redis方法
        1. 引用MDB.UCC组件

             Redis在三层服务框架中应用(一)——Redis与Model的结合_第1张图片 

        2. 创建一个静态类,命名为UCC,类中将封装增、删、查三个静态方方法,形成闭环逻辑,方便业务层直接引用:

            1).设置缓存的方法

        /// 
        /// 设置缓存
        /// 
        /// 缓存key
        /// 缓存值
        /// 有效期
        public static bool Setvalue(string key, string value, int time = 0)
        {
            var kvprovider = CacheFoundation.GetKVCacheProvider();
            bool flag = kvprovider.SetValue(key, value, CachevisitType.PrivateType, time);
            return flag;
        }

          2).获取缓存的方法     

        /// 
        /// 获取缓存值
        /// 
        public static T Getvalue(string key)
        {
            var kvprovider = CacheFoundation.GetKVCacheProvider();
            var value = kvprovider.GetValue(key, CachevisitType.PrivateType);
            return value;
        }

            3).清除缓存的方法

        /// 
        /// 删除缓存 针对所有的key
        /// 
        /// 
        public static bool Delete(string key)
        {
            return CacheFoundation.DeleteKey(key, CachevisitType.PrivateType);
        }

  • 在业务层中使用UCC——model与UCC的嵌套使用

       在一般项目中,如果不使用缓存,即使ORM框架的性能再好,数据库也会成为系统的性能瓶颈。在本项目中使用了MDB组建中的Goose框架,框架中封装了增(Add)、删(Delete)、改(Update)、查(Select)方法。

        1. 思路解析一——获取model

          在GetModel方法中,首先从Redis缓存中获取model信息:1)若model为空,说明缓存中无数据,从数据库中查询数据,返回model,并将结果存储在Redis缓存中;2)反之,直接返回缓存中的model。代码如下:

        /// 
        /// 从缓存中获取model信息
        /// 
        /// 
        /// 
        public Emoji GetModel(int id)
        {
            string key = string.Format(Key.emoji_key,id);
            Emoji model = null;
            model = UCC.Getvalue(key);
            if (model == null)
            {
                Expression> where = p => p.ID==id;
                model = base.GetModel(where);
                UCC.Setvalue(key,model);
            }
            return model;
        }

        2. 思路解析二——更新model

            在Update方法中,更新model的同时清除缓存,与GetModel方法形成闭合。代码如下:

         /// 
        /// 更新model信息
        /// 
        /// 
        /// 
        public bool Update(Emoji model)
        {
            bool isok = false;
            Expression> where = m => m.ID == model.ID;
            isok = base.Update(where, model) > 0 ? true : false;
            if (isok)
            {
                string key = string.Format(Key.emoji_key, model.ID);
                isok = UCC.Remove(key);
            }
            return isok;
        }


三、总结

       在业务层中, 通过GetModel和Update方法,实现Model与Redis缓存的高度融合,即使在高并发的情况下,只需要查询一次数据库,将数据库的压力分担给了Redis,利用Redis的高性能来处理高并发问题。笔者希望通过这个例子能够起到抛砖引玉的效果。在本系列的下一篇中,笔者会讲解一些更复杂的应用场景。





你可能感兴趣的:(随笔)