大飞哥的博客

借书满架,偃仰啸歌,冥然兀坐,万籁有声

0%

修复kafkacat json format的bug

kafkacat是一款c语言实现的kafka client cli, 不同于kafka官方包里的cli,使用比较繁琐,并且依赖jvm才能运行, kafkacat是一个小巧的cmd, 依赖一个基础c library: librdkafka,能够很方便地对kafka进行一些基本操作,如list、producer、consumer等。

Read more »

一种使用redis实现频率限制的错误方式及解释

redis作为如今最流行的缓存软件广泛应用于互联网业务的方方面面,而频率限制又是很常见的业务场景,如常见的投票、抢购、秒杀等场景。redis由于全部基于内存操作,在读写性能上表现相当给力,因此很多业务中都使用redis来实现频率限制。

网上的教程已经汗牛充栋,我这里仅简单地介绍下原理,然后重点介绍下在高并发场景下,简单地使用redis将不能保证操作的原子性,频率限制会形同虚设。

Read more »

mysql 事务隔离级设置

如何查看当前SESSION的事务隔离级

mysql 默认的事务隔离级是 REPEATABLE-READ

可以通过以下命令查看当前session的事务隔离级(5.7.20之前)

1
2
3
4
5
6
7
MariaDB [(none)]> select @@session.tx_isolation;
+------------------------+
| @@session.tx_isolation |
+------------------------+
| REPEATABLE-READ |
+------------------------+
1 row in set (0.00 sec)
Read more »

TIME_WAIT状态

TIME_WAIT状态何时发生? 状态持续时间为多久?

TIME_WAIT状态在TCP4次挥手是产生。当客户端收到服务端返回FIN信号时,进入TIME_WAIT状态并且向服务端返回ACK,告知服务端我已经收到你的FIN信息。

TIME_WAIT状态的时间是最长分节时间(maximun segment lifetime, MSL)的两倍, 有时候称之为2MSL。 最长分节时间是指,一次TCP报文在服务端和客户端之前传送存活的最长时间,若超过这个时间,该报文仍未到达目的地,则可认为该报文已被丢弃。

最长分节时间一般由ip报文的TTL标识,TTL代表一个ip报文传递时通过一个ip报文的最大跳数(255),ip报文每经过一个路由器,TTL会减1,当TTL为0时,路由器会将该报文丢弃。

为何需要该状态? 该状态设置的时间为何是2MSL?

Read more »

如何获取redis内存使用情况

redis提供了info命令,可以获取redis内存使用情况。
其中关于redis内存的部分有七个参数,used_memory、used_memory_human、used_memory_rss、used_memory_peak、used_memory_peak_human、mem_fragmentation_ratio、used_memory_lua和mem_allocator。

各参数的含义如下:

  • used_memory : 由 Redis 分配器分配的内存总量,以字节(byte)为单位
  • used_memory_human : 以人类可读的格式返回 Redis 分配的内存总量
  • used_memory_rss : 从操作系统的角度,返回Redis已分配的内存总量(俗称常驻集大小)。这个值和 top 、 ps 等命令的输出一致。
  • used_memory_peak : Redis的内存消耗峰值(以字节为单位)
  • used_memory_peak_human : 以人类可读的格式返回 Redis 的内存消耗峰值
  • mem_fragmentation_ratio : used_memory_rss 和 used_memory 之间的比率
  • used_memory_lua : Lua 引擎所使用的内存大小(以字节为单位)
  • mem_allocator : 在编译时指定的,Redis所使用的内存分配器。可以是 libc 、 jemalloc 或者 tcmalloc 。
Read more »