设为首页 收藏本站
查看: 1632|回复: 0

[经验分享] WEB-APP 高速缓存 Memcache 简单例子

[复制链接]
发表于 2017-4-16 06:49:05 | 显示全部楼层 |阅读模式
任何软件,首要条件就是可使用的,不能用的软件,哪怕就是设计再完美,算法再精妙,界面再绚丽,都只能成为反面教材被引以为戒。 其次就是软件的功能,性能。其中性能占着很大的比重。
  高性能是用户体验的重要组成部分,而磁盘的互操作,线程等待,队列的效率影响着系统的性能。
什么是 memcache ?
  memcache 是一种基于 C/S 架构的内存式缓存系统.
什么是 memcached ?
  Memcached 是memcache的运行服务端,核心文件,Memcached基于一个存储键/值对的hashmap,其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。
  对于web应用而言,高并发与高持续访问量时刻使用着CPU的资源,所以,Memcached基本只占用内存资源。能够很好弥补对于高频繁调用,却不经常变更的资源。
  这里介绍的是 服务端Windows操作系统memcached-1.2.4-Win32,客户端通过java代码.java_memcached-release_1.6的简单例子。
********************服务端 START********************
服务端很简单,只需要启动一下 守护进程即可。该进程会是依赖于操作系统,在后台以进程的形式存在的。
解压memcached-1.2.4-Win32.rar
    通过cmd命令行安装:
DSC0000.png
    通过cmd命令行运行:
DSC0001.png
    检测进程是否运行:
DSC0002.png
********************服务端 END********************
********************客户端 START********************
解压java_memcached-release_1.6.rar
将java_memcached-release_1.6.jar放到项目lib下。
这里我创建一个简单的工具类:

package test.memcached;
import java.util.Date;
import java.util.Map;
import com.danga.MemCached.MemCachedClient;
import com.danga.MemCached.SockIOPool;
/**
* 缓存类
* @author 小G
*/
public class MemCachedCtl {
protected static MemCachedClient mcc = new MemCachedClient();// 创建全局的唯一实例
protected static MemCachedCtl memCached = new MemCachedCtl();
//配置信息
private static String[] servers = { "127.0.0.1:11211" };
private static Integer[] weights = { 3 };
private static int initialConnections  = 10;
private static int minSpareConnections = 5;
private static int maxSpareConnections = 50;   
private static long maxIdleTime        = 1000 * 60 * 30;      
private static long maxBusyTime        = 1000 * 60 * 5;        
private static long maintThreadSleep   = 1000 * 5;                     
private static int     socketTimeOut       = 1000 * 3;                 
private static boolean nagleAlg        = false;                           
/**
* 不允许通过构造方法创建实例
*/
protected MemCachedCtl() {
}
/**
* 获取唯一实例.
*/
public static MemCachedCtl getInstance() {
return memCached;
}
/**
* 初始化基本信息
*/
public void init(){
if(initConfig())
initPool();
}
/**
* 初始化配置信息
*/
private boolean initConfig(){
//TODO 初始化配置文件
return true;
}
/**
* memcache服务器初始化连接池
*/
private void initPool(){
SockIOPool pool = SockIOPool.getInstance();// 获取socke连接池的实例对象
pool.setServers(servers);// 设置服务器信息
pool.setWeights(weights);//设置权重
pool.setInitConn( initialConnections );// 设置初始连接数
pool.setMinConn( minSpareConnections );//设置最小连接数
pool.setMaxConn( maxSpareConnections );//设置最大连接数
pool.setMaxIdle( maxIdleTime );//设置最大处理时间
pool.setMaxBusyTime( maxBusyTime );
pool.setMaintSleep( maintThreadSleep );// 设置主线程的等待时间
pool.setSocketTO( socketTimeOut ); //设置连接超时时间
pool.setNagle( nagleAlg );      
pool.setHashingAlg( SockIOPool.NEW_COMPAT_HASH );
pool.setAliveCheck( true );
pool.initialize();      
}
/**
* 判断key是否存在
*/
public boolean keyExists(String key){
return mcc.keyExists(key);
}
/**
* 缓存一个对象
*/
public synchronized boolean add(String key, Object value) {
return mcc.add(key, value);
}
/**
* 缓存一个对象(日期)
*/
public synchronized boolean add(String key, Object value, Date expiry) {
return mcc.add(key, value, expiry);
}
/**
* 缓存一个对象(hashCode码)
*/
public synchronized boolean add(String key,Object value,Integer hashCode){
return mcc.add(key, value, hashCode);
}
/**
* 缓存一个对象
*/
public synchronized boolean set(String key, Object value) {
return mcc.set(key, value);
}
/**
* 缓存一个对象(日期)
*/
public synchronized boolean set(String key, Object value, Date expiry) {
return mcc.set(key, value, expiry);
}
/**
* 缓存一个对象(hashCode码)
*/
public synchronized boolean set(String key,Object value,Integer hashCode){
return mcc.set(key, value, hashCode);
}
/**
* 删除一个缓存对象
*/
public synchronized boolean delete(String key) {
return mcc.delete(key);
}
/**
* 删除一个缓存对象(日期)
*/
public synchronized boolean delete(String key, Object value, Date expiry) {
return mcc.delete(key, expiry);
}
/**
* 删除一个缓存对象(hashCode码)
*/
public synchronized boolean delete(String key,Integer hashCode,Date expiry){
return mcc.delete(key, hashCode, expiry);
}
/**
* 删除全部服务器上的缓存对象
*/
public synchronized boolean flushAll() {
return mcc.flushAll();
}
/**
* 删除指定服务器上的缓存对象
*/
public synchronized boolean flushAll(String[] servers) {
return mcc.flushAll(servers);
}
/**
* 替换原有的缓存(更新缓存)
*/
public synchronized boolean replace(String key, Object value) {
return mcc.replace(key, value);
}
/**
* 替换原有的缓存(更新缓存)
*/
public synchronized boolean replace(String key, Object value, Date expiry) {
return mcc.replace(key, value, expiry);
}
/**
* 替换原有的缓存(更新缓存)
*/
public synchronized boolean replace(String key, Object value, Integer hashCode) {
return mcc.replace(key, value, hashCode);
}
/**
* 替换原有的缓存(更新缓存)
*/
public synchronized boolean replace(String key, Object value,Date expiry, Integer hashCode){
return mcc.replace(key, value, expiry, hashCode);
}
/**
* 返回全部服务器状态
*/
public Map stats(){
return mcc.stats();
}
/**
* 返回指定服务器状态
*/
public Map stats(String[] servers){
return mcc.stats(servers);
}
/**
* 根据指定KEY获得缓存
*/
public Object get(String key) {
return mcc.get(key);
}
/**
* 根据指定KEY,HASHCODE获得缓存
*/
public Object get(String key,Integer hashCode) {
return mcc.get(key,hashCode);
}
/**
* 根据指定KEY,HASHCODE,状态值 获得缓存
*/
public Object get(String key,Integer hashCode,boolean asString) {
return mcc.get(key,hashCode,asString);
}

/**
* 测试方法
*/
public static void main(String[] args) {
MemCachedCtl cache = MemCachedCtl.getInstance();
cache.init();
//cache.add("helloworld_key", "helloworld_value");
cache.set("helloworld_key", "helloworld_value");
System.out.print("返回结果: " + cache.get("helloworld_key"));
}
}

在java_memcached-release_1.6文件夹内,crc目录下有源码和测试类可供学习。
********************客户端 END********************

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-365167-1-1.html 上篇帖子: 结合memcache解决在线用户统计问题 下篇帖子: 用perl写了个memcache ping
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表