Lua hash
一般哈希表处理冲突有两种方式,拉链法和开放地址法。拉链法就是哈希表的每个元素都是一个链表,如果有冲突的键就放在链表里面。而开放地址法是如果遇到了冲突,就在计算一个哈希值,直到没有冲突位置。拉链法的优点就是实现简单,缺点也是有的:链表会导致低的缓存命中率,并且分配链表节点本身也会对内存分配器产生压力(主要是大量小块内存分配会导致碎片),而且有个更严重的问题:不太好估计哈希表的装载因子,因此不太容易判断啥时候需要扩充哈希表。而开放地址法避免了这些问题,首先因为所有节点都存在哈希表里面,因此很容易就能估计装载因子,其次也不会有内存分配的问题,避免了零散碎片或者实现内存池的必要。不过问题是要找到一个新的地址就需要重新计算哈希,是一个负担,而且如果在对应哈希查不到元素也可能并不是没有元素,而只是之前的冲突导致元素不再它的”主位置”,这样就需要更多复杂的判断。解决主位置的问题其实很简单:可以设置一个”墓碑”,删除的时候并不是直接删除,而是设置一个”墓碑”当发现是墓碑的时候,证明该位置曾经是有元素的,这时按照冲突的方式继续查找。总的来说,如果不考虑装载因子,因为要重复搜索哈希表,开放地址法的查找是会 ...
SQL升级SQL Server Evaluation 版本成为正式版本
<p>如果不小心安装错 SQL Server 为 Evaluation 的版本,要小心当超过 180 天之后,系统就会无法正常使用了</p>
<br />
<p>这几天遇到一个蛮特别的案例,原本收到的问题是 “维护计划” 忽然无法使用,即便是里面没有任何的 Task,都无法顺利地执行。但从对方所提供的错误消息却看不出来问题在哪里,因此花了一点时间研究一下。</p>
原来这台机器正常有设定维护计划去备份数据库,但不知道是否没有准备儿童节礼物 – 乖乖,居然过完儿童节就忽然无法正常执行,因此就先写了一段 SQL 语法给朋友,看是否把语法放到排程内是否可以顺利执行。
DECLARE @cursor AS CURSOR
DECLARE @dbname AS VARCHAR(20), @query AS VARCHAR(100)
DECLARE @today AS VARCHAR(12) = CONVERT( varchar( ...
Lua
名称ngx_http_lua_module - 将Lua的功能嵌入到Nginx HTTP服务器中。
这个模块没有与Nginx源码一起发布。详见安装介绍
内容列表
名称
状态
版本
概要
描述
状态已经发布。
版本此文档基于2017年4月8日发布的ngx_lua v0.10.8。
概要123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112# 设置纯lua外部库的搜索路径 (';;' 是默认路径): lua_package_path '/foo/bar/?.lua;/blah/?.lua;;'; # 设置用C实现的Lua外部库的搜索路径 (也可以用 '; ...
Java并发:分布式应用限流 Redis + Lua 实践
任何限流都不是漫无目的的,也不是一个开关就可以解决的问题,常用的限流算法有:令牌桶,漏桶。在之前的文章中,也讲到过,但是那是基于单机场景来写。
之前文章:接口限流算法:漏桶算法&令牌桶算法
然而再牛逼的机器,再优化的设计,对于特殊场景我们也是要特殊处理的。就拿秒杀来说,可能会有百万级别的用户进行抢购,而商品数量远远小于用户数量。如果这些请求都进入队列或者查询缓存,对于最终结果没有任何意义,徒增后台华丽的数据。对此,为了减少资源浪费,减轻后端压力,我们还需要对秒杀进行限流,只需保障部分用户服务正常即可。
就秒杀接口来说,当访问频率或者并发请求超过其承受范围的时候,这时候我们就要考虑限流来保证接口的可用性,以防止非预期的请求对系统压力过大而引起的系统瘫痪。通常的策略就是拒绝多余的访问,或者让多余的访问排队等待服务。
分布式限流
单机限流,可以用到 AtomicInteger、RateLimiter、Semaphore 这些。但是在分布式中,就不能使用了。常用分布式限流用 Nginx 限流,但是它属于网关层面,不能解决所有问题,例如内部服务,短信接口,你无法保证消费方是否会做好限流控 ...
Ubuntu18.04 Nginx+Lua+GraphicsMagick图片缩放
自己搭建的图片服务器,有图片缩放的需求,大致思路是可以使用nginx调用lua,使用GraphicMagick的命令来做图片缩放
说明文件夹规划lua.jaychang.cn(如/var/filebase)
12345678910111213jaychang@nginx:~$ tree /var/filebase//var/filebase/├── avatar.png├── cache│ └── thumb│ ├── avatar.png_100x100.png│ └── upload│ ├── 1.png_100x100.png #固定高和宽│ ├── 1.png_400-.png # 定高│ └── 1.png_800-.png # 定宽└── upload ├── 1.png4 directories, 8 files
其中img.xyz.com为图片站点根目录cache/thumb为缩略图存放目录upload目录存放上传的图片
链接地址对应关系原图访问地址:http://img.xy ...
Lua学习笔记(6)table.sort
[TOC]
简单来说就是table.sort的第二个参数支持自定义比较函数,这类似于c++的容器支持自定义比较函数一样,代码如下:
local tbTest = {
{1, 3},
{3, 5},
{5, 4},
{2, 3},
}
– 比较函数
function cmp(a, b)
return a[2] < b[2]
end
– 通常用法
table.sort(tbTest, cmp)
深入学习
在自己工作过程中,遇到过下面两个问题
1.自定义排序算法的问题
第一个问题是:当自定义比较函数出现比较两个参数时,无法严格给出一个结果,就会出现错误。用官方的说法是比较函数需要满足非对称和传递性质。对于这两个性质,可以回忆一下中学时候学的不等式相关性质,也可以看看《c++标准程序库》中介绍的比较函数排序准则[1]。官网文档说明如下:
Note that the comp function must define a strict partial order over t ...
使用元表优化 Lua 配置文件 II
上回提到元表优化 Lua 配置文件,以减少重复字段,节省内存开销。
除了这种直接地减少内存开销的方法,使用元表还能实现数据的延迟加载,从另一个角度节约内存。
延迟加载
-- PropModel.lua
PropModel = {
[1001] = {
ID = 1001,
name = "道具1001",
desc = "道具1001描述",
...
},
[1002] = {
ID = 1002,
name = "道具1002",
desc = "道具1002描述",
...
},
...
}
上面依然是最常见的道具表,所有道具都配置在同一个表中,初始化时会全部加载进内存。
然而大多数道具是玩家并不拥有的,在内存中长期停留浪费空间。
通过使用元表,我们能做到每个道具按需(延迟)加载。
...
Lua代码规范
在公司整理了一份Lua语言的代码规范,分享一下。
写代码如同写文章,每个人或多或少都有自己的风格。我们在进行产品开发的过程中,更多的是团队上的协作与交流而非单打独斗。所以,为了 提高开发效率,降低维护成本,促进团队合作,代码的审查,整理出这篇文章。
借助于《Python风格指南》中的警告词,在此处引用一下:代码的阅读频率比编写的要高得多,本风格指南旨在通过一致性提高代码的可读性。一致性在不断增加的度量中,与其他项目、项目内以及单个模块或功能内是重要的。但是最重要的是:知道什么时候不一致,并运用你最好的判断——有时风格指南并不适用。当应用规则会降低代码的可读性时,最好打破规则。
最后,一句话送给大家:
Programming style is an art.
1. 版式1.1 基础
所有文件均采用: UTF-8 无 BOM 格式
程序块要采用 缩进风格 编写,缩进的空格数为 4个 ,对齐使用 空格键,禁用TAB键
避免使用不同编辑器阅读程序时,因TAB键设置的空格数不同而造成程序布局不整齐。
函数内代码不超过 50行 , 单行代码不超过 80列
长表达式要在 低优 ...
399. Evaluate Division
<a href="https://techlarry.github.io/tags/Leetcode/" style="color:white" class="tag"> Leetcode </a>
<a href="https://techlarry.github.io/tags/Graph/" style="color:white" class="tag"> Graph </a>
<p>Equations are given in the format <code class="codehilite">A / B = k</code>, where <code class="codehilite">A</code> and <code class="codehil ...
Programming in Lua(Thrid Edition)笔记
7 Iterators and the Generic for
用闭包编写迭代器可以存储状态,先写一个迭代器生成器,然后生成新的迭代器1234function (t) local i = 0 return function () i = i + 1; return t[i] endend
在while循环中使用迭代器1234567t = {10, 20, 30}iter = values(t)while true do local element = iter() if element == nil then break end print(element)end
generic for专为迭代器而生1234t = {10, 20, 30}for element in values(t) do print(element)end
打印文件中的每一个word1234567891011121314151617function allwords() local line = io.read() local pos = 1 -- current ...