JS 实现Table相同行的单元格自动合并示例代码

1.autoRowSpan函数的第一个参数是table的id

2.合并行列必须是从右往左,从下往上的,即第二、第三参数分别是从大到小的。

```javascript
autoRowSpan(tab,0,4);
autoRowSpan(tab,0,3);
autoRowSpan(tab,0,2);
autoRowSpan(tab,0,1);
autoRowSpan(tab,0,0);

function autoRowSpan(tb,row,col){
var lastValue="";
var value="";
var pos=1;
for(var i=row;i value = tb.rows[i].cells[col].innerText;
if(lastValue == value){
tb.rows[i].deleteCell(col);
tb.rows[i-pos].cells[col].rowSpan = tb.rows[i-pos].cells[col].rowSpan+1;
pos++;
}else{
lastValue = value;
pos=1;
}
}
}
```
转自:http://www.mamicode.com/info-detail-2520800.html

java8对list的根据参数过滤重复对象

记录一下

     listUser.stream().collect(
                collectingAndThen(Collectors.toCollection(() -> new TreeSet<>(Comparator.comparing(User::getId))), ArrayList::new));

返回值是个ArrayList集合

redis面试题

1、Redis的特点?
Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过10万次读写操作,是已知性能最快的Key-Value DB。

Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像memcached只能保存1MB的数据,另外Redis也可以对存入的Key-Value设置expire时间。

Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

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

4、Redis最适合的场景有哪些?

● 会话缓存(Session Cache)
● 全页缓存(FPC)
● 队列
● 排行榜/计数器
● 发布/订阅

5、、Memcache与Redis的区别都有哪些?

● 存储方式不同,Memcache是把数据全部存在内存中,数据不能超过内存的大小,断电后数据库会挂掉。Redis有部分存在硬盘上,这样能保证数据的持久性。

● 数据支持的类型不同memcahe对数据类型支持相对简单,redis有复杂的数据类型。

● 使用底层模型不同 它们之间底层实现方式以及与客户端之间通信的应用协议不一样。Redis直接自己构建了VM机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

● 支持的value大小不一样redis最大可以达到1GB,而memcache只有1MB。

6、Redis有哪几种数据结构?

● String——字符串

String数据结构是简单的key-value类型,value不仅可以是String,也可以是数字(当数字类型用Long可以表示的时候encoding就是整型,其他都存储在sdshdr当做字符串)。

● Hash——字典

在Memcached中,我们经常将一些结构化的信息打包成hashmap,在客户端序列化后存储为一个字符串的值(一般是JSON格式),比如用户的昵称、年龄、性别、积分等。

● List——列表

List说白了就是链表(redis使用双端链表实现的List)

● Set——集合

Set就是一个集合,集合的概念就是一堆不重复值的组合。利用Redis提供的Set数据结构,可以存储一些集合性的数据。

● Sorted Set——有序集合

和Set相比,Sorted Set是将Set中的元素增加了一个权重参数score,使得集合中的元素能够按score进行有序排列,

● 带有权重的元素,比如一个游戏的用户得分排行榜

● 比较复杂的数据结构,一般用到的场景不算太多

分布式面试题

1、如何使用ActiveMQ解决分布式事务?

在互联网应用中,基本都会有用户注册的功能。在注册的同时,我们会做出如下操作:

● 收集用户录入信息,保存到数据库

● 向用户的手机或邮箱发送验证码

如果是传统的集中式架构,实现这个功能非常简单:开启一个本地事务,往本地数据库中插入一条用户数据,发送验证码,提交事物。但是在分布式架构中,用户和发送验证码是两个独立的服务,它们都有各自的数据库,那么就不能通过本地事物保证操作的原子性。这时我们就需要用到ActiveMQ(消息队列)来为我们实现这个需求。在用户进行注册操作的时候,我们为该操作创建一条消息,当用户信息保存成功时,把这条消息发送到消息队列。验证码系统会监听消息,一旦接受到消息,就会给该用户发送验证码。

2、如何防止消息重复发送?

解决方法很简单:增加消息状态表。通俗来说就是一个账本,用来记录消息的处理状态,每次处理消息之前,都去状态表中查询一次。如果已经有相同的消息存在,那么不处理,可以防止重复发送。

3、了解哪些消息队列?

ActiveMQ、RabbitMQ、kafka。

RabbitMQ是使用Erlang编写的一个开源的消息队列,本身支持很多的协议:AMQP,XMPP,SMTP,STOMP,也正因如此,它非常重量级,更适合于企业级的开发。同时实现了Broker构架,这意味着消息在发送给客户端时先在中心队列排队。对路由,负载均衡或者数据持久化都有很好的支持。

ActiveMQ是Apache下的一个子项目。类似于ZeroMQ,它能够以代理人和点对点的技术实现队列。同时类似于RabbitMQ,它少量代码就可以高效地实现高级应用场景。

Kafka是Apache下的一个子项目,是一个高性能跨语言分布式发布/订阅消息队列系统,而Jafka是在Kafka之上孵化而来的,即Kafka的一个升级版。具有以下特性:快速持久化,可以在O(1)的系统开销下进行消息持久化;高吞吐,在一台普通的服务器上既可以达到10W/s的吞吐速率;完全的分布式系统,Broker、Producer、Consumer都原生自动支持分布式,自动实现负载均衡;支持Hadoop数据并行加载,对于像Hadoop的一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka通过Hadoop的并行加载机制统一了在线和离线的消息处理。Apache Kafka相对于ActiveMQ是一个非常轻量级的消息系统,除了性能非常好之外,还是一个工作良好的分布式系统。

MQ选型对比图

4、ActiveMQ如果消息发送失败怎么办?

Activemq有两种通信方式,点到点形式和发布订阅模式。

如果是点到点模式的话,如果消息发送不成功,此消息默认会保存到activemq服务端知道有消费者将其消费,所以此时消息是不会丢失的。

如果是发布订阅模式的通信方式,默认情况下只通知一次,如果接收不到此消息就没有了。这种场景只适用于对消息送达率要求不高的情况。如果要求消息必须送达不可以丢失的话,需要配置持久订阅。每个订阅端定义一个id,在订阅是向activemq注册。发布消息和接收消息时需要配置发送模式为持久化。此时如果客户端接收不到消息,消息会持久化到服务端,直到客户端正常接收后为止。