zoukankan      html  css  js  c++  java
  • Memcached+WebApi记录

    一、安装Memcached

    Memcached1.2.6

     http://files.cnblogs.com/files/jasonduan/11465401756756.zip

    Memcached.ClientLibrary

     http://files.cnblogs.com/files/jasonduan/10524626586159.zip

    网上好多文章

    http://jingyan.baidu.com/article/335530da5f765019cb41c3ec.html

    http://jingyan.baidu.com/album/c85b7a640fbfd5003bac9500.html

    memcached.exe -d install

    memcached.exe -d start

    Memcached还有其他的一些常用的命令如下:

          -p 监听的端口 --默认端口11211
          -l 连接的IP地址, 默认是本机
          -d start 启动memcached服务
          -d restart 重起memcached服务
          -d stop|shutdown 关闭正在运行的memcached服务
          -d install 安装memcached服务
          -d uninstall 卸载memcached服务
          -u 以的身份运行 (仅在以root运行的时候有效)
          -m 最大内存使用,单位MB。默认64MB
          -M 内存耗尽时返回错误,而不是删除项 默认64
          -c 最大同时连接数,默认是1024
          -f 块大小增长因子,默认是1.25
          -n 最小分配空间,key+value+flags默认是48
          -h 显示帮助

    在运行下输入“regedit”打开注册表,  找到路径 HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesmemcached,下面找 到一个ImagePath 的字符串项,正好是服务的执行路径的字符串,

    双击该串,在后面追加入“-m 1024 -c 2048 -p 11200”  重启服务即可

    查看缓存区块,分析结果可调配-f参数
    telnet 127.0.0.1 11200

    查看缓存的各种状态

    stats

    二、定义MemCachedHelper

     <add key="memcachedServer" value="127.0.0.1:11200" />

    using System.Linq;
    using System.Web;
    using System.Configuration;
    using Memcached.ClientLibrary;
    using System;
    using System.Collections;
    
    namespace API.Common
    {
        public static class MemCachedHelper
        {
            private static readonly MemcachedClient memcachedClient;
    
            static MemCachedHelper()
            {
                //读取web.config中的memcached服务器配置信息
                if (string.IsNullOrWhiteSpace(ConfigurationManager.AppSettings["memcachedServer"]))
                {
                    throw new Exception("请在web.config的appsetting中配置memcached服务器信息!");
                }
                string[] servers = ConfigurationManager.AppSettings["memcachedServer"].Split(new char[','], StringSplitOptions.RemoveEmptyEntries);
    
                //初始化池
                SockIOPool pool = SockIOPool.GetInstance();
                pool.SetServers(servers);
                pool.InitConnections = 3;
                pool.MinConnections = 3;
                pool.MaxConnections = 1000;
                pool.SocketConnectTimeout = 1000;
                pool.SocketTimeout = 3000;
                pool.MaintenanceSleep = 30;
                pool.Failover = true;
                pool.Nagle = false;
                pool.Initialize();
                memcachedClient = new MemcachedClient();
                memcachedClient.EnableCompression = false;
            }
    
            /// <summary>
            /// 根据key获取value
            /// </summary>
            /// <param name="key"></param>
            /// <returns></returns>
            public static object Get(string key)
            {
                return memcachedClient.Get(key);
            }
            public static T Get<T>(string key)
            {
                return (T)memcachedClient.Get(key);
            } 
           
            public static Hashtable Get(string[] key)
            {
                return memcachedClient.GetMultiple(key);
            }
    
            public static bool Set(string key, object objObject, DateTime exp)
            {
                return memcachedClient.Set(key, objObject, exp);
            }
            public static bool Set(string key, object value)
            {
                return memcachedClient.Set(key, value);
            }
            public static bool Set(string key, object value, int minute)
            {
                return memcachedClient.Set(key, value, DateTime.Now.AddMinutes(minute));
            }
    
            
            public static void Set<T>(string key, T values)
            {
                memcachedClient.EnableCompression = false;
                memcachedClient.Set(key, values);
            }
            public static void Set<T>(string key, T values, DateTime expiry)
            {
                try
                {
                    memcachedClient.EnableCompression = false;
                    memcachedClient.Set(key, values, expiry);
                }
                catch
                {  
                }
            }
    
            
            public static Hashtable Stats()
            {
                return memcachedClient.Stats();
            }
    
            public static void Remove(string key)
            {
                memcachedClient.Delete(key);
            }
    
            public static void RemoveAllCache()
            {
                memcachedClient.FlushAll();
            }
    
            public static bool ContainsKey(string key)
            {
                return memcachedClient.KeyExists(key);
            }
            public static bool IsKeyExists(string key)
            {
                try
                {
                    return memcachedClient.KeyExists(key);
                }
                catch
                {
                    return false;
                }
            }
            public static bool Replace<T>(string key, T values, DateTime expiry)
            {
                return memcachedClient.Replace(key, values, expiry);
            }
            public static bool Replace<T>(string key, T values)
            {
                return memcachedClient.Replace(key, values);
            }
        }
    }
    

     三使用

    using API.Model;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Web.Http;
    using C = API.Common;
    using B = API.BLL;
    using M = API.Model;
    namespace API.BPJ.Controllers.Product
    {
        /// <summary>
        /// 商品控制器
        /// </summary>
        public class ProductController : ApiController
        {
    
            /// <summary>
            /// 根据经销商编号得到分类列表
            /// </summary>
            /// <param name="UserId"></param>
            /// <param name="ZY"></param>
            /// <param name="Sign"></param>
            /// <param name="Ts"></param>
            /// <returns></returns>
            [HttpGet]
            public CommonResult GetProductCategoryList(string UserId, string ZY, string Sign, string Ts)
            {
                CommonResult apiResult = new CommonResult();
                //检查请求 签名和时间戳不符合即返回
                if (!C.ComHelper.CheckRequest(Sign, Ts, out apiResult.Result, out apiResult.Message))
                {
                    return apiResult;
                }
                string cachekey = "CategoryList" + UserId + ZY;
                if (!C.MemCachedHelper.IsKeyExists(cachekey))
                {
                    //如果没有缓存从数据库读取 默认设置缓存为1天时间
                    List<M.ProductCategory> list = new B.Product().GetProductCategoryList(UserId, ZY);
                    C.MemCachedHelper.Set<List<M.ProductCategory>>(cachekey, list, DateTime.Now.AddDays(1));
                    apiResult.Data = list;
                   
                }
                else
                {
                    apiResult.Data = C.MemCachedHelper.Get<List<M.ProductCategory>>(cachekey);
                }
    
                if (apiResult.Data != null)
                {
                    apiResult.Result = "1";
                    apiResult.Message = "加载成功!";
    
                }
                else
                {
                    apiResult.Result = "2";
                    apiResult.Message = "加载失败!";
                }
                return apiResult;
            }
    
            
            
        }
       
    }
    

     四注意问题

    1、model需要Serializable 否则不能set

    2、序列化后的json对象,每个属性都带有k__BackingField后缀,加入[DataContract]  [DataMember]就就可以了

    namespace API.Model
    {
        
        [Serializable]
        [DataContract]
        public class ProductCategory
        {
            [DataMember]
            public int CId { get; set; }
            [DataMember]
            public string CName { get; set; }
            [DataMember]
            public string CCode { get; set; }
            [DataMember]
            public string PCode { get; set; }
            [DataMember]
            public string Thumbnail { get; set; }
            [DataMember]
            public string Picture { get; set; }
            
        }
    }
    

     localhost:6103/api/Product/GetProductCategoryList?UserId=1&ZY=1&Sign=&Ts=

    {
        "Result": "1",
        "Message": "加载成功!",
        "Data": [
            {
                "CId": 268,
                "CName": "个护化妆",
                "CCode": "003",
                "PCode": "0",
                "Thumbnail": "http://images.bpj.com/ProductCategory/201603/gehuhuazhang.jpg",
                "Picture": "http://images.bpj.com/ProductCategory/201603/gehuhuazhang.jpg"
            },
            {
                "CId": 269,
                "CName": "个护健康",
                "CCode": "004",
                "PCode": "0",
                "Thumbnail": "http://images.bpj.com/ProductCategory/201603/gehujiankang.jpg",
                "Picture": "http://images.bpj.com/ProductCategory/201603/gehujiankang.jpg"
            },
            {
                "CId": 338,
                "CName": "家居用品",
                "CCode": "005",
                "PCode": "0",
                "Thumbnail": "http://images.bpj.com/ProductCategory/201603/jiajuyongpin.jpg",
                "Picture": "http://images.bpj.com/ProductCategory/201603/jiajuyongpin.jpg"
            },
            {
                "CId": 499,
                "CName": "母婴玩具",
                "CCode": "007",
                "PCode": "0",
                "Thumbnail": "http://images.bpj.com/ProductCategory/201603/muyingwanju.jpg",
                "Picture": "http://images.bpj.com/ProductCategory/201603/muyingwanju.jpg"
            }
        ]
    }
    
  • 相关阅读:
    深入理解系统调用
    基于mykernel 2.0编写一个操作系统内核
    如何评测一个软件工程师的计算机网络知识水平与网络编程技能水平?
    如何评测软件工程知识技能水平?
    深入理解TCP的三次握手及其源代码
    Socket与系统调用深度分析
    未来的图书会是什么样子?
    构建调试Linux内核网络代码的环境MenuOS系统
    Python笔记005-神奇的+=
    Python笔记004-元组的拆包和命名元组
  • 原文地址:https://www.cnblogs.com/jasonduan/p/5580007.html
Copyright © 2011-2022 走看看