在本人的这篇文章《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. 25 | MySQL是怎么保证高可用的?

    在上一篇文章中,我和你介绍了binlog的基本内容,在一个主备关系中,每个备库接收主库的binlog并执行. 正常情况下,只要主库执行更新生成的所有binlog,都可以传到备库并被正确地执行,备库就能 ...

  2. springboot启动时执行任务CommandLineRunner

    # SpringBoot中CommandLineRunner的作用> 平常开发中有可能需要实现在项目启动后执行的功能,SpringBoot提供的一种简单的实现方案就是添加一个model并实现Co ...

  3. LA、Remember the Word (字典树, 简单dp)

    传送门 题意: 给你一个初始串 S,strlen(s) <= 3e5  然后给你 n 个单词. n <= 4000,  每个单词的长度不超过 100 : 问你这个初始串,分割成若干个单词的 ...

  4. fdisk分区命令

    fdisk是Linux系统中最常用的分区工具,通过这个命令也可以查看系统中所有可用的分区,但是这个命令只支持MBR的分区表(这句话应该只对某些系统,CentOS7-1810适用,Debian9.5和o ...

  5. 后缀数组 TYVJ P1860 后缀数组

    /*P1860 后缀数组时间: 1000ms / 空间: 131072KiB / Java类名: Main描述 我们定义一个字符串的后缀suffix(i)表示从s[i]到s[length(s)]这段子 ...

  6. linux系列(二十一):chmod命令

    1.命令格式 chmod [-cfvR] [--help] [--version] mode file 2.命令功能 用于改变文件或目录的访问权限,用它控制文件或目录的访问权限. 3.命令参数 必要参 ...

  7. 项目 java.lang.NoClassDefFoundError 异常。

    项目部署之后调用接口失败:异常信息: NoClassDefFoundError ClassNotFoundException 注意这两种是有区别的. 具体转 https://www.cnblogs.c ...

  8. IDEA中获取资源路径问题

    更正 以src开始,就能用相对路径了... shift+ctrl+alt+s 调出项目结构, 在Modules里,就是设置 Sources Resources Test的界面, 右面的路径就是相对路径 ...

  9. Java基础系列 - 查找数组的最大值和最小值

    package com.test6; public class test5 { public static void main(String[] args) { int[] arr = {1, 2, ...

  10. vue 脚手架安装

    首先安装node.js npm 配置全局安装路径和缓存 node 安装路径下新建两个目录,node_cache和node_global npm config set prefix "E:\n ...