有时候需要在程序里面做分组操作,类似MySQL中的group by
语句。
比如有如下数据:
id | name |
---|---|
1 | A |
1 | B |
2 | C |
我们想把它分组成这样的形式:{1=[A, B], 2=[C]}
1 | public class GroupingByDemo { |
Collectors.mapping(IdNamePair::getName, Collectors.toList())
相当于再往里面拨一层,取对象里面的一个属性。
有时候需要在程序里面做分组操作,类似MySQL中的group by
语句。
比如有如下数据:
id | name |
---|---|
1 | A |
1 | B |
2 | C |
我们想把它分组成这样的形式:{1=[A, B], 2=[C]}
1 | public class GroupingByDemo { |
Collectors.mapping(IdNamePair::getName, Collectors.toList())
相当于再往里面拨一层,取对象里面的一个属性。
在应用中,很多会用到数据库的存储过程,一般都会在程序里面实现数据库的逻辑。
但有时候要快速的获取某个值,逻辑比较复杂的时候,可能会用到存储过程。
比如接下来的案例,会把数据库的表作为一个变量传入。
1 | DROP PROCEDURE IF EXISTS getInfo; |
当创建好存储过程以后,可以通过以下方式调用。
1 | SET @tableName := "tb_user"; |
如果不写存储过程,还可以通过执行下面代码的方式获取结果。
1 | SET @user := 123456; |
1 | SET @group = (SELECT `group` FROM user WHERE user = @user); |
或者
1 | SELECT `group` INTO @group FROM user WHERE user = @user; |
nc 用于和服务器建立连接。
在Ubuntu上面做实验
启动一个终端
1 | $ nc www.baidu.com 80 |
再开启另一个终端
1 | $ netstat -antp |
1 | Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name |
可以看到最后一行,已经建立了一个TCP连接。
在刚才连接好百度服务器的终端上面,按http协议,请求百度首页。GET / HTTP/1.0
并连续输入两个回车。
1 | $ nc www.baidu.com 80 |
写一个SocketDemo Server端程序,开启一个监听。
-ff 追踪线程和子线程
-o output
1 | $ strace -ff -o ./out java SocketDemo |
通过jps或netstat可以看到一个pid
1 | $ cd /proc/[pid] |
在fd
目录下面,可以看到开启了多少个IO。
io流
/dev/pts/0 标准输入
/dev/pts/1 标准输出
/dev/pts/2 标准报错
1 | ulimit -a |
open files 1024
在task
目录,显示所有的线程
追踪一下redis的多路复用
1 | $ strace -ff -o ./redis-out bin/redis-server config/server.properties |
通过netstat查看进程监听状态
通过/proc/[pid]查看 fd 和 task,可以看到redis是多线程的。