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_MACHINE\SYSTEM\CurrentControlSet\Services\memcached,下面找 到一个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"
        }
    ]
}
时间: 2024-09-28 02:19:39

Memcached+WebApi记录的相关文章

centos7下安装php+memcached简单记录

1)centos7下安装php 需要再添加一个yum源来安装php-fpm,可以使用webtatic(这个yum源对国内网络来说恐怕有些慢,当然你也可以选择其它的yum源) [[email protected] ~]# rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm 安装php7-fpm和一些其它的必要的组件 [[email protected] ~]# yum -y install php70w-fpm php

Memcached常用命令及使用说明

一.存储命令 存储命令的格式: <command name> <key> <flags> <exptime> <bytes> <data block> 参数说明如下: <command name>set/add/replace <key>查找关键字 <flags>客户机使用它存储关于键值对的额外信息 <exptime>该数据的存活时间,0表示永远 <bytes>存储字节数 &

memcached 常用命令及使用说明

1.启动Memcache 常用参数 -p <num> 设置TCP端口号(默认设置为: 11211) -U <num> UDP监听端口(默认: 11211, 0 时关闭) -l <ip_addr> 绑定地址(默认:所有都允许,无论内外网或者本机更换IP,有安全隐患,若设置为127.0.0.1就只能本机访问)-c <num>      max simultaneous connections (default: 1024) -d 以daemon方式运行 -u &

Linux运维 第三阶段 (十七) memcached

一.相关概念: memcached.org(live journal站点贡献的),很多流行站点都在用,如wikipedia.twitter.youtube.mixi等,memcached是非常流行的缓存服务,众多的应用程序开发基本都支持memcached缓存(C有C库,C++有C++库,php有php库,开发时都可直接调用memcached功能,若某个应用程序开发时不用memcached,它就不能往memcached中缓存数据,缓存数据与否取决于app自身,由app决定缓不缓存用不用它) mem

memcached—Java操作Memcached实例

前面博客介绍了如何在Windows操作系统中安装Memcached,总结一下如何使用Java操作Memcached实例: 代码一: package com.ghj.packageoftool; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import jav

Windows和Linux环境下Memcached安装与配置(转)

一.memcached安装配置 windows平台安装 1.memcached-1.2.6-win32-bin.zip下载地址: http://code.jellycan.com/memcached/,执行memcached.exe -d install 安装. 2.守护进程方式启动:memcached.exe -m 512 -d start-d为守护进程启动,不能指定端口 默认端口11211-m为指定内存大小 3.指定端口启动:memcached.exe –p 33000 -m 512可以启动

Memcached常用命令及使用说明(转)

一.存储命令 存储命令的格式: 1 2 <command name> <key> <flags> <exptime> <bytes> <data block> 参数说明如下: <command name> set/add/replace <key> 查找关键字 <flags> 客户机使用它存储关于键值对的额外信息 <exptime> 该数据的存活时间,0表示永远 <bytes>

memcached常用命令 及原理

一.存储命令 存储命令的格式: 1 2 <command name> <key> <flags> <exptime> <bytes> <data block> 参数说明如下: <command name> set/add/replace <key> 查找关键字 <flags> 客户机使用它存储关于键值对的额外信息 <exptime> 该数据的存活时间,0表示永远 <bytes>

[转]Memcached常用命令及使用说明

一.存储命令 存储命令的格式: 1 2 <command name> <key> <flags> <exptime> <bytes> <data block> 参数说明如下: <command name> set/add/replace <key> 查找关键字 <flags> 客户机使用它存储关于键值对的额外信息 <exptime> 该数据的存活时间,0表示永远 <bytes>