Levon's Blog

微信: L6241425

TCP 的全称叫传输控制协议(Transmission Control Protocol),TCP 相比 UDP 多了很多特性,比如流量控制、超时重传、拥塞控制等,这些都是为了保证数据包能可靠地传输给对方。当传输层的数据包大小超过 MSS(TCP 最大报文段长度) ,就要将数据包分块,我们把每个分块称为一个 TCP 段(TCP Segment)。

网络层最常使用的是 IP 协议(Internet Protocol),IP 协议会将传输层的报文作为数据部分,再加上 IP 包头组装成 IP 报文,如果 IP 报文大小超过 MTU(以太网中一般为 1500 字节)就会再次进行分片,得到一个即将发送到网络的 IP 报文。

img

网络接口层的传输单位是帧(frame),IP 层的传输单位是包(packet),TCP 层的传输单位是段(segment),HTTP 的传输单位则是消息或报文(message)。

img
阅读全文 »

1. 流量控制(滑动窗口)

TCP 利用滑动窗口实现流量控制。流量控制是为了控制发送方发送速率,保证接收方来得及接收。 接收方发送的确认报文中的窗口字段可以用来控制发送方窗口大小,从而影响发送方的发送速率。将窗口字段设置为 0,则发送方不能发送数据。

发送端和接收端各自有自己的滑动窗口。

阅读全文 »

分布式锁其实就是,控制分布式系统不同进程共同访问共享资源的一种锁的实现。如果不同的系统或同一个系统的不同主机之间共享了某个临界资源,往往需要互斥来防止彼此干扰,以保证一致性。

业界流行的分布式锁实现,一般基于数据库,Redis和Zookeeper。

阅读全文 »

许多单体应用在修改应用状态时都是依靠事务来保证一致性和隔离性的。要实现这两点很简单:应用通常只和单个数据库交互,使用支持启动、提交和回滚这些事务操作的框架来实现强一致性保证。

在微服务应用中,就没有这么幸运了。服务间的交互可能会失败,导致业务流程受阻,最终使整个系统处于不一致的状态。

阅读全文 »

1. 多线程

我们所说的Redis单线程,指的是”其网络IO和键值对读写是由一个线程完成的”,也就是说,Redis中只有网络请求模块和数据操作模块是单线程的。而其他的如持久化存储模块、集群支撑模块等是多线程的。

阅读全文 »

1. 缓存问题

1.1 缓存穿透(透了要用布隆过滤器)

缓存和数据库中都没有的数据,而用户不断发起请求。由于缓存不命中,并且出于容错考虑,如果从数据库查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,失去了缓存的意义。

如发起为id为“-1”的数据或id为特别大不存在的数据。这时的用户很可能是攻击者,攻击会导致数据库压力过大。

阅读全文 »

1. 事务

Redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。准确的讲,Redis 事务包含两种模式 : 事务模式 和 Lua 脚本。

阅读全文 »

1. 主从复制

主从复制,是指将一台Redis服务器的数据,复制到其他的Redis服务器。前者称为主节点(master),后者称为从节点(slave);从服务器无法进行写操作。

img
阅读全文 »

1. 过期删除策略

1.1 过期删除策略(3种)

  • 定时删除(对内存友好,对CPU不友好)

    到时间点上就把所有过期的键删除了。

  • 惰性删除(对CPU极度友好,对内存极度不友好)

    每次从键空间取键的时候,判断一下该键是否过期了,如果过期了就删除。

  • 定期删除(折中)

    每隔一段时间去删除过期键,限制删除的执行时长和频率。

第一种和第三种为主动删除策略,而第二种则为被动删除策略。Redis采用的是惰性删除+定期删除两种策略,所以说,在Redis里边如果过期键到了过期的时间了,未必被立马删除的!

阅读全文 »

1. 基础对象

Redis中的key一定是字符串,value可以是string、list、hash、set、sortset这几种常用的。

类型作用底层数据结构
string简单的key-valueSDS
list有序列表,可做简单队列ziplist, linkedlist 【quicklist】
hash哈希表,存储结构化数据ziplist, hashtable
set无序列表(去重),提供一系列的交集、并集、差集的命令intset, hashtable
sortset有序集合映射,排行榜,和时间相关的排序ziplist, zskiplist
阅读全文 »
0%