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"
}
]
}
Memcached+WebApi记录的更多相关文章
- centos7下安装php+memcached简单记录
1)centos7下安装php 需要再添加一个yum源来安装php-fpm,可以使用webtatic(这个yum源对国内网络来说恐怕有些慢,当然你也可以选择其它的yum源) [root@nextclo ...
- Memcached简介
在Web服务开发中,服务端缓存是服务实现中所常常采用的一种提高服务性能的方法.其通过记录某部分计算结果来尝试避免再次执行得到该结果所需要的复杂计算,从而提高了服务的运行效率. 除了能够提高服务的运行效 ...
- memcached 常用命令及使用说明
1.启动Memcache 常用参数 -p <num> 设置TCP端口号(默认设置为: ) -U <num> UDP监听端口(默认: , 时关闭) -l <ip_addr& ...
- Memcached常用命令及使用说明(转)
一.存储命令 存储命令的格式: 1 2 <command name> <key> <flags> <exptime> <bytes> < ...
- Windows和Linux环境下Memcached安装与配置(转)
一.memcached安装配置 windows平台安装 1.memcached-1.2.6-win32-bin.zip下载地址: http://code.jellycan.com/memcached/ ...
- Memcached常用命令及使用说明
一.存储命令 存储命令的格式: 1 2 <command name> <key> <flags> <exptime> <bytes> < ...
- Memcached总结三:Memcached常用命令及使用说明
一.存储命令 存储命令的格式: 1 2 <command name> <key> <flags> <exptime> <bytes> < ...
- springMVC整合memcached,以注解形式使用
睡不着,深夜写点博客.闲下来有一个月了,心里多少有点…… 在北京找工作一再受阻,这个时间点也不好找 再接再厉 之前没有用过memcached,没有什么实战经验,看了一些关于memcached的博客,写 ...
- 转:Memcached常用命令及使用说明
一.存储命令 存储命令的格式: 1 2 <command name> <key> <flags> <exptime> <bytes> < ...
随机推荐
- Android使用Xutil3.0下载文件.md
Android使用Xutil3.0下载文件.md 新建项目: 引入依赖: implementation 'org.xutils:xutils:3.5.0' 添加权限: <uses-permiss ...
- 分享一套简单的CodeSmith三层模板
如果要连接mysql,需要安装驱动: https://cdn.mysql.com//Downloads/Connector-Net/mysql-connector-net-8.0.12.msi 连接字 ...
- Java中的简单工厂模式(转)
Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的 ...
- Semaphore 信号量
一个计数信号量.从概念上讲,信号量维护了一个许可集.如有必要,在许可可用前会阻塞每一个 acquire(),然后再获取该许可.每个 release() 添加一个许可,从而可能释放一个正在阻塞的获取者. ...
- Linux终端回话记录和回放工具 - asciinema使用总结
目前linux终端回放工具常见的就是asciinema和script了, 这两种工具都有那种类似于视频回放的效果.虽然这样做的代价是录制过程中需要占用一定的cpu资源以及录制后可能会因为视频文件太大而 ...
- [机器学习] 性能评估指标(精确率、召回率、ROC、AUC)
混淆矩阵 介绍这些概念之前先来介绍一个概念:混淆矩阵(confusion matrix).对于 k 元分类,其实它就是一个k x k的表格,用来记录分类器的预测结果.对于常见的二元分类,它的混淆矩阵是 ...
- Spring 环境与profile(一)——超简用例
什么是profile,为什么需要profile? 在开发时,不同环境(开发.联调.预发.正式等)所需的配置不同导致,如果每改变一个环境就更改配置不但麻烦(修改代码.重新构建)而且容易出错.Spring ...
- python的Web框架,Django模板变量,过滤器和静态文件引入
HTML模板的路径查找 在setting中设置查找路径: #默认的查找在此处填写,优先级最高,为在manage.py的同级路径中,添加(常规是template)文件夹,在(template)文件夹中配 ...
- 浅析libuv源码-编译启动
面试的间隙回头复习了一下node,感觉node就像一个胶带,把V8和libuv粘在了一起. V8毫无疑问,负责解析执行JavaScript,相当于语言层面的桥梁:而libuv则是负责操作系统底层功能的 ...
- DataTable数据显示于MVC应用程序
这篇博文是把DataTable的数据显示于MVC的应用程序上. 首先我们在数据库中创建一个表,并添加数据,然后创建存储过程: 接下来,我们去下载一个BusinessBase组件:http://www. ...