这道算法题该怎么做?java实现

从享受生活的角度上来说:“程序员并不是一种最好的职业,我认为两种人可以做程序员,第一,你不做程序员,你就没有什么工作可做,或者说是即使有可以做的工作但是你非常不愿意去做;第二,你非常痴迷和爱好程序,并且在这方面有一些天赋和优势。程序员的结局也是有两种:第一,默默退休,第二以程序员为起点或跳板,注意积累,跟对了好的老板或团队,找到和很好的搭档自己创业,成为IT金领和富翁。”

人们在时间面前是平等的,吾生也有涯,所以,你的经验更丰富点,那不算什么,经验是用时间积累的,你一生只有那么多时间,你能积累多少经验呢?最重要的是你的学习能力和学习方法,这个发挥的能量可以有很大差异,要提高学习能力和学习方法首先要学会思考和总结,要学会掌握事物的根本性的东西,而不是一些表面的细节。学习方法和学习能力对于IT工作者来说尤为重要,因为IT行业技术更新太快,并且细节太多,同一个技术的细节变来变去也是常有的事情,所以,IT技术学习者绝不能照着书籍和老师的讲解死记硬背和生搬硬套。搞IT工作很累人,如果学习方法不对、学习能力不强,那就更累了,不过,这怨不得别人,你的学习方法和学习能力只适合做刷盘子的工作,却非要跑到程序员圈子里来混,那谁能有办法拯救你!

在没有人指引的情况下,只能是自己一个知识点、一个知识点地漫无目的学习,等到积累了足够的知识量后,才有能力开始思考和琢磨原理方面的问题,这个学习过程很漫长。如果能在好老师的指引下,老师会启发你先思考原理问题,然后再去学习一个具体的知识点,让你能够举一反三、触类旁通,这样的学习效率就会更高。

多学了几个知识,并不能说明你就很厉害了,只能说是你比别人投入了更多的时间和精力而已,别人想做也能做到!不是你学了多少知识就算厉害了,关键是要用好学到的知识,要让学到的知识发挥出最大的社会价值和经济价值,这才是最厉害的。

另外,一个人的未来和造化,会深受环境的影响,所谓孟母三迁,近朱者赤、近墨者黑的大大道理,这些典故大家不一定能深刻领悟和感受,我们就不多说了。就拿现代比较接近我们生活的事例来说,如果你周围的朋友全是以擦皮鞋为生、每月辛辛苦苦下来就挣1500元,那么估计你的职业也是跟着擦皮鞋了,即使你再聪明和再勤奋,顶多每月比你那帮朋友多挣300元,合下来也就区区1800元/月。前几年只要抓住了大势,没钱全部找银行贷款了在北京买房、到山西开煤矿,是头猪也能每年大把大把地捞钱,如果你周围的朋友全是投机倒把的买房和开煤矿者,你的职业自然也是与他们干同样的事情,即使你再差,每年也能挣到百来万不成问题,这就是环境的重要性。聪明的你因为没有机会置身于炒房团中,比那些有机会接触炒房者的猪挣得就要少、就要累。到传智播客的环境中来,你就很有机会拿到高薪了,你可以不参加传智播客的培训,但只要想办法与传智播客的学员们住在一起,成功的机会就大多了。

自从我们开设3G的课程后,许多学员都找到了月薪在7k或更高的3g开发工作,这是他们的能力还完全不能与之相称的一份好工作,这些学员眼看到嘴的肥肉又舍不得放弃,最后就害苦我们这些老师了,学员纷纷把他们面试和工作中的要解决的问题带回来让我们老师帮助做,有些问题虽然老师能做,但也是要花费很大的时间和精力才能做的,这相当于学员把自己的工作交给我们老师替他去干了,可不是一句话两句话就解决的问题。哀哉!我们老师自己还有很繁重的备课和教学任务,我们的工作请谁来帮助做呢?同学们似乎没有替我们想过这个问题。

一个两个学员偶尔回来这么干还可以,但架不住一批批的学员都来这么干,加上有的学生还不太会说话,让人很无奈:

“很简单的,顶多占用你一个小时就搞定了!”,这么简单,你为何自己不干啊?

“今天晚上你必须做出来,明天就要交上去了”,哎,我再熬夜命都要丢了,老婆就要来砸电脑了,你叫我怎么办啊?

“你没时间干,那你吩咐其他老师干,也可以啊!”,当老师都是我的奴隶,我随时随地叫他们干啥,他们就干啥吗?老师能把教学做好,就很给我面子了。

现在这些公司怎么都越来越狡猾了,他们把日后工作中要解决的问题、并且是他们自己都很难解决的问题拿出来让面试求职者去搞,不管面试求职者的水平怎样,他们都说谁能搞定,谁就来上班,我们学生很高兴,不管自己水平是否适合做这份工作,反正有传智播客的老师可以依靠,拿回来就让我们做,还说“做好了就有高薪工作,这关于我一辈子的幸福,老师你自己看这个忙帮不帮吧?”,软件公司这招够狠!我们这批老师成了这些公司免费使用的超级劳工。如果奥巴马说你能把伊拉克摆平,我就让你当伊拉克总统,这个奥巴马都摆不平的事情,但因为做完了就可以当伊拉克总统,我们学生也可能拿回来让我们帮助做,让我们帮他摆平伊拉克,这对我们来说也是很难很难的事情啊。



另外两种方式都由依赖,第一个直接依赖于目标类,第二个把依赖转移到工厂上,第三个彻底与目标和工厂解耦了。在spring的配置文件中配置片段如下:

  C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好.

  B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子

  C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统

  B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.

  C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统

  B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小.

  C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高

  B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本.

  C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低

  B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更像交易中心。

32、应用服务器有那些?

一个另类的回答:j2ee就是增删改查。

67、J2EE是技术还是平台还是框架? 什么是J2EE

J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。

95、请对以下在J2EE中常用的名词进行解释(或简单描述)

web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。

EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。

JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。

JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。

JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。

JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。

RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。

(这个问题不作具体回答,列出来只是告诉读者可能会遇到什么问题,你不需要面面俱到,什么都精通。)

81、如何设定的weblogic的热启动模式(开发模式)与产品发布模式?

可以在管理控制台中修改对应服务器的启动模式为开发或产品模式之一。或者修改服务的启动文件或者commenv文件,增加set PRODUCTION_MODE=true。

82、如何启动时不需输入用户名与密码?

修改服务启动文件,增加 WLS_USER和WLS_PW项。也可以在

从享受生活的角度上来说:“程序员并不是一种最好的职业,我认为两种人可以做程序员,第一,你不做程序员,你就没有什么工作可做,或者说是即使有可以做的工作但是你非常不愿意去做;第二,你非常痴迷和爱好程序,并且在这方面有一些天赋和优势。程序员的结局也是有两种:第一,默默退休,第二以程序员为起点或跳板,注意积累,跟对了好的老板或团队,找到和很好的搭档自己创业,成为IT金领和富翁。”

人们在时间面前是平等的,吾生也有涯,所以,你的经验更丰富点,那不算什么,经验是用时间积累的,你一生只有那么多时间,你能积累多少经验呢?最重要的是你的学习能力和学习方法,这个发挥的能量可以有很大差异,要提高学习能力和学习方法首先要学会思考和总结,要学会掌握事物的根本性的东西,而不是一些表面的细节。学习方法和学习能力对于IT工作者来说尤为重要,因为IT行业技术更新太快,并且细节太多,同一个技术的细节变来变去也是常有的事情,所以,IT技术学习者绝不能照着书籍和老师的讲解死记硬背和生搬硬套。搞IT工作很累人,如果学习方法不对、学习能力不强,那就更累了,不过,这怨不得别人,你的学习方法和学习能力只适合做刷盘子的工作,却非要跑到程序员圈子里来混,那谁能有办法拯救你!

在没有人指引的情况下,只能是自己一个知识点、一个知识点地漫无目的学习,等到积累了足够的知识量后,才有能力开始思考和琢磨原理方面的问题,这个学习过程很漫长。如果能在好老师的指引下,老师会启发你先思考原理问题,然后再去学习一个具体的知识点,让你能够举一反三、触类旁通,这样的学习效率就会更高。

多学了几个知识,并不能说明你就很厉害了,只能说是你比别人投入了更多的时间和精力而已,别人想做也能做到!不是你学了多少知识就算厉害了,关键是要用好学到的知识,要让学到的知识发挥出最大的社会价值和经济价值,这才是最厉害的。

另外,一个人的未来和造化,会深受环境的影响,所谓孟母三迁,近朱者赤、近墨者黑的大大道理,这些典故大家不一定能深刻领悟和感受,我们就不多说了。就拿现代比较接近我们生活的事例来说,如果你周围的朋友全是以擦皮鞋为生、每月辛辛苦苦下来就挣1500元,那么估计你的职业也是跟着擦皮鞋了,即使你再聪明和再勤奋,顶多每月比你那帮朋友多挣300元,合下来也就区区1800元/月。前几年只要抓住了大势,没钱全部找银行贷款了在北京买房、到山西开煤矿,是头猪也能每年大把大把地捞钱,如果你周围的朋友全是投机倒把的买房和开煤矿者,你的职业自然也是与他们干同样的事情,即使你再差,每年也能挣到百来万不成问题,这就是环境的重要性。聪明的你因为没有机会置身于炒房团中,比那些有机会接触炒房者的猪挣得就要少、就要累。到传智播客的环境中来,你就很有机会拿到高薪了,你可以不参加传智播客的培训,但只要想办法与传智播客的学员们住在一起,成功的机会就大多了。

自从我们开设3G的课程后,许多学员都找到了月薪在7k或更高的3g开发工作,这是他们的能力还完全不能与之相称的一份好工作,这些学员眼看到嘴的肥肉又舍不得放弃,最后就害苦我们这些老师了,学员纷纷把他们面试和工作中的要解决的问题带回来让我们老师帮助做,有些问题虽然老师能做,但也是要花费很大的时间和精力才能做的,这相当于学员把自己的工作交给我们老师替他去干了,可不是一句话两句话就解决的问题。哀哉!我们老师自己还有很繁重的备课和教学任务,我们的工作请谁来帮助做呢?同学们似乎没有替我们想过这个问题。

一个两个学员偶尔回来这么干还可以,但架不住一批批的学员都来这么干,加上有的学生还不太会说话,让人很无奈:

“很简单的,顶多占用你一个小时就搞定了!”,这么简单,你为何自己不干啊?

“今天晚上你必须做出来,明天就要交上去了”,哎,我再熬夜命都要丢了,老婆就要来砸电脑了,你叫我怎么办啊?

“你没时间干,那你吩咐其他老师干,也可以啊!”,当老师都是我的奴隶,我随时随地叫他们干啥,他们就干啥吗?老师能把教学做好,就很给我面子了。

现在这些公司怎么都越来越狡猾了,他们把日后工作中要解决的问题、并且是他们自己都很难解决的问题拿出来让面试求职者去搞,不管面试求职者的水平怎样,他们都说谁能搞定,谁就来上班,我们学生很高兴,不管自己水平是否适合做这份工作,反正有传智播客的老师可以依靠,拿回来就让我们做,还说“做好了就有高薪工作,这关于我一辈子的幸福,老师你自己看这个忙帮不帮吧?”,软件公司这招够狠!我们这批老师成了这些公司免费使用的超级劳工。如果奥巴马说你能把伊拉克摆平,我就让你当伊拉克总统,这个奥巴马都摆不平的事情,但因为做完了就可以当伊拉克总统,我们学生也可能拿回来让我们帮助做,让我们帮他摆平伊拉克,这对我们来说也是很难很难的事情啊。



另外两种方式都由依赖,第一个直接依赖于目标类,第二个把依赖转移到工厂上,第三个彻底与目标和工厂解耦了。在spring的配置文件中配置片段如下:

  C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好.

  B/S 对的多重结构,要求构件相对独立的功能. 能够相对较好的重用.就入买来的餐桌可以再利用,而不是做在墙上的石头桌子

  C/S 程序由于整体性, 必须整体考察, 处理出现的问题以及系统升级. 升级难. 可能是再做一个全新的系统

  B/S 构件组成,方面构件个别的更换,实现系统的无缝升级. 系统维护开销减到最小.用户从网上自己下载安装就可以实现升级.

  C/S 程序可以处理用户面固定, 并且在相同区域, 安全要求高需求, 与操作系统相关. 应该都是相同的系统

  B/S 建立在广域网上, 面向不同的用户群, 分散地域, 这是C/S无法作到的. 与操作系统平台关系最小.

  C/S 多是建立的Window平台上,表现方法有限,对程序员普遍要求较高

  B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流. 并且大部分难度减低,减低开发成本.

  C/S 程序一般是典型的中央集权的机械式处理, 交互性相对低

  B/S 信息流向可变化, B-B B-C B-G等信息、流向的变化, 更像交易中心。

32、应用服务器有那些?

一个另类的回答:j2ee就是增删改查。

67、J2EE是技术还是平台还是框架? 什么是J2EE

J2EE本身是一个标准,一个为企业分布式应用的开发提供的标准平台。

95、请对以下在J2EE中常用的名词进行解释(或简单描述)

web容器:给处于其中的应用程序组件(JSP,SERVLET)提供一个环境,使JSP,SERVLET直接更容器中的环境变量接口交互,不必关注其它系统问题。主要有WEB服务器来实现。例如:TOMCAT,WEBLOGIC,WEBSPHERE等。该容器提供的接口严格遵守J2EE规范中的WEB APPLICATION 标准。我们把遵守以上标准的WEB服务器就叫做J2EE中的WEB容器。

EJB容器:Enterprise java bean 容器。更具有行业领域特色。他提供给运行在其中的组件EJB各种管理功能。只要满足J2EE规范的EJB放入该容器,马上就会被容器进行高效率的管理。并且可以通过现成的接口来获得系统级别的服务。例如邮件服务、事务管理。

JNDI:(Java Naming & Directory Interface)JAVA命名目录服务。主要提供的功能是:提供一个目录系统,让其它各地的应用程序在其上面留下自己的索引,从而满足快速查找和定位分布式应用程序的功能。

JMS:(Java Message Service)JAVA消息服务。主要实现各个应用程序之间的通讯。包括点对点和广播。

JTA:(Java Transaction API)JAVA事务服务。提供各种分布式事务服务。应用程序只需调用其提供的接口即可。

JAF:(Java Action FrameWork)JAVA安全认证框架。提供一些安全控制方面的框架。让开发者通过各种部署和自定义实现自己的个性安全控制策略。

RMI/IIOP:(Remote Method Invocation /internet对象请求中介协议)他们主要用于通过远程调用服务。例如,远程有一台计算机上运行一个程序,它提供股票分析服务,我们可以在本地计算机上实现对其直接调用。当然这是要通过一定的规范才能在异构的系统之间进行通信。RMI是JAVA特有的。

(这个问题不作具体回答,列出来只是告诉读者可能会遇到什么问题,你不需要面面俱到,什么都精通。)

81、如何设定的weblogic的热启动模式(开发模式)与产品发布模式?

Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。 Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。 Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型

noeviction:返回错误当内存限制达到并且客户端尝试执行会让更多内存被使用的命令(大部分的写入指令,但DEL和几个例外)

allkeys-lru: 尝试回收最少使用的键(LRU),使得新添加的数据有空间存放。

volatile-lru: 尝试回收最少使用的键(LRU),但仅限于在过期集合的键,使得新添加的数据有空间存放。

allkeys-random: 回收随机的键使得新添加的数据有空间存放。

volatile-random: 回收随机的键使得新添加的数据有空间存放,但仅限于在过期集合的键。

volatile-ttl: 回收在过期集合的键,并且优先回收存活时间(TTL)较短的键,使得新添加的数据有空间存放。

因为目前Linux版本已经相当稳定,而且用户量很大,无需开发windows版本,反而会带来兼容性等问题。

Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以redis具有快速和数据持久化的特征。如果不将数据放在内存中,磁盘I/O速度为严重影响redis的性能。在内存越来越便宜的今天,redis将会越来越受欢迎。 如果设置了最大使用的内存,则数据已有记录数达到内存限值后不能继续插入新值。

1.twemproxy,大概概念是,它类似于一个代理方式,使用方法和普通redis无任何区别,设置好它下属的多个redis实例后,使用时在本需要连接redis的地方改为连接twemproxy,它会以一个代理的身份接收请求并使用一致性hash算法,将请求转接到具体redis,将结果再返回twemproxy。使用方式简便(相对redis只需修改连接端口),对旧项目扩展的首选。 问题:twemproxy自身单端口实例的压力,使用一致性hash后,对redis节点数量改变时候的计算值的改变,数据无法自动移动到新的节点。

2.codis,目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在 节点数量改变情况下,旧节点数据可恢复到新hash节点。

3.redis cluster3.0自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。具体看官方文档介绍。

4.在业务代码层实现,起几个毫无关联的redis实例,在代码层,对key 进行hash计算,然后去对应的redis实例操作数据。 这种方式对hash层代码要求比较高,考虑部分包括,节点失效后的替代算法方案,数据震荡后的自动脚本恢复,实例的监控,等等。

有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少这个范围的槽而不可用。

redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?

幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。

(2)、全页缓存(FPC)

除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。

再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端。

此外,对WordPress的用户来说,Pantheon有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。

Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。

如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。

(4),排行榜/计数器

Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可:

当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:

Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。

最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!(不,这是真的,你可以去核实)。

Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。

Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽。

为了使在部分节点失败或者大部分节点无法通信的情况下集群仍然可用,所以集群使用了主从复制模型,每个节点都会有N-1个复制品.

Redis并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。

Redis集群目前无法做数据库选择,默认在0数据库。

一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应。这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。

这就是管道(pipelining),是一种几十年来广泛使用的技术。例如许多POP3协议已经实现支持这个功能,大大加快了从服务器下载新邮件的过程。

事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面.

  1. 一个客户端运行了新的命令,添加了新的数据。
  2. Redi检查内存使用情况,如果大于maxmemory的限制, 则根据设定好的策略进行回收。
  3. 一个新的命令被执行,等等。
  4. 所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。

如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。

Redis2.6开始redis-cli支持一种新的被称之为pipe mode的新模式用于执行大量数据插入工作。

分区可以让Redis管理更大的内存,Redis将可以使用所有机器的内存。如果没有分区,你最多只能使用一台机器的内存。分区使Redis的计算能力通过简单地增加计算机得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长。

  • 客户端分区就是在客户端就已经决定数据会被存储到哪个redis节点或者从哪个redis节点读取。大多数客户端已经实现了客户端分区。
  • 代理分区 意味着客户端将请求发送给代理,然后代理决定去哪个节点写数据或者读数据。代理根据分区规则决定请求哪些Redis实例,然后根据Redis的响应结果返回给客户端。redis和memcached的一种代理实现就是Twemproxy
  • 查询路由(Query routing) 的意思是客户端随机地请求任意一个redis实例,然后由Redis将请求转发给正确的Redis节点。Redis Cluster实现了一种混合形式的查询路由,但并不是直接将请求从一个redis节点转发到另一个redis节点,而是在客户端的帮助下直接redirected到正确的redis节点。
  • 涉及多个key的操作通常不会被支持。例如你不能对两个集合求交集,因为他们可能被存储到不同的Redis实例(实际上这种情况也有办法,但是不能直接使用交集指令)。
  • 同时操作多个key,则不能使用Redis事务.
  • 当使用分区的时候,数据处理会非常复杂,例如为了备份你必须从不同的Redis实例和主机同时收集RDB / AOF文件。
  • 分区时动态扩容或缩容可能非常复杂。Redis集群在运行时增加或者删除Redis节点,能做到最大程度对用户透明地数据再平衡,但其他一些客户端分区或者代理分区方法则不支持这种特性。然而,有一种预分片的技术也可以较好的解决这个问题。
  • 如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。
  • 如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。

既然Redis是如此的轻量(单实例只使用1M内存),为防止以后的扩容,最好的办法就是一开始就启动较多实例。即便你只有一台服务器,你也可以一开始就让Redis以分布式的方式运行,使用分区,在同一台服务器上启动多个实例。

一开始就多设置几个Redis实例,例如32或者64个实例,对大多数用户来说这操作起来可能比较麻烦,但是从长久来看做这点牺牲是值得的。

这样的话,当你的数据不断增长,需要更多的Redis服务器时,你需要做的就是仅仅将Redis实例从一台服务迁移到另外一台服务器而已(而不用考虑重新分区的问题)。一旦你添加了另一台服务器,你需要将你一半的Redis实例从第一台机器迁移到第二台机器。

Twemproxy是Twitter维护的(缓存)代理系统,代理Memcached的ASCII协议和Redis协议。它是单线程程序,使用c语言编写,运行起来非常快。它是采用Apache 2.0 license的开源软件。 Twemproxy支持自动分区,如果其代理的其中一个Redis节点不可用时,会自动将该节点排除(这将改变原来的keys-instances的映射关系,所以你应该仅在把Redis当缓存时使用Twemproxy)。 Twemproxy本身不存在单点问题,因为你可以启动多个Twemproxy实例,然后让你的客户端去连接任意一个Twemproxy实例。 Twemproxy是Redis客户端和服务器端的一个中间层,由它来处理分区功能应该不算复杂,并且应该算比较可靠的。

  1. Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
  2. Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,应为数据量不能大于硬件内存。在内存数据库方面的另一个优点是, 相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。 同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

给你举个例子: 100万个键值对(键是0到999999值是字符串“hello world”)在我的32位的Mac笔记本上 用了100MB。同样的数据放到一个key里只需要16MB, 这是因为键值有一个很大的开销。 在Memcached上执行也是类似的结果,但是相对Redis的开销要小一点点,因为Redis会记录类型信息引用计数等等。

当然,大键值对时两者的比例要好很多。

64位的系统比32位的需要更多的内存开销,尤其是键值对都较小时,这是因为64位的系统里指针占用了8个字节。 但是,当然,64位系统支持更大的内存,所以为了运行大型的Redis服务器或多或少的需要使用64位的系统。

如果你使用的是32位的Redis实例,可以好好利用Hash,list,sorted set,set等集合类型数据,因为通常情况下很多小的Key-Value可以用更紧凑的方式存放到一起。

如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回。)或者你可以将Redis当缓存来使用配置淘汰机制,当Redis达到内存上限时会冲刷掉旧的内容。

可以在同一个服务器部署多个Redis的实例,并把他们当作不同的服务器来使用,在某些时候,无论如何一个服务器是不够的, 所以,如果你想使用多个CPU,你可以考虑一下分片(shard)。

理论上Redis可以处理多达232的keys,并且在实际中进行了测试,每个实例至少存放了2亿5千万的keys。我们正在测试一些较大的值。

换句话说,Redis的存储极限是系统中的可用内存值。

(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件

(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

(4) 尽量避免在压力很大的主库上增加从库

这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

  1. RDB持久化方式能够在指定的时间间隔能对你的数据进行快照存储.
  2. AOF持久化方式记录每次对服务器写的操作,当服务器重启的时候会重新执行这些命令来恢复原始的数据,AOF命令以redis协议追加保存每次写的操作到文件末尾.Redis还能对AOF文件进行后台重写,使得AOF文件的体积不至于过大.
  3. 如果你只希望你的数据在服务器运行的时候存在,你也可以不使用任何持久化方式.
  4. 你也可以同时开启两种持久化方式, 在这种情况下, 当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为在通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整.
  5. 最重要的事情是了解RDB和AOF持久化方式的不同,让我们以RDB持久化方式开始。

一般来说, 如果想达到足以媲美PostgreSQL的数据安全性, 你应该同时使用两种持久化功能。如果你非常关心你的数据, 但仍然可以承受数分钟以内的数据丢失,那么你可以只使用RDB持久化。

有很多用户都只使用AOF持久化,但并不推荐这种方式:因为定时生成RDB快照(snapshot)非常便于进行数据库备份, 并且 RDB 恢复数据集的速度也要比AOF恢复的速度要快,除此之外, 使用RDB还可以避免之前提到的AOF程序的bug。

针对运行实例,有许多配置选项可以通过 CONFIG SET 命令进行修改,而无需执行任何形式的重启。 从 Redis 2.2 开始,可以从 AOF 切换到 RDB 的快照持久性或其他方式而不需要重启 Redis。检索 ‘CONFIG GET *’ 命令获取更多信息。

但偶尔重新启动是必须的,如为升级 Redis 程序到新的版本,或者当你需要修改某些目前 CONFIG 命令还不支持的配置参数的时候。

<article>
拿数据二中的value值替换成数值一的key值 数据一数据二根据id可以对应 都是List里面可以能有很多数据
</article>

我要回帖

更多关于 java实现冒泡排序 的文章

 

随机推荐