xmemcached数据同步

  1. 解决方案描述

    通过不同模块对应不同版本号解决缓存同步问题。

  2. 结构图

    164247_kC7Y_2410006.png

  3. 代码

    CacheVersion.java缓存版本

package com.hr.util;

import java.util.HashMap;
import java.util.Map;
/**
 * 存放最新缓存版本号
 * @author Administrator
 *
 */
public class CacheVersion {
	
	private static Map<String,Object> versionMap=new HashMap<String,Object>();

	

	public static String getValue(String key){
		String str=null;
		try {
			str=versionMap.get(key).toString();
		} catch (Exception e) { 
			e.printStackTrace();
		}
		System.out.println(str);
		return str;
	}
	
	public static void setValue(String key,String value){
		versionMap.put(key, value);
	}
	
}

MemEnum.java可根据实际业务声明枚举,每一个枚举代表一个模块

package com.hr.util;

public enum MemEnum {
	position("职位"),
	company("公司、充值、消费");
	
	
	private String desc;
	
	public String getDesc() {
		return desc;
	}

	public void setDesc(String desc) {
		this.desc = desc;
	}

	private MemEnum(String _desc){
		this.desc=_desc;
	}
}

UUIDGenerator.java 获取版本号

package com.hr.util;

import java.util.UUID;

public class UUIDGenerator { 
	
    public static String getUUID(){ 
        String s = UUID.randomUUID().toString().toUpperCase(); 
        return s.replace("-", ""); 
    } 
    public static void main(String[] args) {
		System.out.println(UUIDGenerator.getUUID());
	}
}

Test.java测试

package com.memcached.test;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.TimeoutException;

import com.danga.MemCached.SockIOPool;
import com.hr.util.CacheVersion;
import com.hr.util.MemEnum;
import com.hr.util.UUIDGenerator;

import net.rubyeye.xmemcached.GetsResponse;
import net.rubyeye.xmemcached.MemcachedClient;
import net.rubyeye.xmemcached.MemcachedClientBuilder;
import net.rubyeye.xmemcached.XMemcachedClientBuilder;
import net.rubyeye.xmemcached.exception.MemcachedException;
import net.rubyeye.xmemcached.utils.AddrUtil;


public class Test {
	private static MemcachedClientBuilder builder = new XMemcachedClientBuilder( AddrUtil.getAddresses ("192.168.11.138:11211"));
	private static MemcachedClient mcc;
	static{
		try {
			mcc =builder.build();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args) throws TimeoutException, InterruptedException, MemcachedException, IOException {
		//通过定义枚举,控制一个模块(如职位有关的)的缓存,可自定义模块大小范围
		
		//第一种情况,赋值
		setValue("k1",MemEnum.position.toString(),"数据1",100);
		Object result= getValue("k1",MemEnum.position.toString());
		System.out.println(result);
		
		setValue("k1",MemEnum.position.toString(),"数据2",100);
		result= getValue("k1",MemEnum.position.toString());
		System.out.println(result);
		//第二种情况,更新数据时,只需要更新对应模块的版本号,再次获取发现版本号不匹配,返回null
		CacheVersion.setValue(MemEnum.position.toString(), UUIDGenerator.getUUID());
		//result=null
		result= getValue("k1",MemEnum.position.toString());
		System.out.println(result);
		
	}
	/**
	 * 根据key和版本key获取value
	 * @param keyName
	 * @param versionKeyName
	 * @return
	 * @throws MemcachedException 
	 * @throws InterruptedException 
	 * @throws TimeoutException 
	 */
	private static Object getValue(String key,String versionKey ) throws TimeoutException, InterruptedException, MemcachedException{
		//先判断版本是否最新
		String version_value=mcc.get(versionKey);
		String cacheVersion=CacheVersion.getValue(versionKey);
		if(version_value!=null && cacheVersion!=null && cacheVersion.equals(version_value)){
			return mcc.get(key);
		}
		return null;	
	}
	/**
	 * 根据key和版本块设置value
	 * @param keyName
	 * @param versionKeyName
	 * @param obj
	 * @param expiry
	 * @throws TimeoutException
	 * @throws InterruptedException
	 * @throws MemcachedException
	 */
	private static void setValue(String key, String versionKey, Object value, int expiry) throws TimeoutException, InterruptedException, MemcachedException{
		String version= UUIDGenerator.getUUID();
		//设置/更新缓存
		mcc.set(key, expiry, value);
		//设置/重新设置 缓存版本号
		mcc.set(versionKey, 0, version);
		//记录最新版本号
		CacheVersion.setValue(versionKey, version);
		
	}
	
	
}



转载于:https://my.oschina.net/u/2410006/blog/487622

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值