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;
} }
测试结果:


Xmemcached与SpringBoot实际案例的更多相关文章
- SpringBoot开发案例之多任务并行+线程池处理
前言 前几篇文章着重介绍了后端服务数据库和多线程并行处理优化,并示例了改造前后的伪代码逻辑.当然了,优化是无止境的,前人栽树后人乘凉.作为我们开发者来说,既然站在了巨人的肩膀上,就要写出更加优化的程序 ...
- SpringBoot开发案例从0到1构建分布式秒杀系统
前言 最近,被推送了不少秒杀架构的文章,忙里偷闲自己也总结了一下互联网平台秒杀架构设计,当然也借鉴了不少同学的思路.俗话说,脱离案例讲架构都是耍流氓,最终使用SpringBoot模拟实现了部分秒杀场 ...
- Spring-boot官方案例分析之data-jpa
Spring-boot官方案例分析之data-jpa package sample.data.jpa; import org.junit.Before; import org.junit.Test; ...
- Spring-boot官方案例分析之log4j
Spring-boot官方案例分析之log4j 运行单元测试分析: @RunWith(SpringJUnit4ClassRunner.class) @SpringApplicationConfigur ...
- SpringBoot开发案例之打造私有云网盘
前言 最近在做工作流的事情,正好有个需求,要添加一个附件上传的功能,曾找过不少上传插件,都不是特别满意.无意中发现一个很好用的开源web文件管理器插件 elfinder,功能比较完善,社区也很活跃,还 ...
- SpringBoot开发案例之整合Activiti工作流引擎
前言 JBPM是目前市场上主流开源工作引擎之一,在创建者Tom Baeyens离开JBoss后,JBPM的下一个版本jBPM5完全放弃了jBPM4的基础代码,基于Drools Flow重头来过,目前官 ...
- SpringBoot开发案例之整合Dubbo分布式服务
前言 在 SpringBoot 很火热的时候,阿里巴巴的分布式框架 Dubbo 不知是处于什么考虑,在停更N年之后终于进行维护了.在之前的微服务中,使用的是当当维护的版本 Dubbox,整合方式也是使 ...
- 使用SpringBoot入门案例
一.创建项目 二.给根项目UnicomCmp的pom.xml,加入parent节点(spring-boot-starter-parent) <!--Add Spring boot Parent- ...
- SpringBoot开发案例之整合Kafka实现消息队列
前言 最近在做一款秒杀的案例,涉及到了同步锁.数据库锁.分布式锁.进程内队列以及分布式消息队列,这里对SpringBoot集成Kafka实现消息队列做一个简单的记录. Kafka简介 Kafka是由A ...
随机推荐
- sql server 时间处理函数 datediff() 和getdate()
一: DATEDIFF() 定义和用法 DATEDIFF() 函数返回两个日期之间的时间. 语法 DATEDIFF(datepart,startdate,enddate) startdate 和 en ...
- 010_Python3 字典
字典是另一种可变容器模型,且可存储任意类型对象. 字典的每个键值(key=>value)对用冒号(:)分割,每个对之间用逗号(,)分割,整个字典包括在花括号({})中 ,格式如下所示: d ...
- 强大的捉包工具Fiddler
Fiddler2出现 creation of the root certificate was not successful 错误 http://www.zhaokeli.com/Article/63 ...
- public abstract啥时候可以省略?
父类是抽象类,其中有抽象方法,那么子类继承父类,并把父类中的所有方法都实现覆盖了,子类才有创建对象实例的能力,否则子类也必须是抽象类.抽象类中可以有构造方法,是子类在构造子类对象时需要调用父类(抽象类 ...
- 好久木来了,一直忙于项目(加懒惰),今天讲讲vuecli3.0的使用
vue更新换代很快,马上vue都要出3.0了,这是一个巨大的变革,不过今天讲的是vuecli3.0,里面使用的vue仍然是2的,所有可以放心大胆使用. Vue CLI 是一个基于 Vue.js 进行快 ...
- jsp 页面 javax.servlet.jsp.JspException cannot be resolved to a type 异常
<dependencies><dependency><groupId>javax.servlet</groupId><artifactId> ...
- As I Began to Love Myself
As I Began to Love Myself: Charlie Chaplin on his 70th birthday As I began to love myself I found th ...
- java 封装返回结果实体类 返回结果以及错误信息
public class ResponseMessage { private final static String STATUS_OK = "0"; private final ...
- 【免费】Linux命令行与Shell脚本编程大全 第3版 PDF全本 21MB 百度网盘下载
2019年7月12日更新 链接: https://pan.baidu.com/s/17RDrepFf-GI427I7k3jBcQ 提取码: qk8k 网上的大部分都要积分什么的,很麻烦.这本很清晰,分 ...
- 下面的代码在Python2中的输出是什么?解释你的答案
python2 def div1(x,y): print "%s/%s = %s" % (x, y, x/y) def div2(x,y): print "%s//%s ...