java中使用memcached存储大对象的解决方案

基本思路:

因为memcache page存储默认为1m,超出就会报错,所以不能存储超过1m的数据。但是有时候项目中需要将超过1m的数据存储到缓存中,基本思路就是:

1.对缓存的字符串进行切分,以下为切分字符串的方法,是根据字符串占用字符大小进行切分;

/**
	 * 将原始字符按指定长度进行切分
	 * @param value 原字符串
	 * @param length 指定长度
	 * @return
	 */
	public static List<String> split(String value,int length){
		byte[] bytes = value.getBytes();
		List<String> ls = new ArrayList<String>();
		if (value.length() <= length){
			ls.add(value);
			return ls;
		}
		int len = value.length();
		for (int i = 0; i < len; ) {
			StringBuilder stringBuilder = new StringBuilder();
			int count = 0;
			for (int j = 0; j < length && i<len; j++) {
				char c = value.charAt(i);
				i ++ ;
				count += String.valueOf(c).getBytes().length;
				stringBuilder.append(c);
				if (count>length){
					i --;
					stringBuilder.deleteCharAt(j);
					break;
				}
			}
			ls.add(stringBuilder.toString());
		}

		return ls;
	}
2.将切分的字符串存入memcached,mcc为memcached客户端对象

public String setCache(@FormParam("key") String key,
			@FormParam("value") String value, @FormParam("period") int period) {
		// System.out.println("memCache:"+key+" set:"+period+"||||"+value);
		List<String> values = split(value, 1000*1024);
		mcc.set(key+"-size",values.size());
		String size = String.valueOf(mcc.get(key+"-size"));
		if (!"null".equals(size)){
			for (int i = 0; i < Integer.valueOf(size); i++) {
				mcc.delete(key+"-part"+i);
			}
		}
		if (period <= 0) {
			if(values.size()==1){
				mcc.set(key, value);
			}else{
				for(int i = 1;i<values.size()+1;i++){
					mcc.set(key+"-part"+i, values.get(i-1));
				}
			}
		} else {
			if(values.size()==1){
				mcc.set(key, value,new Date(period));
			}else{
				for(int i = 1;i<values.size()+1;i++){
					mcc.set(key+"-part"+i, values.get(i-1),new Date(period));
				}
			}
		}
		return "\"status\":\"succeed\"";
	}
存入size是因为如果第一次存储的值较大,二后面存的值小,可能会将大的部分值累积到小的值上,从而导致获取的信息错误;

3.获取对应值

public String getCache(@FormParam("key") String key) {
		StringBuilder stringBuilder = new StringBuilder();
		String s = null;
		if (key != null) {
			s = String.valueOf(mcc.get(key+"-part1"));
			stringBuilder.append(s);
			if("null".equals(s)){
				s = String.valueOf(mcc.get(key));
				return s ;
			}else{
				int index = 2;
				String flg = "";
				while(!"null".equals(flg)){
					flg = String.valueOf(mcc.get(key+"-part"+(index++)));
					if("null".equals(flg)){
						break;
					}
					stringBuilder.append(flg);
				}
				return stringBuilder.toString();
			}
		} else {
			System.out.println(key + " get:" + s);
			return "";
		}

	}




猜你喜欢

转载自blog.csdn.net/zeratyl/article/details/79094482
今日推荐