在本人的这篇文章《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;
} }

测试结果:

Xmemcached与SpringBoot实际案例的更多相关文章

  1. SpringBoot开发案例之多任务并行+线程池处理

    前言 前几篇文章着重介绍了后端服务数据库和多线程并行处理优化,并示例了改造前后的伪代码逻辑.当然了,优化是无止境的,前人栽树后人乘凉.作为我们开发者来说,既然站在了巨人的肩膀上,就要写出更加优化的程序 ...

  2. SpringBoot开发案例从0到1构建分布式秒杀系统

    前言 ​最近,被推送了不少秒杀架构的文章,忙里偷闲自己也总结了一下互联网平台秒杀架构设计,当然也借鉴了不少同学的思路.俗话说,脱离案例讲架构都是耍流氓,最终使用SpringBoot模拟实现了部分秒杀场 ...

  3. Spring-boot官方案例分析之data-jpa

    Spring-boot官方案例分析之data-jpa package sample.data.jpa; import org.junit.Before; import org.junit.Test; ...

  4. Spring-boot官方案例分析之log4j

    Spring-boot官方案例分析之log4j 运行单元测试分析: @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfigur ...

  5. SpringBoot开发案例之打造私有云网盘

    前言 最近在做工作流的事情,正好有个需求,要添加一个附件上传的功能,曾找过不少上传插件,都不是特别满意.无意中发现一个很好用的开源web文件管理器插件 elfinder,功能比较完善,社区也很活跃,还 ...

  6. SpringBoot开发案例之整合Activiti工作流引擎

    前言 JBPM是目前市场上主流开源工作引擎之一,在创建者Tom Baeyens离开JBoss后,JBPM的下一个版本jBPM5完全放弃了jBPM4的基础代码,基于Drools Flow重头来过,目前官 ...

  7. SpringBoot开发案例之整合Dubbo分布式服务

    前言 在 SpringBoot 很火热的时候,阿里巴巴的分布式框架 Dubbo 不知是处于什么考虑,在停更N年之后终于进行维护了.在之前的微服务中,使用的是当当维护的版本 Dubbox,整合方式也是使 ...

  8. 使用SpringBoot入门案例

    一.创建项目 二.给根项目UnicomCmp的pom.xml,加入parent节点(spring-boot-starter-parent) <!--Add Spring boot Parent- ...

  9. SpringBoot开发案例之整合Kafka实现消息队列

    前言 最近在做一款秒杀的案例,涉及到了同步锁.数据库锁.分布式锁.进程内队列以及分布式消息队列,这里对SpringBoot集成Kafka实现消息队列做一个简单的记录. Kafka简介 Kafka是由A ...

随机推荐

  1. 判断大文件是否上传成功(一个大文件上传到ftp,判断是否上传完成)

    大文件上传ftp,不知道有没有上传完成,如果没有上传完成另一个程序去下载这个文件,导致下载不完整. 判断一个文件是否上传完成的方法: /** * 间隔一段时间去计算文件的长度来判断文件是否写入完成 * ...

  2. ajax案例_校验用户名

    目录 ajax案例_校验用户名 代码下载 需求 流程 搭建环境 开发代码 1_jsp 1_servlet 1_service.dao 2_servlet 2_jsp 测试后,功能实现,完结撒花 aja ...

  3. Python3 输入和输出(一)

    1.输出格式美化 Python两种输出值的方式: 表达式语句和 print() 函数. 第三种方式是使用文件对象的 write() 方法,标准输出文件可以用 sys.stdout 引用. 如果希望输出 ...

  4. 微信小程序入门与实战 常用组件API开发技巧项目实战*全

    第1章 什么是微信小程序? 第2章 小程序环境搭建与开发工具介绍 第3章 从一个简单的“欢迎“页面开始小程序之旅 第4章 第二个页面:新闻阅读列表 第5章 小程序的模板化与模块化 第6章 构建新闻详情 ...

  5. commit 没有提交图片,但是出现了commit的修改

    .gitignore里面写上 image/cache/  就好了

  6. pc电源cpu插座和显卡插座

    cpu插座是8口的,一般4+4 显卡插座是6口的,也有8口的用6+2 6+2的中2有一个小边,组合成8口也不能插入cpu插座.

  7. Java 交换两数的方法

    错误示范 1. 直接交换 public class SwapNumbers { // 直接交换 public static void swap(int a, int b) { int temp = a ...

  8. 使用requirejs+vue 打造 无需编译发布便捷修改调整的模块开发方案 (一)

    前言 不知道大家有没有这种感觉,现在流行的很多前端技术,基本上都基于webpack编译,当然不是说这种方案不好,在标准的开发流程运行中,这种方式其实也挺不错,管理方便,代码统一. 痛点:项目不是单独针 ...

  9. spring (反射+代理+DI+AOP)

    spring  https://baijiahao.baidu.com/s?id=1620606848227713760&wfr=spider&for=pc 反射 https://bl ...

  10. Centos7.4服务器安装Laravel5.7详细讲解(2018-10-27)

    一.在阿里云或者腾讯云选择Centos7并购买服务器 二.安装宝塔面板和php运行环境 1.输入命令 yum install -y wget && wget -O install.sh ...