Xmemcached与SpringBoot实际案例

在本人的这篇文章《Xmemcached集群与SpringBoot整合》基础上,进行XMemcached与SpringBoot实际案例的结合。

有以下这张表,将这张表的增删改查操作都添加到XMemcached中进行:

将id用逗号拼接保存在indexUuids,每个id对应的对象用json的方式单独存储。

package com.czhappy.huans.xmemcached;

import com.czhappy.huans.entity.Area;

import java.util.List;

public interface AreaCacheDAO {

    void addArea(Area area) throws Exception;

    void updateArea(Area area) throws Exception;

    void delArea(Integer uuid) throws Exception;

    List<Area> getAreas() throws Exception;

    Area getAreaById(Integer uuid) throws Exception;

}
package com.czhappy.huans.xmemcached;

import com.alibaba.fastjson.JSON;
import com.czhappy.huans.Utils.ToolUtil;
import com.czhappy.huans.entity.Area;
import com.czhappy.huans.service.AreaService;
import net.rubyeye.xmemcached.MemcachedClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

@Service
public class AreaCacheDAOImpl implements AreaCacheDAO {

    private static final String INDEX_NAME="indexUuids";
    @Autowired
    private MemcachedClient memcachedClient;

    @Autowired
    private AreaService areaService;

    /*
      思路一:
        1、indexUuids : 1,2,3,4,5,6,7
        2、
            area:1 -> json
            area:2 -> json
            area:3 -> json
            area:4 -> json
            area:6 -> json

        思路二:
          list<Area> -> json -> key: indexObjects
     */
    @Override
    public void addArea(Area area) throws Exception {
        // 先修改数据库
        boolean isSuccess = areaService.addArea(area);
        if(isSuccess){
            // 转换为JSON实现
            String areaStr = JSON.toJSONString(area);

            // 如果成功,则修改缓存
            // 判断indexUuids存不存在 ""  "   "
              String uuids = memcachedClient.get(INDEX_NAME);
              if(uuids!=null && uuids.trim().length()>0){
                  // 如果存在,修改indexUuids
                  memcachedClient.append(INDEX_NAME,","+area.getAreaId());
                  memcachedClient.set(""+area.getAreaId(),0,areaStr);
              }else{
                  // 如果不存在, 初始化一个indexUuids -> tblhouse.uuid
                  memcachedClient.set(INDEX_NAME,0,""+area.getAreaId());
                  memcachedClient.set(""+area.getAreaId(),0,areaStr);
              }

        }else{
            // TODO -> 可以选择返回或抛例外
        }
    }

    @Override
    public void updateArea(Area area) throws Exception {
        // 先修改数据库
        boolean isSuccess = areaService.modifyArea(area);
        if(isSuccess){
            // 转换为JSON实现
            String areaStr = JSON.toJSONString(area);

            // 如果成功,则修改缓存
            // 判断indexUuids存不存在 ""  "   "
            String uuids = memcachedClient.get(INDEX_NAME);
            if(uuids!=null && uuids.trim().length()>0){
                memcachedClient.replace(""+area.getAreaId(),0,areaStr);
            }else{
                // 如果不存在, 初始化一个indexUuids -> tblhouse.uuid
                memcachedClient.set(INDEX_NAME,0,""+area.getAreaId());
                memcachedClient.replace(""+area.getAreaId(),0,areaStr);
            }

        }else{
            // TODO -> 可以选择返回或抛例外
        }
    }

    @Override
    public void delArea(Integer uuid) throws Exception {
        boolean isSuccess = areaService.deleteArea(uuid);
        String uuidStr = ""+uuid;
        if(isSuccess){
            // 修改indexUuids   101,3,4,5,101,202,2,404
            String uuids = memcachedClient.get(INDEX_NAME);
            if(!ToolUtil.isEmpty(uuids)) {
                // 将字符串转换为集合,循环寻找匹配值,然后删除,将结果放入缓存
                // 将uuids作为字符串处理  uuid=,2, replace ,
                // 如果为首位 -> uuid, -> subString
                if(uuids.startsWith(uuid+",")){
                    uuids = uuids.substring(uuidStr.length()+1);
                }else if(uuids.endsWith(","+uuid)){
                    // 如果是结尾 -> ,uuid -> sub
                    int endIndex = uuids.length() - (uuidStr.length()+1);
                    uuids = uuids.substring(0,endIndex);
                }else{
                    // 如果是中间 -> ,uuid, -> replace -> ,
                    uuids = uuids.replace(","+uuid+",",",");
                }
                // 更新索引列表
                memcachedClient.set(INDEX_NAME,0,uuids);
            }
            // 删除对应的数据
            memcachedClient.delete(uuidStr);
        }else{
            // TODO -> 可以选择返回或抛例外
        }


    }


    @Override
    public List<Area> getAreas() throws Exception {
        // 101,1,2,3,4,5,7,202,404
        List<String> keys = new ArrayList<>();
        List<Area> areas = new ArrayList<>();

        String uuids = memcachedClient.get(INDEX_NAME);
        // 组织所有key集合
        keys = Arrays.asList(uuids.split(","));

        // 这是一个反例
//        Map<String,Object> maps = memcachedClient.get(keys);
//        for(Object obj : maps.values()){
//            areas.add((Area) obj);
//        }

        // 正常的操作形式
        Map<String,String> maps = memcachedClient.get(keys);
        for(String areaJson : maps.values()){
            Area area = JSON.parseObject(areaJson,Area.class);
            areas.add(area);
        }

        return areas;
    }

    @Override
    public Area getAreaById(Integer uuid) throws Exception {

        String areaJSON = memcachedClient.get(""+uuid);

        Area area = JSON.parseObject(areaJSON,Area.class);

        return area;
    }

}

测试结果:

原文地址:https://www.cnblogs.com/chenzheng8975/p/9449987.html