bos物流bos系统当中为什么要用到redis

<< 上一篇: ( 23:40) >> 下一篇: ( 23:47)java远程下载文件到本地
public class getFile {
public static void downloadFile(String remoteFilePath, String localFilePath){
URL urlfile =
HttpURLConnection httpUrl =
BufferedInputStream bis =
BufferedOutputStream bos =
File f = new File(localFilePath);
urlfile = new URL(remoteFilePath);
httpUrl = (HttpURLConnection)urlfile.openConnection();
httpUrl.connect();
bis = new BufferedInputStream(httpUrl.getInputStream());
bos = new BufferedOutputStream(new FileOutputStream(f));
int len = 2048;
byte[] b = new byte[len];
while ((len = bis.read(b)) != -1)
bos.write(b, 0, len);
System.out.println("上传成功");
bos.flush();
bis.close();
httpUrl.disconnect();
catch (Exception e)
e.printStackTrace();
bis.close();
bos.close();
catch (IOException e)
e.printStackTrace();
public static void main(String[] args) {
String remoteFilePath="http://172.18.49.196:9088/easkLogAnalyse/upload/IOS_AUDIT_LOG_53_.log";
String localFilePath="F:/createFile/createFile/IOS_AUDIT_LOG_53_.log";
downloadFile(remoteFilePath,localFilePath);
java远程下载文件传送给前端:
public static void getFile(String remoteFilePath, HttpServletResponse response){
URL urlfile =
HttpURLConnection httpUrl =
BufferedInputStream bis =
BufferedOutputStream bos =
response.setHeader("Content-Disposition", "filename="+ UUID.randomUUID().toString()+".pdf");
//点击会提供对话框选择另存为:
//response.setHeader( “Content-Disposition “, “filename= “+filename);
//通过IE浏览器直接选择相关应用程序插件打开:
//response.setHeader( “Content-Disposition “, “filename= “+fliename)
//下载前询问(是打开文件还是保存到计算机)
//response.setHeader( “Content-Disposition “, “filename= “+filename);
urlfile = new URL(remoteFilePath);
httpUrl = (HttpURLConnection)urlfile.openConnection();
httpUrl.connect();
bis = new BufferedInputStream(httpUrl.getInputStream());
bos = new BufferedOutputStream(response.getOutputStream());
int len = 2048;
byte[] b = new byte[len];
while ((len = bis.read(b)) != -1)
bos.write(b, 0, len);
bos.flush();
bis.close();
httpUrl.disconnect();
catch (Exception e)
e.printStackTrace();
bis.close();
bos.close();
catch (IOException e)
e.printStackTrace();
有个需求是, 从别人服务器上取一张图, 直接让前端下载, 用java简单实现如下:
这是在一个servlet中的(Downloader.java):
利用scp传输文件
1、从服务器上下载文件
scp username@servername:/path/filename
例如scp codinglog@192.168.0.101:/home/...
一、登录远程Linux服务器:
[c:\~]$ sftp root@192.168.233.136
1.1、回车进行认证:
1.2、登录成功:
二、上传文件到服务器:
java下载远程文件到本地
1、获取远程服务器上的文件
scp -P 2222 root@www.vpser.net:/root/lnmp0.4.tar.gz /home/lnmp0.4.tar.gz
上端口大写...
代码块例如:
public Map downloadFileFromFTP(){
Map data = new HashMap();
//获取项目在tomcat部署的路径
java 下载远程电脑文件到本地电脑
package com.cassiatwig.liuliangqianbao.
import org.apache.commons.net.ftp.FTPC
下载文件夹
scp -r root@110.255.255.52:/root/htmltitle (远程目录) 『空格』/Users/xxx/Desktop (本地目录)
安装 SSH(Secure Shell) 服务以提供远程管理服务
sudo apt-get install ssh
SSH 远程登入 Ubuntu 机
ssh username@19...
没有更多推荐了,Jeesz本身集成Dubbo服务管控、Zookeeper注册中心、Redis分布式缓存技术、FastDFS分布式文件系统、ActiveMQ异步消息中间件、Nginx负载均衡等分布式技术
以Spring Framework为核心容器,Spring MVC为模型视图控制器,MyBatis为数据访问层, Apache Shiro为权限授权层,Ehcahe对常用数据进行缓存,Activit为工作流引擎等。
Jeesz主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件、数据权限组件、数据字典组件、核心工具 组件、视图操作组件、工作流组件、代码生成等。采用分层设计、双重验证、提交数据安全编码、密码加密、访问验证、数据权限验证。
后台管理系统包括企业组织架构(用户管理、机构管理、区域管理)、菜单管理、角色权限管理、字典管理等功能;
Quartz定时调度系统可以动态配置您的任务规则等;
内容管理(CMS)系统,包括内容管理,栏目管理、站点管理、公共留言、文件管理、前端网站展示等功能;
Jeesz提供了常用工具进行封装,包括日志工具、缓存工具、服务器端验证、数据字典、当前组织机构数据(用户、机构、区域)以及其它常用小工具等。另外 还提供一个强大的在线 代码生成 工具,此工具提供简单的单表、一对多、树结构功能的生成,如果对外观要求不是很高,生成的功能就可以用了。使用了Jeesz基础框架,可以提高快速开发效 率。
1.用户管理:用户是系统操作者,该功能主要完成系统用户配置。
3.区域管理:系统城市区域模型,如:国家、省市、地市、区县的维护。
5.角色管理:角色菜单权限分配、设置角色按机构进行数据范围权限划分。
7.操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
9.工作流引擎:实现业务工单流转、在线流程设计器。
1.Eclipse IDE:采用Maven项目管理,模块化。
技术选型(只列了一部分技术)
服务框架:Dubbo、zookeeper、Rest服务
消息中间件:ActiveMQ
分布式文件:FastDFS
核心框架:Spring framework
视图框架:Spring MVC 4.0
布局框架:SiteMesh 2.4
任务调度:quartz 1.8.5
日志管理:SLF4J 1.7、Log4j
CSS框架: Bootstrap 4 metronic
富文本:CKEcitor
动态页签:Jerichotab
对话框:jQuery jBox
其他组件:Bootstrap 4 metronic
服务器中间件:Tomcat 6、7、Jboss 7、WebLogic 10、WebSphere 8
支持开发环境:Eclipse、MyEclipse、Ras、Idea等
愿意了解框架技术或者源码的朋友直接求求交流分享技术:
分布式的一些解决方案,有愿意了解的朋友可以找我们团队探讨
更多详细源码参考来源:
DUBBO+SPRINGMVC+MYBATIS+EHCACHE+REDIS J2EE分布式架构
DUBBO+SPRINGMVC+MYBATIS+EHCACHE+REDIS J2EE分布式架构
标签: dubbo+springmvc+mybatis+ehcache+redis J2ee分布式架构...
基于 Mybatis 和 Springboot 的后台管理系统 BootDo | 软件推介
BootDo是高效率,低封装,面向学习型,面向微服的开源Java EE开发框架。
BootDo是在SpringBoot基础上搭建的一个Java基础开发平台,MyBatis为数据访...
摘要: 主要定位于互联网企业架构,已内置企业信息化系统的基础功能和高效的代码生成工具,包括:系统权限组件、数据权限组件、数据字典组件、核心工具 组件、视图操作组件、工作流组件、代码生成等。采用分层设计...
JEESZ是一个大型分布式的面向服务的JavaEE体系快速研发平台,基于模块化、服务化、原子化、热插拔的设计思想,使用成熟领先的无商业限制的主流开源技术构建。 采用服务化的组件开发模式,可实现复杂的业...
这里我主要就介绍下ehcache如何集成mybatis和
上一篇博文:SpringMVC+Spring+Mybatis+Freemarker集成前言:上一篇博文已经介绍了SpringMVC、Spring、Mybatis、Freemarker的集成,接下来就在...
没有更多推荐了,京东物流系统架构演进中的最佳实践
来源:彗星计划
青龙系统发展历程
青龙系统从2012年开始1.0的封闭开发,到2016年规划的6.0智慧物流,基本打造了一套完善的电商物流系统。
青龙系统1.0,主要实现了电商物流基础功能,满足了但是的核心业务诉求。青龙系统1.0上线,被京东当年评为优秀项目,成功之处就是比较好的遵循了MVP原则,也就是最初的版本只实现最有价值的部分。在著名的《人月神话》中,多次提到第二次开发系统失败的案例,最重要的原因就是,大家对于第二次开发的系统寄予了太多的希望,而项目负责人也给予了太多的承诺,时间等诸多问题,让项目走向失败,这个在中国互联网系统重构的案例中也可以找到。当时,青龙项目和业务负责人,都还是有比较清醒的认识,基本没有增加特别多的需求。项目组利用半年封闭完成开发,再用半年完成全国推广上线,完全替代了老系统。青龙系统是基于Java的SOA理念来开发,而老的系统是.net
,这也就是造成是完全重新开发,而不是平滑升级,付出代价也是很大的。
青龙系统2.0,起于2013年,主要是追赶功能。因为2012年开发新系统,业务方的新需求较少支持,也积压了非常多的需求,也非常感谢业务方的支持。团队利用一年的时间,完成了两年业务开发,也是非常给力,和业务方也构建了非常信任的伙伴关系,为后续系统健康发展,奠定了很好的基础。到2.0完成开发时,青龙系统已经成为完善的自营电商物流系统。
2014年,我们规划3.0时,也有些迷茫,因为系统已经比较完善了,该向何处去是个问题。这时候,公司推动了物流开放的战略,希望利用京东物流的优势,来带动POP平台体验的提升,因此,我们抓住机会,确立了以外单开放为主题。我们开发了青龙开放平台,接单系统,和主流的ISV软件完成对接,以及改造现有分拣,运输,配送等环节,来支持外单。因为符合公司战略,业绩还是不错,当年双十一的时候,外单量也突破了60万单。这给我们很大的经验就是研发的方向,要符合公司战略,获得运营团队支持,才能形成合力,共同推动业务成功,否则,即使做出很炫的系统,也会因为没有用户而夭折。
2015年,团队也比较成熟,公司的战略是渠道下沉,3F等,我们也据此确定5.0主题是渠道下沉,配合公司战略,从零开始,构建了京东乡村推广员系统和校园派系统。年底,乡村和校园业务,都成为年会的明星,我们也获得了很大的认可。
从2015年开始,互联网+提升到国家战略层面,物流也越来越受到重视,互联网+物流,能做的事情越来越多。因此,到2016年,我们规划青龙系统6.0的时候,把主题确定为智慧物流,也就顺理成章了。
青龙系统发展到今天,已经包含了分拣中心,运输路由,终端,对外拓展,运营支持等五十余个核心子系统,构建了完善的电商物流体系。
青龙系统架构最佳实践
青龙系统架构演进过程中,从高可用,高性能,数据一致性,用户体验四个方面,积累了丰富的经验,确保了青龙系统在发展过程赢得了公司内外的口碑。
每年“双十一”都是网购狂欢节,假设当天哪个电商系统出现系统不可用,那几乎是灾难性的,不仅会导致用户快速流失,而且,公司将承受重大损失,甚至在未来竞争中失败。即使对于创业公司,在当前获取用户如此昂贵和竞争如此激烈的情况下,系统不可用的代价也是非常大的,会遭到用户的抛弃而失败。
青龙系统作为京东后台物流系统,系统高可用也同样重要,因为,即使在平时,物流系统出现不可用的情况,会造成订单时效履约失败,极大影响用户体验,这也是无法接受的;同时,系统不可用也会导致数十万员工无法正常工作,对于效率极大影响,公司损失也非常大。我们在研发过程中,对于系统高可用,也积累了丰富经验,主要包括:合适的架构方案;大系统小做,服务拆分;并发控制,服务隔离;灰度发布;全方位监控报警;核心服务,平滑降级。
首先是选择合适的架构方案。互联网系统一般可以分为前端应用系统和后端数据库系统,前端应用系统实施分布式集群部署技术上是比较成熟的,后端数据库系统实现异地多活技术难度很大,目前也只有阿里,京东这样的公司才真正实现。因此,对于大多数应用,前端应用双机房集群部署,后端数据库系统采取成熟的主备从的模式,也就是单个机房作为写入,备库在另外机房,可以快速进行切换,读库双机房部署,是优选的方案。对于这个架构方案,存在跨机房写延长的问题,可以根据场景利用异步的方式进行解决,一般也是没有问题的。对于青龙系统来讲,也有些特别,利用分拣中心的本地服务器和操作人员的设备,实现离线生产,进一步提高可用性。
大系统小做,服务拆分,是互联网应用的特点,也符合敏捷交付的理念。对于传统软件,如Windows,Office等,都要经过一个漫长的需求,研发,测试,发布周期,在“唯快不破”的互联网时代,这显然是无法满足业务要求的,即使最后上线,也可能因为周期太长而不再适用了。因此,对一个互联网服务,一般会首先完成最核心的功能,快速进行上线,不断进行迭代,后续再进行辅助功能跟进。对于核心功能,随着用户数的增加,会不断进行服务拆分,如何进行拆分,拆分到什么样的粒度,是不是微服务是解决问题的银弹?这些都要根据实际的应用场景来评估,绝不是越细越好,而是要达到一个优雅的平衡。
并发控制,服务隔离。并发控制,现在已经成为互联网服务基本要求,在应用程序端和数据库端,也都有成熟的方案,如果忽略,可能造成灾难性的后果。对于重要的服务,还要进行隔离,例如同一个服务,要提供给内部调用,公司级调用和公司外开放服务调用,开放服务调用者我们一般认为是不可靠的,甚至有可能是恶意的,如果不进行隔离,开放服务调用有可能使得服务资源占满,对内也无法提供服务。从技术上,可以是硬件级隔离,全部隔离,也可以是前端应用的隔离。
灰度发布也是互联网服务的一大利器,有了灰度发布,才使得快速迭代成为可能,并且,很多服务因为各种原因线下也是很难测试的,只能在线上测试。如果没有灰度发布,只能全量发布,就存在较长测试周期问题,如果没有重复勉强上线,就存在很大的系统崩溃的风险。按照用户,区域进行灰度发布是比较常用的方法。
全方位监控报警,可以分为技术层面和业务层面,技术层面包括对CPU,内存,磁盘,网络等的监控,业务层面,包括对处理积压量,正常的业务量等。做到全方位监控,才有可能在影响用户之前,提前解决问题,提升系统可用性。否则,等用户发现问题,在很大的压力下,技术团队更难处理,导致系统不可用时间加长。
最后就是,核心服务,平滑降级。任何技术手段,都不可能保障100%可用,并且,即使能够做到,其代价也是巨大,不经济的,因此,对于核心服务来讲,能够平滑进行降级,提供基础的服务,也是非常重要的。对于青龙系统来讲,就利用分拣中心本地服务器和操作人员的设备,研发了离线生产系统,来应对集中服务万一不可用的情况。
举两个案例来做简单说明。
第一个是电子签收的案例。电子签收对于京东物流意义重大,不仅提升效率降低成本,而且实现了所有业务数据化,为智慧物流奠定基础。我们最早做的时候,也是遵循了MVP原则,开发了一个很简单的原型系统,内部测试可行后,才进行第二步,也就是和京东云合作,接入京东云图片处理系统,支持百亿张图片存储,找到安全认证伙伴,接入安全认证服务。这些完成后,我们就开始线上测试,不断提升用户体验。第三部,在大规模推广之前,我们完成了系统降级服务,也就是确保京东云,安全认证服务,甚至,我们自身的电子签收管理系统不可用的情况下,如何保证配送员的业务不受到影响。
第二个案例是去IOE的案例。青龙系统最初也是基于IOE开发,后来,随着系统规模的扩大,去IOE成为必然,在整个过程中,我们也是遵循了很多架构实践。例如,第一步,我们是先去IE(IBM小型机和EMC存储),将核心业务系统库拆到Oracle PC服务器上,并且,将数据进行同步,在验证服务完成后,把读服务迁到小型机,稳定后,再迁全部服务,并且,保证服务可以随时迁回。第二步,我们开发了双写服务,逐步将Oracle,迁移到MySQL集群。第三步,完成MySQL的数据聚合,确保数据服务。在整个过程中,都确保了系统在任何情况下,都可以会退,确保业务正常。
对应互联网服务来说,高性能是必须的,用户的响应一般都要求是秒级,而一个用户操作都包含多个服务调用,对应服务接口响应的要求都是毫秒级。对应青龙系统来讲,支持物流操作人员有十万余人,每个操作提升一秒,那么就能节约三个人员,意义是非常大的。
如何提高性能,接口数据缓存化是非常重要的手段。青龙系统属于后台操作型系统,业务逻辑复杂,如果不能缓存,完全依靠数据库操作,那么,响应会超过数十秒。如何进行缓存,需要设计缓存系统进行支撑,青龙系统在演进过程中,依托公司的缓存服务,并且结合应用内存,包括Redis消息通知体系,构建了具有自己特色的缓存体系,很好的支撑了业务发展,案例结构如下图。
大型互联网服务,一般都微服务化了,这样意味着一个用户操作,都是由多个服务接口支持,如果按照传统的同步接口设计,那么,不仅面临性能问题,而且,QPS也是无法满足的,因此,需要将同步接口调用异步化。在2012年左右,eBay就提出所有系统调用异步化,后面,几乎所有大型互联网公司,都对自身系统进行了异步化改造,并且,取得了很好的效果,在和腾讯CTO
Tony交流中,他就提出即使支付这种服务,也是有办法进行异步化设计的。同步接口异步化,也是需要系统工具支持的,青龙系统在发展过程中,也发展了基于Redis的分布式调度系统,架构参考下图:
做大了缓存和异步化,系统性能会有很大的提升。对应青龙系统这样的大型互联网服务,对应核心服务要求是非常高的,同时,又有数量非常多的非核心服务,如果不能进行主次服务分离化,那么意味着如果要提升核心服务水平,增加服务器,那么,就需要为所有的服务进行扩容,这样是不经济的。因此,系统需要精心设计,做到核心服务和非核心服务分离,给核心服务提供充足的资源,确保核心服务的性能。
数据一致性
数据服务,对于大型互联网应用,已经变为非常核心,称为系统的大脑也不为过。
我们一般需要考虑实时性和一致性,这两个最重要的维度,当然,数据量也是一个维度,一般我们认为是大数据的应用场景。
这样,我们就能分为四个基本的场景:高实时性/高一致性,高实时性/低一致性,低实时性/高一致性,低实时性/低一致性。针对具体的业务,我们可以匹配到具体的数据场景,这样,我们就能找到对应的解决方案。在这个过程中,客观的进行业务分析非常重要,并不是,选择高实时性/高一致性是最优方案,因为这个方案的实现成本是最昂贵的,可能是不经济,也没有必要的。
实时&强一致场景:这个在大数据技术成熟之前,是非常棘手的,但是,现在解决方案已经比较成熟了。典型应用是生产系统的实时监控,例如实时生产量,各个生产环节差异量等,其实是作为生产系统的一部分。利用当前主流的大数据处理架构是可以解决的,例如线上生产库binlog实时读取,Kafaka进行数据传输,Spark进行流式计算,ES进行数据存储等。如果利用传统的ETL抽取方案来解决,频繁对生产数据库进行抽取,并不是可行的方案,因为,这样会极大的影响线上OLTP系统的性能。还可以举一个生产系统实时监控案例,架构方案是应用系统完成写数据库的同时,把内容通过消息发送,后面的大数据处理系统接收消息来进行处理,这个架构方案,对于实时性某种程度上可以保障,但是,也存在效率问题,但是,对于强一致性就非常不合适了,因为消息系统如ActiveMQ等不仅无法保障消息数据不能丢失,而且对应消息顺序也是无法保障,项目实施后,虽然采取了很多补救措施,也无法满足强一致性需求,不得不重起炉灶。
实时&弱一致性场景:典型的应用场景是消息通知,例如电商的全程跟踪消息,如果个别数据出现丢失,对于用户的影响并不大,也是可以接受的,因此,可以采用更加廉价的解决方案,应用完成对应的动作后,将消息发出即可,使用方订阅对应的消息,按照主键,如订单号,存储即可。
离线&强一致场景:这是典型的大数据分析场景,也就是众多的离线报表模式。从技术上,传统的ETL抽取技术也能满足要求,数据仓库对应的技术也能够解决。
离线&弱一致场景:对于抓取互联网数据,日志分析等进行统计系统,用于统计趋势类的应用,可以归为此类,这类应用主要是看能够有足够廉价的方案来解决,是不是可以巧妙的利用空闲的计算资源。这个在很多公司,利用晚上空闲的计算资源,来处理此类的需求。
以上讨论的都是大数据应用,也就是从数据量大的应用场景。但是,对应现实中很多数据处理系统来讲,例如很多B2B业务系统,或者传统行业,其实是数据量并大,那么采用更加廉价的OLTP的方法,例如复制读库等,也是可以完成对应的工作的。
因此,架构设计应当针对具体应用场景的,满足当前业务的发展需求,可以考虑两年的需求,最合适的架构就是最好的,而不存在放之四海都是最好的架构设计。不分析清楚自己的应用场景,盲目照抄大公司的技术架构,显然也是不合适的。当然,如果选择的架构本身,不能满足应用场景的需求,后续,不论进行多少补救,依然无法满足需求,并且,架构会变得异常复杂,替换的成本也将是非常高昂,不得不慎重。
京东是非常重视用户体验的公司,老刘就明确指出任何人不能对用户体验提升的意见说No。青龙系统在研发过程中,我们认为MVP原则和动态运营是非常重要的。
MVP原则,也就是敏捷开发中的迭代思路。对应一个大的项目,按照传统的瀑布模型,一般经历设计,研发,测试到最后上线阶段,这对于互联网应用来说,很多情况下是不能接受的,因为业务需求变化太快,如果上线周期太长,也许上线后发现情况已经变化了,或者,上线后发现不能落地推广。因此,对应一个大项目,一般会进行迭代分解,最核心的需求,会优先开发,并完成上线,上线验证后,继续开发优先级低的需求。
动态运营,其实也和MVP原则有很强的联系,也就是功能上线后,要真正运营起来,看具体数据,如果发现和设计不符合,那么,就要进行调整,到符合用户需求。这也是互联网服务的用户体验,要优于传统的软件开发系统,传统软件开发基本上上线后就不在优化了,而对于互联网服务来说,上线只是开始,只有将这个功能运营好,才叫好,并且,这个过程一直是持续的。
对于如何打造一个高可用的互联网系统,上面很多点大家都知道,包括高可用,高性能,数据一致性和用户体验,关键是如何落实和做到极致,就如大家都学习乔布斯,但是,能够真正把产品做到极致的还是凤毛麟角。
版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。
京东架构专家分享京东架构之路
京东咚咚架构演进咚咚是什么?咚咚之于京东相当于旺旺之于淘宝,它们都是服务于买家和卖家的沟通。 自从京东开始为第三方卖家提供入驻平台服务后,咚咚也就随之诞生了。 我们首先看看它诞生之初是什么样的。1.0...
Redis 高可用架构最佳实践
http://www.sohu.com/a/5802
2017 年 5 月 13 日,应用性能管理大讲堂广州站圆满落幕,其中来自三七互娱的 DBA 温...
解构京东智慧物流:智能化设备+大数据技术
解构京东智慧物流:智能化设备+大数据技术
无人机送货技术是京东物流近期的一项重点工作,但无人机只是京东探索智慧物流体系的一部分工作。日前,京东集团运营研发部总监、京东物流系统(内...
京东物流系统自动化运维平台技术揭密
作者:赵玉开,十年以上互联网研发经验,2013年加入京东,在运营研发部任架构师,期间先后主持了物流系统自动化运维平台、青龙数据监控系统和物流开放平台的研发工作,具有丰富的物流系统业务和架构经验。在此之...
【揭密:刘强东9年密谋的商业布局—京东快物流背后的核心技术盘点】
黄刚-物流与供应链
阅读数:4865
首次全面盘点刘强东9年物流布局,全面梳理...
各电商的市场的市场份额:市场前景:随着物流的产业和互联网的快速发展以及智能手机普及,网购的产品种类日益丰富,网上购物成为了人们的一种生活方式。网上购物不仅不需要出门可以选购自己所需要的产品,还可能节约...
来源 | 罗戈研究院平台基于个人消费习惯进行智能推荐商品、定制化门槛不再高,交易可以通过移动端应用完成、交付逐渐快至半小时……这个世界正在因“数”发生巨大的变化:o 一切都在数字化o 一切都将通过云共...
(作者:@黄刚 )未来3年后的中国物流生态是怎的?这个话题值得很多人关注。因为可以大胆的预测,未来3年中国物流大生态会发生巨大的变革,关键因素就是:互联网。,过去...
没有更多推荐了,在上一篇文章中已经讲了redis的spring配置,这篇将会描述redis在java项目中的使用。
redis存储形式都是key-value(键值对),按照存储的内容分为两种,一种是存简单数据,即数字,字符串等,可以用string-value的形式存储;另一种是存对象、集合等,最好用序列化的方式来存储。
1、存储简单数据
Jedis jedis = new Jedis();
jedis.set("name", "JackGSmith");
} catch (Exception e) {
//如果缓存连不上,则不处理
System.out.println("登录无法更新该用户缓存");
从redis缓存中获取key为“name”的值,使用jedis.get("name"),用一个String变量接收即可。
2、存储对象、集合
存对象集合用序列化的方式存储,用反序列化的方式取值。存储的key和value都是转化成字节码的形式。
先定义一个抽象类:SerializeTranscoder.java,代码如下:
package cn.com.taiji.sample.
import java.io.C
import java.io.IOE
public abstract class SerializeTranscoder {
public abstract byte[] serialize(Object value);
public abstract Object deserialize(byte[] in) throws IOE
public void close(Closeable closeable) {
if (closeable != null) {
closeable.close();
} catch (Exception e) {
e.printStackTrace();
再建一个序列化的类,ObjectTranscoder.java,继承上面这个抽象类,该类是用来序列化存储对象用的,代码如下:
package cn.com.taiji.sample.
import java.io.ByteArrayInputS
import java.io.ByteArrayOutputS
import java.io.IOE
import java.io.ObjectInputS
import java.io.ObjectOutputS
import java.io.S
public class ObjectTranscoder&M extends Serializable& extends SerializeTranscoder{
@SuppressWarnings("unchecked")
public byte[] serialize(Object value) {
if (value == null) {
throw new NullPointerException("Can't serialize null");
byte[] result = null;
ByteArrayOutputStream bos = null;
ObjectOutputStream os = null;
bos = new ByteArrayOutputStream();
os = new ObjectOutputStream(bos);
os.writeObject(m);
os.close();
bos.close();
result = bos.toByteArray();
} catch (IOException e) {
throw new IllegalArgumentException("Non-serializable object", e);
} finally {
close(os);
close(bos);
@SuppressWarnings("unchecked")
public M deserialize(byte[] in) {
M result = null;
ByteArrayInputStream bis = null;
ObjectInputStream is = null;
if (in != null) {
bis = new ByteArrayInputStream(in);
is = new ObjectInputStream(bis);
result = (M) is.readObject();
is.close();
bis.close();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
close(is);
close(bis);
接着在新建一个ListTranscoder.java文件,用来序列化存储List(集合)对象,基本同上,代码如下:
package cn.com.taiji.sample.
import java.io.ByteArrayInputS
import java.io.ByteArrayOutputS
import java.io.IOE
import java.io.ObjectInputS
import java.io.ObjectOutputS
import java.io.S
import java.util.ArrayL
import java.util.L
public class ListTranscoder&M extends Serializable& extends SerializeTranscoder {
@SuppressWarnings("unchecked")
public List&M& deserialize(byte[] in) throws IOException {
List&M& list = new ArrayList&&();
ByteArrayInputStream bis = null;
ObjectInputStream is = null;
if (in != null) {
bis = new ByteArrayInputStream(in);
is = new ObjectInputStream(bis);
while (true) {
M m = (M)is.readObject();
if (m == null) {
list.add(m);
is.close();
bis.close();
} catch (Exception e) {
e.printStackTrace();
is.close();
bis.close();
@SuppressWarnings("unchecked")
public byte[] serialize(Object value) {
if (value == null)
throw new NullPointerException("Can't serialize null");
List&M& values = (List&M&)
byte[] results = null;
ByteArrayOutputStream bos = null;
ObjectOutputStream os = null;
bos = new ByteArrayOutputStream();
os = new ObjectOutputStream(bos);
for (M m : values) {
os.writeObject(m);
results = bos.toByteArray();
os.close();
bos.close();
} catch (IOException e) {
throw new IllegalArgumentException("Non-serializable object", e);
} finally {
close(os);
close(bos);
现在,就可以用序列化的方式存储对象或集合了:
Jedis jedis = new Jedis();
List&SystemNotice& noticeList = systemNoticeManager.listQuery(noticeQModel);
if(noticeList.size()&0 && noticeList != null){
ListTranscoder&SystemNotice& listTranscoder = new ListTranscoder&SystemNotice&();
jedis.set(loginUser.getId().getBytes(), listTranscoder.serialize(noticeList));
} catch (Exception e) {
//如果缓存连不上,则不处理
System.out.println("登录无法更新该用户缓存");
存的key使用用户id,所以取出list就很简单了:
Jedis jedis = new Jedis();
byte[] list = jedis.get(loginUser.getId().getBytes());
ListTranscoder&SystemNotice& listTranscoder = new ListTranscoder&SystemNotice&();
List&SystemNotice& newList = listTranscoder.deserialize(list);try {
  responseJson(JsonTools.toJsonStr(newList), response);
} catch (IOException e) {
e.printStackTrace();
至此,redis在java项目中的使用就到此结束了。关于redis的其他命令,可以自己去百度下。
阅读(...) 评论()

我要回帖

更多关于 ssh框架的物流bos系统 的文章

 

随机推荐