基本思路:
因为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 "";
}
}