环境背景:

上传用户信息时,图片上传至七牛云服务器的对象存储空间内,每次点击上传图片,无论用户最后是否确定添加/编辑,都会把图片上传到服务器,

问:添加或编辑用户信息后,如何清理多余、没用的图片数据?

解决方案一:

思路:定义两个set集合,一个用来存放没确定的图片信息,一个用来存放已经确定的图片信息,把两个值存在redis数据库里,用redis.sdiff筛选多余的图片,然后根据图片信息在云服务器中删除。

常量类

public class RedisConstant {//图片所有图片名称public static final String PIC_RESOURCES = "PicResources";//图片保存在数据库中的图片名称public static final String PIC_DB_RESOURCES = "PicDbResources";
}

控制层Controller类

@RestController
@RequestMapping("/user")
public class UserController {//使用JedisPool操作Redis服务@Autowiredprivate JedisPool jedisPool;//文件上传@RequestMapping("/upload")public Result upload(@RequestParam("imgFile") MultipartFile imgFile){System.out.println(imgFile);String originalFilename = imgFile.getOriginalFilename();//原始文件名 123123.jpgint index = originalFilename.lastIndexOf(".");String extention = originalFilename.substring(index - 1);//.jpgString fileName = UUID.randomUUID().toString() + extention;//    FuM1Sa5TtL_ekLsdkYWcf5pyjKGu.jpgtry {//将文件上传到七牛云服务器QiniuUtils.upload2Qiniu(imgFile.getBytes(),fileName);//把图片信息存入 所有图片set集合里jedisPool.getResource().sadd(RedisConstant.PIC_RESOURCES,fileName);} catch (IOException e) {e.printStackTrace();return new Result(false, MessageConstant.PIC_UPLOAD_FAIL);}return new Result(true, MessageConstant.PIC_UPLOAD_SUCCESS,fileName);}

业务层逻辑层Service类

@Service(interfaceClass = UserService.class)
@Transactional
public class UserServiceImpl implements UserService{@Autowiredprivate UserDao userDao;@Autowiredprivate JedisPool jedisPool;//新增用户public void add(User user) {//添加用户userDao.add(user);//将图片名称保存到Redis集合中String fileName = user.getImg();//将图片信息保存在 数据库名称的set集合中jedisPool.getResource().sadd(RedisConstant.PIC_DB_RESOURCES,fileName);}

定时任务Quartz组件工作类

public class ClearImgJob {@Autowiredprivate JedisPool jedisPool;public void clearImg(){//根据Redis中保存的两个set集合进行差值计算,获得垃圾图片名称集合Set<String> set = jedisPool.getResource().sdiff(RedisConstant.PIC_RESOURCES, RedisConstant.PIC_DB_RESOURCES);if(set != null){for (String picName : set) {//删除七牛云服务器上的图片QiniuUtils.deleteFileFromQiniu(picName);//从Redis集合中删除图片名称jedisPool.getResource().srem(RedisConstant.PIC_RESOURCES,picName);}}}
}

以上能解决 添加用户时,产生多余图片的的清除方案,但发现另一个问题,如果编辑用户信息时,重新上传图片,那因为旧的图片信息已经存放在 数据库set集合里面,所以当用户修改图片时,旧的图片不会因此而被删除。

二问:如何清理用户存在放数据库set集合的图片

解决方案一:

思路:定义一个新的set集合,用于存放编辑时旧图片信息,再弹出编辑窗口时,获取旧图片信息。把旧图片信息存放在暂存的set集合里,并且把旧图片信息从 存放数据库图片的set集合中删除,但这样有个BUG,就是碰上定时清理图片任务执行时,会把旧图片信息从云服务器删除,而用户如果在编辑时没有上传图片,则会出现 旧图片被清理的情况。所以定时任务 sdiff应该加上 暂存的图片的set集合。

常量类

public class RedisConstant {//图片所有图片名称public static final String PIC_RESOURCES = "PicResources";//图片保存在数据库中的图片名称public static final String PIC_DB_RESOURCES = "PicDbResources";//存放旧图片名称public static final String PIC_ZS_RESOURCES = "PicZsResources";
}

处理编辑窗口数据回显的方法

    @Overridepublic UserfindById(Integer id) {User user= userDao.findById(id);//把图片从redis长存区移到暂存区String img = user.getImg();if(img !=null && img !="" && img.length()>0 ) {//把旧图片信息保存到 暂存旧图片set集合jedisPool.getResource().sadd(RedisConstant.PIC_ZS_RESOURCES, img);//把旧图片从数据库set集合中移除jedisPool.getResource().srem(RedisConstant.PIC_DB_RESOURCES, img);}return user;}

处理提交修改的方法

    @Overridepublic void edit(User user) {//修改套餐userDao.edit(user);//将存入数据库的照片名称 加入redisString img = user.getImg();if(img !=null && img !="" && img.length()>0 ) {//修改后的图片存放到 数据库set集合jedisPool.getResource().sadd(RedisConstant.PIC_DB_RESOURCES, img);//清空暂存区的 set集合,避免影响后面定时清理任务jedisPool.getResource().del(RedisConstant.PIC_ZS_RESOURCES);}}

定时任务类

public class ClearImgJob {@Autowiredprivate JedisPool jedisPool;public void clearImg(){Set<String> set = jedisPool.getResource().sdiff(RedisConstant.PIC_RESOURCES,RedisConstant.PIC_DB_RESOURCES,RedisConstant.PIC_ZS_RESOURCES);if(set !=null){for (String picName : set) {QiniuUtils.deleteFileFromQiniu(picName);jedisPool.getResource().srem(RedisConstant.PIC_RESOURCES,picName);}}}
}

清理服务器多余的图片(文件、数据)相关推荐

  1. flask后端接受图片文件数据

    1 代码 @app.route('/predict', methods=['POST']) def predict():# 获取传送过来的完整原始图像file = request.form.get(' ...

  2. vue 虚拟服务器,vue+webpack项目中使用dev-server搭建虚拟服务器,请求json文件数据,实现先后台分离开发...

    在项目开发中,先后台分离,作了假数据,项目使用vue2.0重构,后台也推到重来了,为了避免耽误开发进程,我作了虚拟的数据请求,使用vue-cli脚手架搭建的项目文件中dev-server搭建虚拟api ...

  3. 自己虚拟服务器都用json可以吗,vue+webpack项目中使用dev-server搭建虚拟服务器,请求json文件数据,实现前后台分离开发...

    在项目开发中,前后台分离,做了假数据,项目使用vue2.0重构,后台也推到重来了,为了不耽误开发进程,我做了虚拟的数据请求,使用vue-cli脚手架搭建的项目文件中dev-server搭建虚拟api请 ...

  4. Redis 中的 持久化 RDB持久化 SAVE:阻塞服务器并创建RDB文件 BGSAVE:以非阻塞方式创建RDB文件 通过配置选项自动创建RDB文件

    这里写目录标题 15.1 RDB持久化 15.1.1 SAVE:阻塞服务器并创建RDB文件 其他信息 15.1.2 BGSAVE:以非阻塞方式创建RDB文件 其他信息 15.1.3 通过配置选项自动创 ...

  5. 服务器怎么清除日志文件,如何清理服务器数据库日志文件

    如何清理服务器数据库日志文件 内容精选 换一换 在本容灾方案中,线下的生产数据中心有两台MySQL,需要配置为主备关系,以确保线下仅MySQL故障时,可直接在线下切换到备节点,因此,需要先配置业务端内 ...

  6. 服务器上的此文件夹中具有更多项目,清理或删除“可恢复的项目”文件夹中的项目...

    清理或删除"可恢复的项目"文件夹中的项目 2021/6/1 本文内容 "可恢复的项目"文件夹 (在 Exchange 早期版本中称为垃圾站 ) , 用于防止意外 ...

  7. 图片服务器 文件系统,调研分享:图片文件在各文件系统上的访问性能对比

    1 概述 在某产品线的图片服务器,存放了亿级别的图片文件,每个文件的大小在0.5k-100k之间,其中1K以下的文件数量在50%左右,1-4K文件数量在40%左右,4K以上10%,大量的文件存储对文件 ...

  8. ftp服务器上图片文件显示不出来,ftp服务器上图片文件显示

    ftp服务器上图片文件显示 内容精选 换一换 安装传输工具在本地主机和Windows云服务器上分别安装数据传输工具,将文件上传到云服务器.例如QQ.exe.在本地主机和Windows云服务器上分别安装 ...

  9. Windows微信聊天图片文件的解码和图片、视频占满电脑磁盘空间的清理

    1 问题现象 我的Windows版微信最近老是提示"磁盘空间不足200MB,需及时清理磁盘". 使用文件资源管理器查看我的电脑磁盘使用情况,发现C盘只剩下174MB空间可用.系统盘 ...

最新文章

  1. 同大取大同小取小口诀图解_微信课堂:峦头九星砂体图解
  2. mysql如何让表建立连接吗_MySQL 表与表之间建立关系
  3. 微信支付带动交易超720万元 核销首日武汉人开启“全城用券”模式
  4. linux 临时文件 清理,Linux临时文件的清理
  5. nginx php 104,记一次nginx 502排错经历:recv() failed (104: Connection reset by peer)
  6. sqlserver中系统库的作用
  7. Shell编程—【03】数学运算expr与bc浮点数运算
  8. 两独立样本率的非劣效性试验-样本量计算
  9. LuoguP4568 分层图
  10. 美团2015校园招聘笔试题
  11. javafx 五、网络请求
  12. FPGA SDRAM接口设计(一)初窥门径
  13. P4315 月下“毛景树” 树链剖分+线段树
  14. 2021011086解祎梦实验五
  15. android_驱动_qcom_【高通SDM660平台】(1) ---Bringup Guide
  16. (7)Artemis传输配置
  17. 流量复制导流工具研究
  18. 博客园申请js权限方式
  19. filezilla源码安装教程(含错误信息解决方案)
  20. Linux系统:SSH无密登录配置

热门文章

  1. 基于OpenCV的实时车道线分割&车道保持系统(源码&教程)
  2. ORB-SLAM:精确多功能单目SLAM系统
  3. linux ati显卡驱动下载,教你在Linux中安装ATI显卡驱动(图)
  4. (附源码)python主机硬件配置推荐系统 毕业设计 231155
  5. 【算法模板】轻松学会KMP算法
  6. php 指定大小缩略图片
  7. Pandas 时间序列 - DateOffset 对象
  8. 罗斯蒙特248温度变送器248HANANONS
  9. 保序加密OPE 算法 BCLO09及python仿真
  10. Nginx启动报错:error while loading shared libraries: libpcre.so.1