首页 > 其他分享 >Xmemcached与SpringBoot实际案例

Xmemcached与SpringBoot实际案例

时间:2023-03-02 12:31:34浏览次数:40  
标签:SpringBoot area Xmemcached memcachedClient 案例 uuids import Area uuid


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

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

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

Xmemcached与SpringBoot实际案例_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;
}

}



测试结果:

Xmemcached与SpringBoot实际案例_memcached_02

Xmemcached与SpringBoot实际案例_memcached_03









标签:SpringBoot,area,Xmemcached,memcachedClient,案例,uuids,import,Area,uuid
From: https://blog.51cto.com/u_4427045/6095972

相关文章

  • springboot后端接收不到前端传来的表单值
    为啥接收不到因为传来的字段值太大了,springboot默认启动依赖tomcat,tomcat默认接收表单值最大为2MB,将server.tomcat.max-http-form-post-size这个配置调大即可#yml方式s......
  • SpringBoot+WebSocket实现实时获取系统数据
    SpringBoot+WebSocket实现实时获取系统数据引入maven依赖<dependencies><dependency><groupId>org.springframework.boot</groupId>......
  • SpringBoot——常用配置
    application.yml配置信息spring:profiles:active:devapplication:name:jwt-token-security#Jackson配置项jackson:serialization:......
  • SpringBoot自定义启动时的ASCII艺术字
    1.SpringBoot默认的艺术字2.进入ASCII艺术字网站https://www.bootschool.net/ascii3.把下载的banner.txt文件放在resource目录4.重新启动项目【注意:如果不生效的......
  • SpringBoot
    简介SprintBoot是一款快速开发框架,能够帮助我们快速整合第三方框架不同于SSM项目繁琐的xml配置,SpintBoot去除了xml配置全部采用注解化的方式配置内嵌Tomcat,运行就会启......
  • SpringBoot过滤器获取请求Body
    packagecom.example.springboot.core;importlombok.extern.slf4j.Slf4j;importorg.springframework.stereotype.Component;importjavax.servlet.http.HttpServle......
  • 【Kaggle】Telco Customer Churn 电信用户流失预测案例 ----数据预处理
    任务目标:  对于电信运营商来说,用户流失有很多偶然因素,不过通过对用户属性和行为的数字化描述,我们或许也能够在这些数据中,挖掘导致用户流失的“蛛丝马迹”,并且更重要的一......
  • G公司对接伍尔特wurth EDI项目案例
    项目背景对伍尔特wurth而言,与其供应商开展成功的数字化项目通常是以自动连接开始的。通过这种方式,标准化的信息可以在彼此之间进行简单而自动的交换。这个流程被称为电......
  • SpringBoot自定义拦截器和跨域配置冲突的问题
    跨域配置完成以后,又进行拦截器的配置,发现跨域配置失效,以下是原配置@ConfigurationpublicclassCORSConfigimplementsWebMvcConfigurer{@BeanpublicWebMv......
  • 1000亿数据、30W级qps如何架构?来一个天花板案例
    说在前面在尼恩的(50+)读者社群中,经常遇到一个非常、非常高频的一个架构面试题,类似如下:千万级数据,如何做系统架构?亿级数据,如何做做系统架构?千万级流量,如何做系统架构?......