过程

unity ios版本客户端遇到了一个很奇葩的启动就崩溃问题,崩溃的堆栈全是汇编且处于unity的c库中。通过最近修改记录,不断定位发现问题出在一个新加的c++类文件中。这个类只要有除了构造函数以外的函数定义在cpp文件中就会导致崩溃。这就有点奇葩了。最后猜想这个类名(NetworkManager)可能与unity中的重名,所以尝试修改这个类的名字。结果发现问题就解决了。这就要吐槽下了,类名重复问题编译器不是应该在链接的时候给出报错吗。就这么编译过了,浪费很多时间啊。

反思

不要定义全局类!!!

说明

本篇文章详细剖析了redis的quicklist结构。前面我们已经介绍了两种redis数据结构:adlistziplist,这两中数据结构各有各的优缺点。

  • adlist: 双向链表,任意位置插入和删除非常方便,缺点也很显而易见,任意一个node都是独立的内存块,所以内存碎片化很严重
  • ziplist:压缩双向链表,一个链表就是一整块内存,同时如果元素值为整数的话可以进一步压缩,所以很省内存;缺点就是任意一次插入删除操作都会导致重新分配内存的操作,效率不高。

quicklist结构就是adlistziplist两种结构的中间体,整个结构分为两层:外层使用类似adlist的结构串联,内层使用ziplist来节约内存

阅读全文 »

说明

本篇文章介绍redis的ziplist结构。ziplist跟zipmap一样,是在以节约内存为前提下的一个双向链表存储结构,他有着比zipmap更高的压缩率:

  • 字符串如果能转成整形的话会转成整形存储
  • 不会向zipmap一样预留free空间,所以所有插入和删除操作都会导致内存重新分配

redis在元素较少的情况下使用ziplist来替代dict

阅读全文 »

说明

本篇文章介绍redis的zipmap结构。zipmap是一个以节约内存为前提的键值对存储结构,这个结构只在内存上有优势,在查找/插入/删除/更新上跟hash表或者红黑树实现的map没有任何优势。所以只适用于元素数量比较少的情况。但实际上redis自己内部并没有使用该结构,而是使用ziplist在元素比较少的场合来替代dict。

阅读全文 »

说明

本篇文章介绍redis的hash表。redis是一个以key-value形式提供服务的内存数据库,为了快速的进行key的查找和插入,只能采用O(1)为时间复杂度的hash表结构来存放数据。所以hash表应该是redis中最重要的一个结构。

阅读全文 »

说明

本篇文章介绍redis的双向链表。redis用很简洁的代码实现了每本数据结构书籍必有的双向链表结构。可以推荐给正在学习数据结构的同学看看这代码

阅读全文 »

说明

本篇文章介绍redis中的有序集合(intset)数据结构。该结构使用连续的内存存储,所以每次插入和删除都会触发内存的分配。适合数量较小,插入和删除不平凡的时候使用,不太影响效率的同时节省内存,同时可以利用它的有序性进行高效的查找

阅读全文 »

说明

本篇文章介绍redis使用的字符串结构。redis很巧妙的在操作的指针前面增加header,并且会在尾部增加’\0’,兼容二进制的同时,也可以直接将指针传递给C库操作字符串的函数直接操作

阅读全文 »
0%