store ip ranges in Redis

store ip ranges in Redis

It depends if you consider your IP ranges can overlap or not. If not, the solution is quite simple:

      use a collection of hash to store providers data
      use a zset to index the max value of your ranges
      retrieve the (unique) range whose max value is greater than an IP
      check the the min value of this range is lower than the IP

Example:

Here are my providers. Each of them are identified with an id. Please note I could add more properties attached to each provider:

> hmset providers:1 name P1 min 3232235786 max 3232235826
OK

hmset providers:2 name P3 min 1232235786 max 1232235826
OK
hmset providers:3 name P3 min 2232235786 max 2232235826
OK
hmset providers:4 name P4 min 4232235786 max 4232235826
OK

Each time a provider is added in the system, an index must be maintained (manually: this is Redis, not a relational database). Score is the max value, member is the id of the range.

> zadd providers:index 3232235826 1 1232235826 2 2232235826 3 4232235826 4
(integer) 4

zrange providers:index 0 -1
1) "2"
2) "3"
3) "1"
4) "4"

Now to query the unique range corresponding to an IP address, you need 2 roundtrips:

> zrangebyscore providers:index 3232235787 +inf LIMIT 0 1
1) "1"

hgetall providers:1
1) "name"
2) "P1"
3) "min"
4) "3232235786"
5) "max"
6) "3232235826"

Then the client program just has to check that your IP is greater or equal than the minimum address of the returned range.

Developer Weekly 12

每个程序员都应该知道的内存知识 (带你走读Ulrich Drepper的经典论文)

Introduction to Apache Flink for Spark Developers : Flink vs Spark

Flink 源码分析 — StreamExecutionEnvironment

An iterative algorithm to generate high quality triangulated images.

代码的马斯洛金字塔

(1)第一层:正确(Correct)

代码是否执行预期的工作?是否考虑了边缘情况?是否经过充分测试?是否有可维护性?是否有可接受的性能?

(2)第二层:安全(Secure)

代码是否存在漏洞?数据是否安全存储?个人识别信息(PII)是否得到正确处理?是否对用户的输入进行了全面的验证?

(3)第三层:可读(Readable)

代码是否易于阅读和理解?测试足够简洁吗?变量、函数、类的名称是否适当?使用领域模型是否可以清晰地映射现实世界,以减少认知负担?是否使用一致的编码风格约定?

(4)第四层:优雅(Elegant)

代码是否利用了众所周知的编程模式?能否更简单简洁地实现所需的功能?你会为编写这些代码感到兴奋吗?你为这些代码感到骄傲吗?

(5)第五层:利他主义(Altruist)

别人能否从这些代码学到东西?这些代码是否会激励其他工程师进行改进?它是否会让世界变成一个更好的地方?

程序员修炼之路

线程的中断(Lock与synchronized)

Go treemux + go-pg realworld example application

论语 <先进>

子路、曾皙、冉有、公西华侍坐。子曰:“以吾一日长乎尔,毋吾以也。居则曰:“不吾知也!’如或知尔,则何以哉?”子路率尔而对曰:“千乘之国,摄乎大国之间,加之以师旅,因之以饥馑;由也为之,比及三年,可使有勇,且知方也。”夫子哂之。“求!尔何如?”对曰:“方六七十,如五六十,求也为之,比及三年,可使足民。如其礼乐,以俟君子。”“赤!尔何如?”对曰:“非曰能之,愿学焉。宗庙之事,如会同,端章甫,愿为小相焉。”“点!尔何如?”鼓瑟希,铿尔,舍瑟而作。对曰:“异乎三子者之撰。”子曰:“何伤乎?亦各言其志也。”曰:“莫春者,春服既成。冠者五六人,童子六七人,浴乎沂,风乎舞雩,咏而归。”夫子喟然叹曰:“吾与点也!”三子者出,曾皙后。曾皙曰:“夫三子者之言何如?”子曰:“亦各言其志也已矣。”曰:“夫子何哂由也?”曰:“为国以礼,其言不让,是故哂之。”“唯求则非邦也与?”“安见方六七十如五六十而非邦也者?”“唯赤则非邦也与?”“宗庙会同,非诸侯而何?赤也为之小,孰能为之大?”

继续阅读“论语 < 先进>”

岳阳楼记

范仲淹 北宋

庆历四年春,滕子京谪守巴陵郡。越明年,政通人和,百废具兴,乃重修岳阳楼,增其旧制,刻唐贤今人诗赋于其上;属予作文以记之。

予观夫巴陵胜状,在洞庭一湖。衔远山,吞长江,浩浩汤汤,横无际涯;朝晖夕阴,气象万千;此则岳阳楼之大观也,前人之述备矣。然则北通巫峡,南极潇湘,迁客骚人,多会于此,览物之情,得无异乎?

若夫霪雨霏霏,连月不开;阴风怒号,浊浪排空;日星隐曜,山岳潜形;商旅不行,樯倾楫摧;薄暮冥冥,虎啸猿啼。登斯楼也,则有去国怀乡,忧谗畏讥,满目萧然,感极而悲者矣。

至若春和景明,波澜不惊,上下天光,一碧万顷;沙鸥翔集,锦鳞游泳,岸芷汀兰,郁郁青青。而或长烟一空,皓月千里,浮光跃金,静影沉璧,渔歌互答,此乐何极。登斯楼也,则有心旷神怡,宠辱皆忘,把酒临风,其喜洋洋者矣。

嗟夫!予尝求古仁人之心,或异二者之为,何哉?不以物喜,不以己悲。居庙堂之高,则忧其民;处江湖之远,则忧其君。是进亦忧,退亦忧;然则何时而乐耶?其必曰:“先天下之忧而忧,后天下之乐而乐”欤!噫!微斯人,吾谁与归?

时六年九月十五日。

Joel 谈软件

Shlemiel得到一个在路上涂油漆的工作,他要漆在路中间的间断分隔线。第一天他拿了一罐油漆去漆好了300码的路。“做得真好!”他的老板说“你手脚真快啊!”然后就给他一个铜板。
第二天Shlemiel只漆了150码。“这样啊,没有昨天好,不过也还是很快。150码也很了不起。”也给他一个铜板。
第三天Shlemiel只漆了30码。“只有30码而已!”老板就哇哇大叫了。“这实在是无法接受!第一天你漆了十倍的长度耶!究竟怎么回事啊?”
“我也没办法啊,”Shlemiel说“我每隔一天就离油漆罐愈来愈远啊!”

Developer Weekly 11

About A community-maintained Python framework for creating mathematical animations.

Everything you need to know about Binary Search algorithm

C++ Parallel Computing and Asynchronous Networking Engine

visualising data structures and algorithms through animation

ES 学习

新型列式存储格式 Parquet 详解

Flink DataSet API编程指南

Java中对象占用内存大小计算

A High Performance Network ( TCP/IP ) Library

TETRIS-OS: An operating system that only plays Tetris.

Flink 博客

Flink源码解析-TTL

JVM 内存配置参数

一个重要的概念就是我们常常所说的设置jvm的内存参数大多关注的是堆内存的大小。
简单理解成这样:堆内存 = Old + Eden + S0 + S1 ;年轻的 = Eden(新生代) + S0 + S1 。

栈内存大小相关设置
-Xss1024k
意义: 设置线程栈占用内存大小。
默认值:不同的操作系统平台,其默认值不同。

堆内存大小相关设置

-Xms512m
意义: 设置堆内存初始值大小。
默认值:如果未设置,初始值将是老年代和年轻代分配制内存之和。

-Xmx1024m
意义: 设置堆内存最大值。
默认值:不同的操作系统平台,其默认值不同, 具体请查看官网 或者 查看讨论 How is the default Java heap size determined?
年轻代内存大小相关设置

-Xmn512m
意义: 设置新生代的初始值及最大值。
默认值:堆内存的1/4(这里要记住不是最大堆内存,还是已经分配的堆内存的1/4)。

-XX:NewSize=512m
意义:设置新生代的初始值。

-XX:MaxNewSize=512m
意义:设置新生代的最大值。

比率方式设置

-XX:NewRatio=8
意义:设置老年代和年轻代的比例。比如:-XX:NewRatio=8 表示老年代内存:年轻代内存=8:1 => 老年代占堆内存的8/9,年轻代占堆内存的1/9。
默认值:2

-XX:SurvivorRatio=32
意义:设置新生代和存活区的比例(这里需要注意的是存活区指的是其中一个)。比如:-XX:SurvivorRatio=8 表示存活区:新生代=1:8 => 新生代占年轻代的8/10,每个存活区各占年轻代的1/10。
默认值:8

-XX:MinHeapFreeRatio=40
意义:GC后,如果发现空闲堆内存占到整个预估上限值的40%,则增大上限值。
默认值:40

-XX:MaxHeapFreeRatio=70
意义:GC后,如果发现空闲堆内存占到整个预估上限值的70%,则收缩预估上限值。
默认值:70

Meta大小相关设置

-XX:MetaspaceSize=128m
意义:初始元空间大小,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:如果释放了大量的空间,就适当降低该值;如果释放了很少的空间,那么在不超过MaxMetaspaceSize时,适当提高该值。
默认值:依赖平台

-XX:MaxMetaspaceSize=256m
意义:设置元空间的最大值,默认是没有上限的,也就是说你的系统内存上限是多少它就是多少
默认值:默认没有上限,在技术上,Metaspace的尺寸可以增长到交换空间

参考链接

Java HotSpot VM Options

Java Platform, Standard Edition Tools Reference

Facebook 小红书

2012年,Facebook 发行股票上市,每个员工收到了一本小红书。

最后一页写着这样一段话:

如果我们自己不创造能够杀死 Facebook 的东西,其他人将会这样做。……互联网不是一个友善的地方。那些不重要的东西甚至都没有机会留下遗迹。它们消失得无影无踪。

曹刿论战

十年春,齐师伐我,公将战,曹刿请见。其乡人曰:“肉食者谋之,又何间焉?”刿曰:“肉食者鄙,未能远谋。”乃入见,问:“何以战。”公曰:“衣食所安,弗敢专也,必以分人。”对曰:“小惠未遍,民弗从也。”公曰:“牺牲玉帛,弗敢加也,必以信。”对曰:“小信未孚,神弗福也。”公曰:“小大之狱,虽不能察,必以情。”对曰:“忠之属也,可以一战。战则请从。”
公与之乘,战于长勺。公将鼓之。刿曰:“未可。”齐人三鼓,刿曰:“可矣。”齐师败绩。公将驰之。刿曰:“未可。”下视其辙,登轼而望之,曰:“可矣。”遂逐齐师。

既克,公问其故。对曰:“夫战,勇气也。一鼓作气,再而衰,三而竭。彼竭我盈,故克之。夫大国,难测也,惧有伏焉。吾视其辙乱,望其旗靡,故逐之。”

继续阅读“曹刿论战”