文档章节

系统中图片上传设计方案

道酬勤
 道酬勤
发布于 2017/05/30 15:44
字数 804
阅读 55
收藏 1
点赞 0
评论 0

       曾做过一些系统,对于图片上传的相关设计有些疑惑,经过后续的各方面研究,现有了能去除心中困惑的解决方案。

先说说以前做系统时遇到的设计问题:

有业务对象A,A中有各种属性,这其中包括附加图片的属性,而A可以关联多张图片。当要新增一个对象A时,怎么保存这些图片信息呢?

当初想到了两个方案:

①在点击保存时,将对象A的全部属性上传,这包括所有图片,然后在后台将所有图片整理后,将对应地址赋值给对象A,最后保存对象A。

②每选择一张图片时,会先上传到服务器,然后返回相关图片地址给前端页面对象,当点击保存时,页面传递的就是对象A所有的属性,此时关联的是图片在服务器的地址,此步骤并没有上传图片。

对于这两种种保存,可能会有失败情况,怎么解决数据的一致性问题?

对于①由于不可能使用事务来确保数据的一致,那么只能使用try catch ,在抛出异常时,进行手动删除相关的图片。对于②同理,在保存对象失败时,根据上传的图片地址进行删除相关数据,但其实还是不能做到100%的确保,比如中途断电情况,这些情况是忽略的,我们能做到的就是尽最大可能做到数据的一致性。

孰优孰劣

其实都不优,两种方案处理数据一致性这个问题上并不好,而且①这种方案可能会存在并发问题。so...我想到了 定时任务 这种方案能解决数据一致性问题。最终方案是在②的基础上增加定时任务,但怎么设计呢?请听吾慢慢分解:

①首先是数据库表的设计:图片对应的表,这里叫image表吧,这个表除了记录图片的一些基本信息,还要增加一个过期时间的字段expired_time,用来记录图片过期的时间。

②在新增一个业务对象A时,每选择一张图片,都会先上传到服务器,然后返回关联的图片对象信息(可以是保存的此条image记录,用于显示到页面,在保存业务对象A时,保存与图片的关联关系)。此过程会保存图片相关基本信息,对于expired_time这个字段的值为当前时间(new Date())。

③在业务对象A保存成功后,注意:需要更新关联的image记录 ,将expired_time设置为空。这两个动作使用事务,若保存失败,则expired_time不为空。

④下面就是开始定时任务了,定时任务在凌晨将过期时间不为空的记录清空,同时删除上传的文件。

到这,以上方案基本很好地解决了图片上传的一些相关问题。enjoy it !

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

© 著作权归作者所有

共有 人打赏支持
道酬勤
粉丝 12
博文 39
码字总数 20898
作品 0
深圳
程序员
构建高可扩Web架构和分布式系统实战(1)

构建可扩展的分布式Web应用程序应遵循可用性、性能、可靠性、可扩展、易管理、成本等这些原则。此外,本文还重点讲解了服务、冗余和分区,希望对你有帮助。 Web分布式系统设计的原则 构建并运...

o0无忧亦无怖 ⋅ 2015/10/10 ⋅ 0

关于推荐系统设计

在我们的系统设计中,推荐的内容主要涉及到两方面:1,为当前用户推荐可能感兴趣的用户;2、使用者推荐可能感兴趣的内容。写这个文章主要是总结一下我们设计中的经验,也可以暴露一下我们的不...

saintatgod ⋅ 2015/12/15 ⋅ 0

构建高可扩Web架构和分布式系统实战

构建可扩展的分布式web应用程序应遵循可用性、性能、可靠性、可扩展、易管理、成本等这些原则。此外,本文还重点讲解了服务、冗余和分区,希望对你有帮助。 开源软件已经成为许多大型网站的基...

Yamazaki ⋅ 2013/01/16 ⋅ 0

Facebook又是如何应对千亿级别的图片存储、每秒百万级别的图片查询?

经典论文翻译导读之《Finding a needle in Haystack: Facebook’s photo storage》 英文原文:Facebook Haystack,编译:ImportNew - 储晓颖 新浪微博:@疯狂编码中的xiaoY 【译者预读】面对...

markYun ⋅ 2013/03/07 ⋅ 0

facebook海量图片存储系统与淘宝TFS系统比较

经典论文翻译导读之《Finding a needle in Haystack: Facebook’s photo storage》 【译者预读】面对海量小文件的存储和检索,Google发表了GFS,淘宝开源了TFS,而Facebook又是如何应对千亿级...

黑白大熊猫 ⋅ 2015/04/07 ⋅ 0

架构设计:系统存储(19)——图片服务器:需求和技术选型(1)

1、概述 图片服务系统是各种针对C端系统常见的子系统,它的特点是存储规模大请求频度高,且单张图片的读请求远远高于写请求。后续几篇文章我们将从图片服务系统的需求分析开始,一起来讨论如...

yinwenjie ⋅ 2017/01/16 ⋅ 0

释放技术的想象:自主可控的电商平台构建之路

欢迎大家前往腾讯云社区 ,获取更多腾讯海量技术实践干货哦~ 过往,大多数依托于第三方平台的电商企业,经常遇到诸如恶性竞争、主导权被分割、平台假货影响厂商形象等问题,极度影响口碑和销...

腾讯云社区 ⋅ 2017/12/13 ⋅ 0

QQ 相册后台存储架构重构与跨 IDC 容灾实践

欢迎大家前往云加社区,获取更多腾讯海量技术实践干货哦~ 作者简介:xianmau,2015 年加入腾讯 TEG 架构平台部,一直负责 QQ 相册平台的维护和建设,主导相册上传架构重构和容灾优化等工作。...

云加社区 ⋅ 2017/12/26 ⋅ 0

海量图片的分布式存储及负载均衡研究(浅析)

摘 要:针对海量图片给网站带来的访问速度下降、性能压力增大和I/O瓶颈等问题,提出一种海量图片的分布式存储及负载均衡技术。通过把图片数据和 网站内容分开部署、在数据库中记录和维护图片服...

liangyx ⋅ 2012/10/07 ⋅ 2

高并发系统中的常见问题

本文一共分析了三个案例,分别介绍并发系统中的共享资源并发访问、计算型密集型任务缓存访问 、单一热点资源峰值流量问题和解决方案。 Q1:订票系统,某车次只有一张火车票,假定有1w个人同时...

fzxu_05 ⋅ 2015/10/14 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

在java中读取文件(也支持读取jar中的文件)

getClass().getResourceAsStream("文件名.格式"); 这个方法是用于获取当前类所在目录下的文件;需要将文件放到和当前类同一个包下面 比如我有个类在 com.test这个包下, 要读取一个test.jpg的图...

太黑_thj ⋅ 50分钟前 ⋅ 0

CentOS 7 源码编译安装 MySQL 5.7记录

没事瞎折腾,本来可以yum安装,却偏偏去要编译源码。 1. 安装依赖包 1). 安装cmake等依赖 # yum install cmake ncurses ncurses-devel bison bison-devel 2). 安装boost 1.59.0 # wget htt...

admin_qing ⋅ 52分钟前 ⋅ 0

tcp/ip详解-链路层

简介 设计链路层的目的: 为IP模块发送和接收IP数据报 为ARP模块发送ARP请求和接收ARP应答 为RARP模块发送RARP请求和接收RARP应答 TCP/IP支持多种链路层协议,如以太网、令牌环往、FDDI、RS-...

loda0128 ⋅ 今天 ⋅ 0

spring.net aop代码例子

https://www.cnblogs.com/haogj/archive/2011/10/12/2207916.html

whoisliang ⋅ 今天 ⋅ 0

发送短信如何限制1小时内最多发送11条短信

发送短信如何限制1小时内最多发送11条短信 场景: 发送短信属于付费业务,有时为了防止短信攻击,需要限制发送短信的频率,例如在1个小时之内最多发送11条短信. 如何实现呢? 思路有两个 截至到当...

黄威 ⋅ 昨天 ⋅ 0

mysql5.7系列修改root默认密码

操作系统为centos7 64 1、修改 /etc/my.cnf,在 [mysqld] 小节下添加一行:skip-grant-tables=1 这一行配置让 mysqld 启动时不对密码进行验证 2、重启 mysqld 服务:systemctl restart mysql...

sskill ⋅ 昨天 ⋅ 0

Intellij IDEA神器常用技巧六-Debug详解

在调试代码的时候,你的项目得debug模式启动,也就是点那个绿色的甲虫启动服务器,然后,就可以在代码里面断点调试啦。下面不要在意,这个快捷键具体是啥,因为,这个keymap是可以自己配置的...

Mkeeper ⋅ 昨天 ⋅ 0

zip压缩工具、tar打包、打包并压缩

zip 支持压缩目录 1.在/tmp/目录下创建目录(study_zip)及文件 root@yolks1 study_zip]# !treetree 11└── 2 └── 3 └── test_zip.txt2 directories, 1 file 2.yum...

蛋黄Yolks ⋅ 昨天 ⋅ 0

聊聊HystrixThreadPool

序 本文主要研究一下HystrixThreadPool HystrixThreadPool hystrix-core-1.5.12-sources.jar!/com/netflix/hystrix/HystrixThreadPool.java /** * ThreadPool used to executed {@link Hys......

go4it ⋅ 昨天 ⋅ 0

容器之上传镜像到Docker hub

Docker hub在国内可以访问,首先要创建一个账号,这个后面会用到,我是用126邮箱注册的。 1. docker login List-1 Username不能使用你注册的邮箱,要用使用注册时用的username;要输入密码 ...

汉斯-冯-拉特 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部