摘要: 由于线程的创建⽐较昂贵,随意、没有控制地创建⼤量线程会造成性能问题,因此短平快的任务⼀般考虑使 ⽤线程池来处理,⽽不是直接创建线程。 通过三个⽣产事故,来看看使⽤线程池应该注意些什么。 线程池的声明需要⼿动进⾏ Java中的Executors类定义了⼀些快捷的⼯具⽅法,来帮助我们快速创建线程池。《阿 阅读全文
posted @ 2020-04-28 08:21 liekkas01 阅读(468) 评论(1) 推荐(0) 编辑
摘要: 阅读全文
posted @ 2020-04-26 22:41 liekkas01 阅读(140) 评论(0) 推荐(0) 编辑
摘要: 分析解决线程安全问题的锁在使用中的问题。 场景: 在⼀个类⾥有两个int类型的字段a和b,有⼀个add⽅法循环1万次对a和b进 ⾏++操作,有另⼀个compare⽅法,同样循环1万次判断a是否⼩于b,条件成⽴就打印a和b的值,并判断 a>b是否成⽴。 代码如下: volatile int a = 1 阅读全文
posted @ 2020-04-25 22:40 liekkas01 阅读(305) 评论(0) 推荐(0) 编辑
摘要: 为了⽅便开发者进⾏多线程编程,现代编程语⾔会提供各种并发⼯具类。但如果我们没有充分了解它们的使⽤场景、解决的问题,以及最佳实践的话,盲⽬使⽤就可能会导致⼀些坑,⼩则损失性能,⼤则⽆法确保多线程情况下业务逻辑的正确性。 ⼀般⽽⾔并发⼯具包括同步器和容器两⼤类,业务代码中使⽤并发容器的情况会多⼀些。 线 阅读全文
posted @ 2020-04-25 22:14 liekkas01 阅读(230) 评论(0) 推荐(0) 编辑
摘要: 定时任务 在 OpenResty 中,有时候需要在后台定期地执行某些任务,比如同步数据、清理日志等。最容易想到的方法,便是对外提供一个 API 接口,在接口中完成这些任务; 然后用系统的 crontab 定时调用 curl,来访问这个接口,进而曲线地实现这个需求。 不过,这样会给运维带来更高的复杂度 阅读全文
posted @ 2020-04-23 23:15 liekkas01 阅读(3386) 评论(0) 推荐(1) 编辑
摘要: cosocket 是各种 lua-resty-* 非阻塞库的基础,没 有 cosocket,开发者就无法用 Lua 来快速连接各种外部的网络服务。 在早期的 OpenResty 版本中,如果想要去与 Redis、memcached 这些服务交互的话,需要使用 redis2-nginx-module、 阅读全文
posted @ 2020-04-22 23:00 liekkas01 阅读(3734) 评论(0) 推荐(0) 编辑
摘要: 在 Lua 中, table 是唯一的数据结构。共享内存字典shared dict, 是在 OpenResty 编程中最为重要的数据结构。它不仅支持数据的存放和读取,还支持原子计数和队列操作。 基于 shared dict,可以实现多个 worker 之间的缓存和通信,以及限流限速、流量统计等功能。 阅读全文
posted @ 2020-04-21 23:12 liekkas01 阅读(1604) 评论(0) 推荐(0) 编辑
摘要: 原理 回顾一下OpenResty的架构图 OpenResty 的 master 和 worker 进程中,都包含一个 LuaJIT VM。在同一个进程内的所有协程,都会共享这个 VM,并在这个 VM 中运行 Lua 代码。 在同一个时间点上,每个 worker 进程只能处理一个用户的请求,也就是只有 阅读全文
posted @ 2020-04-20 23:09 liekkas01 阅读(2142) 评论(0) 推荐(0) 编辑
摘要: LuaJIT 中只有 table 这一个数据结构,并没有区分开数组、哈 希、集合等概念,而是揉在了一起。 之前的一个例子: local color = {first = "red", "blue", third = "green", "yellow"} print(color["first"]) - 阅读全文
posted @ 2020-04-18 22:37 liekkas01 阅读(1650) 评论(0) 推荐(0) 编辑
摘要: OpenResty 的两个基石:NGINX 和 LuaJIT。 NGINX基础 在 OpenResty 的开发中,我们需要注意下面几点: 要尽可能少地配置 nginx.conf; 避免使用if、set 、rewrite 等多个指令的配合; 能通过 Lua 代码解决的,就别用 NGINX 的配置、变量 阅读全文
posted @ 2020-04-17 23:47 liekkas01 阅读(2002) 评论(0) 推荐(0) 编辑