Synchronized 是 Java 中的一种锁的方式,是在 JVM 层面一种锁。在 jdk 1.6以前是一种重量级锁,在经历过优化后 Synchronized 锁已经没有那么“重”了。
Synchronized 有 3 种使用方式:
- 普通同步方法,锁是当前实例对象
- 静态同步方法,锁是当前类的Class对象
- 同步代码块,锁是Synchonized括号里配置的对象
Synchronized 是 Java 中的一种锁的方式,是在 JVM 层面一种锁。在 jdk 1.6以前是一种重量级锁,在经历过优化后 Synchronized 锁已经没有那么“重”了。
Synchronized 有 3 种使用方式:
Redis 中的每个数据库,都由一个 redis.h/redisDb 结构表示:
1 | typedef struct redisDb { |
事务的命令包括 MULTI 、 DISCARD 、 EXEC 和 WATCH
1 | MULTI |
由于 redis 需要对每一个 key 产生不同的操作,所以Redis 必须让每个键都带有类型信息,使得程序可以检查键的类型,并为它选择合适的处理方式
为了解决以上问题, Redis 构建了自己的类型系统,这个系统的主要功能包括:
整数集合(intset)用于有序、无重复地保存多个整数值,它会根据元素的值,自动选择该用什
么长度的整数类型来保存元素
举个例子,如果在一个 intset 里面,最长的元素可以用 int16_t 类型来保存,那么这个 intset
的所有元素都以 int16_t 类型来保存。
另一方面,如果有一个新元素要加入到这个 intset ,并且这个元素不能用 int16_t 类型来保存
——比如说,新元素的长度为 int32_t ,那么这个 intset 就会自动进行“升级” :先将集合中现有的所有元素从 int16_t 类型转换为 int32_t 类型,接着再将新元素加入到集合中。
在 C 语言中,字符串可以用一个 \0 结尾的 char 数组来表示。 比如说,hello world 在 C 语言中就可以表示为 “hello world\0” 。
这种简单的字符串表示在大多数情况下都能满足要求,但是,它并不能高效地支持长度计算和 追加(append)这两种操作:
每次计算字符串长度(strlen(s))的复杂度为 θ(N) 。
对字符串进行 N 次追加,必定需要对字符串进行 N 次内存重分配(realloc)。
在 Redis 的使用场景中,基本的架构图如下:
如果在缓存中查询不到数据,会直接到 DB 中查询,查询的数据再插入到缓存中。例如我们根据 orderId 查询对应的订单,具体伪代码如下:
1 | OrderEntity getOrder(String orderId){ |
这次部署两个项目,一个是 web 站点项目,一个是爬虫的后台应用项目。
docker file 是 使用 docker 部署应用的命令。 具体的命令可以参考 Docker 命令.
由于是两个文件,所以需要两个不同的 Dockerfile
.具体的 build 的内容如下:
这篇文章记录一个正则表达是导致 CPU 高的问题排查。由于无法直接使用线上的代码测试,所以我自己把代码整理了下来,具体代码如下:
1 | public class AppMain { |
当运行程序的时候,我们可以看到 java 的进程占用了 CPU 了 82.1%
,由于我使用的服务器是 1核+2G, 所以 load avg 占用也很高。
Update your browser to view this website correctly.&npsb;Update my browser now