首页
关于
Search
1
Lua使用调试库hook函数调用
475 阅读
2
傻瓜式快速搭建l2tp
401 阅读
3
游戏邮件系统数据设计因素
370 阅读
4
Linux内核数据结构kfifo小结(TODO)
338 阅读
5
傻瓜式安装chatgpt-web工具
320 阅读
项目技术
项目思考
开发环境
数据库
编程语言
生活与阅读
哲学
登录
Search
标签搜索
nodejs
npm
Typecho
累计撰写
55
篇文章
累计收到
47
条评论
首页
栏目
项目技术
项目思考
开发环境
数据库
编程语言
生活与阅读
哲学
页面
关于
搜索到
54
篇与
的结果
哈希冲突TODO
设计哈希表时,选择不同的哈希函数有不同性能表现。重点在于哪种散列函数可以有效避免冲突。如果出现了冲突,一般都有哪些冲突解决办法。线性探测二次探测开链法(GCC使用的SGI版本STL就是基于此方法) 虽然开链法并不要求表格大小必须为质数,但SGI STL 仍然以质数来设计表格大小,并且将28个质数(逐渐呈现大约两倍的关系)计算好,以备随时访问,同时提供一个函数,用来查询在这28个质数之中,“最接近某数并大于某数”的质数。在JDK8以前也是使用链表来处理冲突。JDK8以后在链表超过8时使用平衡树来存储。建议使用头插法而不是尾插法入链。因为最近增加的元素有很大概率被下次访问。常见的哈希算法:MD5SUM、SHA1、DJBX33A(Java HashCode)、CRC32(部分硬件原语加速)、CRC16、MurMurHash(速度比MD5快)、SipHash(Redis\Python使用)哈希算法从安全性又可以分两类加密哈希函数如SHA非加密哈希函数。服务器中使用哈希算法需要考虑:哈希攻击(hash flooding attack)。不要对不明数据进行哈希。而MurMurHash和SipHash使用了种子的概念实现随机化哈希,增加了攻击的难度。因此SipHash也被称为带密钥哈希算法(Keyed Hash Function),天生免疫哈希攻击。加盐哈希方案。通过增加一些随机的盐参数,把需要加密的账号密码更安全的存储。
2021年06月26日
24 阅读
0 评论
0 点赞
Groovy语法
Groovy运行于Java虚拟机上的,所以语法也自然支持Java语法。他也有对Java语法的扩展。注意Java是静态强类型语言, 而Groovy是一个动态强类型语言。前面也已经说了他是运行于Java虚拟机上的,自动是需要安装JVM环境的。更具体的安装可以参考官网方法。如果只是为了熟悉其语法,更便捷的办法是使用线上IDE学习。比如这个:https://groovyide.com/cpi变量定义关键字def:def str = "hello world";// 定义一个字符串 def str2 = "${str}!"; // 字符串支持插值 println(str2); // 一个跨行长字符串,不支持插值 def str3 = ''' 1)正式后台 2)测试后台 '''; print(str3.replaceAll('\\s+','').trim());查看动态类型信息和断言使用 // 查看动态类型信息和断言使用 def mixed = 1; assert mixed.class == java.lang.Integer; mixed = "str"; assert mixed.class == java.lang.String; //函数调用时,参数可以不使用括号 println mixed.class.name assert mixed.class == java.lang.Integer:"not a integer" assert mixed.getClass() == java.util.HashMap : "not valid select" assert backends instanceof java.lang.Integer : "not a Integer"支持Java写法, 注意数据和字典都是使用[]符号定义,只是后者还需要使用:指定valuedef dict = ['name':'john','age':14,'sex':'boy']; //println dict dict.each{ def kv = String.format("%s == %s", it.getKey(), it.getValue()); println kv; }支持闭包
2021年06月26日
26 阅读
0 评论
0 点赞
Redis在游戏的运用(二)
在读多写少的场景,有必要进行热点数据的缓存。缓存可以有效减少DB的读压力。这样的解决方案常见的DB也是具备的。不管是Redis还是MySQL或者是MongoDB, 都有复制集群的概念。只要使用从节点读数据,主节点写数据即可。MongoDB Atlas号称可以秒级别内同步新数据到从节点。这种方案也可以称为主写从读实现读写分离。说完减少主节点压力的优点,缺点也由此引入。这种方案只能实现数据的最终一致性,无法实现强一致性。DB数据的写入一般如下:应用层insert/update/delete返回时只是更新cache和Redo,Undo日志(在Mongodb中是更新oplog),并没有真正写入磁盘。主从binaryLog/Oplog同步延迟。比如机房间网络延迟问题、服务器负载问题等。即使忽略上面同步延迟问题,是不是就没有其他问题了?DB内部的缓存模块对热点数据的定义是死的,他缓存的数据可能不是我们我们认为的热点数据。因为他负责了多个维度数据的读写。比如我只访问了一次的数据,可能因为LRU原因,真正频繁热点数据被置换出缓存。有时我们想自己定义热点数据,比如近期1小时登录的玩家(这里不仅仅包含当前在线玩家)。这里补充扩展下有意思点,MySQL使用了自己改进后的LRU算法,使用了热数据插入队列前进5/8位置。这种优化可以屏蔽全表等大面积遍历引起热点数据的完全失效。于是引进了Redis这类内存DB。在进行写时,如果是需要强一致性。先删除Redis缓存(强迫读请求去DB加载)写入DB(写入会有锁,此时会阻塞读)再删除Redis缓存(即使有读请求在1和2的过程中取到旧数据,这里也会让旧缓存失效)如果需要最终一致性:设置缓存过期时间写入DB总是先尝试更新Redis数据再进行DB更新。如果Redis没有对应数据时可以考虑不进行写入的。因为可能不是热点数据>。另外如果宕机,连接不上也不需要进行更新Redis缓存。在进行读操作时,总是先尝试从Redis中取。如果没有再从DB取。这里要使用布隆过滤防止缓存穿透问题。从DB取数据返回时也写入Redis缓存。这里要注意两个问题:缓存击穿问题:对一个数据有并发多个请求加载。此时要排队加锁。真正进入DB加载时总是先尝试Redis取。更新Redis时缓存雪崩问题。数据过期时间最好进行一个随机,防止某个时间大量数据同时过期而缓存失效。
2021年06月26日
161 阅读
0 评论
0 点赞
2021-06-26
MongoDB内存分析实践
问题现象:外服120W数据DB>使用了12GB内存,但同样的数据导入一个开发实例,只占用了5GB
2021年06月26日
143 阅读
0 评论
0 点赞
关于IRQ亲和性资料整理笔记
中断处理也是可以设置更倾向在哪个CPU核心处理的。碰到这个问题是来自于中断机制一次QQ聊天中。在中断被频繁触发时CPU会处理不过来,常见的现象是网卡不能满负荷的跑,达到一定流量后出现了丢包。这又要从网卡接收数据开始说起。 网卡驱动启动时就会注册硬中断回调同时准备好sk_buffer。在网络包来的时候NIC会通过DMA(Direct Memory Access,不经过CPU的内存复制,也称零拷贝)把数据包从NIC内部缓存区复制到之前准备好的sk_buffer中(如果此时sk_buffer不足是会丢包,对应ifconfig命令overruns指标)。之后NIC产生一个硬中断。硬中断处理程序只会处理关键性的、短时间内可以处理完的工作,剩余耗时较长工作,会放到中断之后,由软中断来完成。硬中断也被称为上半部分。CPU收到硬中断,根据中断描述符表(Interrupt Descriptor Table,IDT)找到处理函数并调用。最后触发NET_RX_SOFTIRQ软中断处理sk_buffer中的数据(如果软中断处理不及时,轮询时CPU对应的接收队列超过netdev_max_backlog也会丢包),然后再交给内核协议栈解析处理,协议栈会得到sk_buffer,经过处理后进入socket buffer, 最后用户态取得数据。对于多队列(RSS特性)网卡, 每个队列对对应一个中断号。因为中断号的不同,可以设置不同的CPU亲和性。这样在单核CPU无法跟上网卡速度的问题就通过多核解决了。对于单队列网卡一般使用RPS+RFS配合使用。RPS(Receive Packet Steering)帮助单队列网卡将其产生的SoftIRQ分派到多个CPU内核进行处理。RFS(Receive Flow Steering)能够保证处理软中断和处理应用程序是同一个CPU,达到局部性原理。通过ethtool -S ens5可以看到各队列信息queue_{idx}_*。ls /sys/class/net/ens5/queues/在机器CPU处理很多计算任务,CPU压力紧张的情况下扩展多队列网卡是没有效果的,多队列网卡就是要通过消耗更多的CPU来提高网络性能,此时CPU压力更大,会影响计算业务。最佳实践方式是通过设定中断亲和性(修改/proc/irq/{IRQ_ID}/smp_affinity配置)把业务进程的亲和性(taskset命令)绑定到不同的CPU上,这样不会相互影响。IRQ_ID可以通过grep ens5 /proc/interrupts得到,具体设置方法网上很多。除了top可以查询中断处理统计,mpstat -P ALL 1更加具体
2021年06月26日
76 阅读
0 评论
0 点赞
1
...
9
10
11