加入收藏 | 设为首页 | 会员中心 | 我要投稿 莆田站长网 (https://www.0594zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长资讯 > 动态 > 正文

强大的 IDEA 代码生成器

发布时间:2021-02-07 15:25:13 所属栏目:动态 来源:互联网
导读:2.2.2 优点 为什么Redis要自己实现SDS而不是直接用C的字符串呢?主要是因为以下几点。 减少获取字符串长度开销 C语言中获取字符串的长度需要遍历整个字符串,直到遇到结束标志位,时间复杂度为O(n),而SDS直接维护了长度的变量,取长度的时间复杂度为O(1)

2.2.2 优点

为什么Redis要自己实现SDS而不是直接用C的字符串呢?主要是因为以下几点。

  • 减少获取字符串长度开销 C语言中获取字符串的长度需要遍历整个字符串,直到遇到结束标志位,时间复杂度为O(n),而SDS直接维护了长度的变量,取长度的时间复杂度为O(1)
  • 避免缓冲区溢出 C语言中如果往一个字节数组中塞入超过其容量的字节,那么就会造成缓冲区溢出,而SDS通过维护free变量解决了这个问题。向buf数组中写入数据时,会先判断剩余的空间是否足够塞入新数据,如果不够,SDS就会重新分配缓冲区,加大之前的缓冲区。且加大的长度等于新增的数据的长度
  • 空间预分配&空间惰性释放 C语言中,每次修改字符串都会重新分配内存空间,如果对字符串修改了n次,那么必然会出现n次内存重新分配。而SDS由于冗余了一部分空间,优化了这个问题,将必然重新分配n次变为最多分配n次,而数据从buf中移除的时候,空闲出来的内存也不会马上被回收,防止新写入数据而造成内存重新分配
  • 保证二进制安全 C语言中,字符串遇到会被截断,而SDS不会因为数据中出现了而截断字符串,换句话说,不会因为一些特殊的字符影响实际的运算结果

可以结合下面的图来理解SDS。
 

可能大多数的人只是到用一用的地步,这也无可厚非,但是如果是作为一个对技术有追求的开发,或者说你有想近大厂的想法,一定要有刨根问底的精神。只有当你真正知道一个东西的底层原理时,你遇到问题时才能提供给你更多的思路去解决问题。接下来我们就来聊一下Redis中String底层是如何实现的。

2.2 原理

2.2.1 结构

我们知道Redis是用C语言写的,但是Redis却没有直接使用,而是自己实现了一个叫SDS(Simple Dynamic String)的结构来实现字符串,结构如下。
 

会使用trap捕获信号,并在接受到终止信号时执行一些收尾工作

使用mktemp生成临时文件或文件夹

利用/dev/null过滤不友好的输出信息

会利用命令的返回值判断命令的执行情况

使用文件前要判断文件是否存在,否则做好异常处理

不要处理ls后的数据(比如ls -l | awk ‘{ print $8 }’),ls的结果非常不确定,并且平台有关

读取文件时不要使用for loop而要使用while read

使用cp -r命令复制文件夹的时候要注意如果目的文件夹不存在则会创建,如果存在则会复制到该文件的子文件夹下

静态检查工具shellcheck

概述

为了从制度上保证脚本的质量,我们最简单的想法大概就是搞一个静态检查工具,通过引入工具来弥补开发者可能存在的知

市面上对于shell的静态检查工具还真不多,找来找去就找到一个叫shellcheck的工具,开源在github上,有8K多的star,看上去还是十分靠谱的。我们可以去他的主页了解具体的安装和使用信息。

安装

这个工具的对不同平台的支持力度都很大,他至少支持了Debian,Arch,Gentoo,EPEL,Fedora,OS X,openSUSE等等各种的平台的主流包管理工具。安装方便。具体可以参照安装文档

集成

既然是静态检查工具,就一定可以集成在CI框架里,shellcheck可以非常方便的集成在Travis CI中,供以shell脚本为主语言的项目进行静态检查。

样例

在文档的Gallery of bad code里,也提供了非常详细的“坏代码”的标准,具有非常不错的参考价值,可以在闲下来的时候当成”Java Puzzlers“之类的书来读读还是很惬意的。

本质

不过,其实我觉得这个项目最最精华的部分都不是上面的功能,而是他提供了一个非常非常强大的wiki。在这个wiki里,我们可以找到这个工具所有判断的依据。在这里,每一个检测到的问题都可以在wiki里找到对应的问题单号,他不仅告诉我们”这样写不好”,而且告诉我们”为什么这样写不好”,”我们应当怎么写才好”,非常适合刨根问底党进一步研究。

(编辑:莆田站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读