在本人的这篇文章《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. ORA-00600[2662]问题 汇总

    一.ORA-00600[2662]问题模拟及解决方法 这是2013年的一篇文章,也不知道数据库是什么版本, 我的数据库时11.2.0.4,使用下面方法模拟的时候,模拟不出来....   参照eygle ...

  3. Postgresql vacuum freeze相关参数

    先看3个参数:autovacuum_freeze_max_age           | 500000vacuum_freeze_min_age               | 10vacuum_fr ...

  4. PostgreSQL 使用PG_Rman进行物理备份

    背景 在Oracle下我们可以使用rman进行物理备份,支持数据库的全量.增量.归档的备份模式而PostgreSQL作为开源数据库,近些时间来也一直向商业版数据库看齐,也推出了开源功工具pg_rman ...

  5. pytz

    pytz django的模型类中使用的 DateTimeField 字段,自动添加下来的携带有时区信息,2019-06-19T03:58:11.937945Z 在我的逻辑中需要对时间进行比较,我使用了 ...

  6. NAS,IP SAN以及iSCSCI SAN存储的一些认识和理解

    由 cxemc 在 2013-9-24 上午9:12 上创建,最后由 cxemc 在 2013-9-24 上午9:12 上修改 版本 1 1. NAS和SAN存储 a. NAS本身可以做为一台网络设备 ...

  7. Airflow 配置celery+rabbitmq和celery+redis

    Airflow 配置celery+rabbitmq 1.安装celery和rabbitmq组件 pip3 install apache-airflow[celery] pip3 install apa ...

  8. 微信小程序设置滚动条

    前言 又很久没有写东西了,上周开始将一个APP和一个网站的内容整合到微信小程序中,到这会儿终于搞得快结束了,才发现为啥我的小程序滚动视图没有滚动条,这是闹哪样,没有滚动条的滚动是没有灵魂的. 客官可移 ...

  9. fdisk创立主分区过程

    [root@localhost ~]# fdisk /dev/sdb …省略部分输出… Command (m for help): p #显示当前硬盘的分区列表 Disk /dev/sdb: 21.5 ...

  10. Mininet系列实验(二):Mininet可视化应用

    1 实验目的 该实验通过Mininet学习miniedit可视化操作,可直接在界面上编辑任意想要的拓扑,生成python自定义拓扑脚本,简单方便.在实验过程中,可以了解以下方面的知识: Miniedi ...