CComma's Blog

CComma's Blog

Connect the world

分片位置:

  • 客户端分片:客户端使用一致性哈希等算法决定键应当分布到哪个节点
  • 代理分片:将客户端请求发送到代理上,由代理转发请求到正确的节点上
  • 服务器分片:Redis Cluster
Read more »

一、事务

一个事务包含了 多个命令,服务器在执行事务期间,不会改去执行其它客户端的命令请求
事务中的多个命令被 ** 一次性 ** 发送给服务器,而不是一条一条发送,这种方式被称为流水线,它可以减少客户端与服务器之间的网络通信次数从而提升性能。
Redis 最简单的事务实现方式是使用 MULTI 和 EXEC 命令将事务操作包围起来。

Read more »

1. 过期策略

定期删除: 默认每隔 100ms 随机抽取 进行检查,是否有过期的 key,有过期 key 则删除。因此没抽查到的需要惰性删除进一步筛选
惰性删除:
获取某个 key 的时候,如果该 key 已过期,则删除。

Read more »

为什么取模

OJ 上很多题目因为难度原因需要非常大的测试数据量(数据量大了自然会对算法的时间复杂度要求更高),而大数据量往往会导致溢出,虽然可以用 BigInt 等方式做题,但这就失去了这道题的原本意义。

这种情况题目会要求计算结果对 1e9 + 7 取模,因为对取模不会影响算法的正确性,既避免了高精度运算,又能保证极少的冲突情况。
这里可以先回顾下模除运算的等价性

1
2
3
4
(a + b) % p = (a % p + b % p) % p
(a - b) % p = (a % p - b % p ) % p
(a * b) % p = (a % p * b % p) % p
a ^ b % p = ((a % p)^b) % p

由上述各个公式可知只要每次运算后觉得结果过大都可以对其进行取模,只要避免数据溢出,那么最终结果都是一样的。例如:

1
2
3
4
5
int MOD = (int) 1e9 + 7;

int a = MOD + 1;
int sum = a + 1 + a * a;
sum %= MOD;

只要 sum 不溢出,那么其结果和对每次运算结果都 %MOD 一遍是一样的。

所以 取模成了简化大数据的一种约定,服务端给定算法取模后的测试数据,我们写算法时也进行取模,那么依然能验证算法的正确性。

Read more »

一个序列的 宽度 定义为该序列中最大元素和最小元素的差值。
给你一个整数数组 nums ,返回 nums 的所有非空 子序列宽度之和 。由于答案可能非常大,请返回对 1e9 + 7 取余 后的结果。
子序列 定义为从一个数组里删除一些(或者不删除)元素,但不改变剩下元素的顺序得到的数组。例如,[3,6,2,7] 就是数组 [0,3,1,6,2,2,7] 的一个子序列。

Read more »

给定字符串 s 和字符串数组 words, 返回  words[i] 中是 s 的子序列的单词个数 。
字符串的 子序列 是从原始字符串中生成的新字符串,可以从中删去一些字符 (可以是 none),而不改变其余字符的相对顺序。

  • 例如, “ace”“abcde” 的子序列。

在一个 n x n 的矩阵 grid 中,除了在数组 mines 中给出的元素为 0,其他每个元素都为 1mines[i] = [xi, yi] 表示 grid[xi][yi] == 0
返回  grid 中包含 1 的最大的 轴对齐 加号标志的阶数 。如果未找到加号标志,则返回 0

一个 k 阶由 1 组成的 “轴对称” 加号标志 具有中心网格 grid[r][c] == 1 ,以及 4 个从中心向上、向下、向左、向右延伸,长度为 k-1,由 1 组成的臂。注意,只有加号标志的所有网格要求为 1 ,别的网格可能为 0 也可能为 1

Read more »
0%