Oceanbase简介 - 笔记
数据库简介
数据库的特点
原子性 : 一笔账,要么转了,要么没转
一致性 : 出账入账必须一致
隔离性 : 多人转账不得相互影响
持久性 : 转账一旦发生,持久存在
还有两个:
高可用
高性能
数据库 vs 计算机
服务器:处理器,内存,磁盘,网卡
原子性:计算机只能保证寄存器的原子
一致性:单个服务器上数据一致性比较好做
隔离性:多个事务串行处理隔离性不好做
持久性:磁盘或者固态盘才有持久性
高可用:磁盘年均故障率1%-3%,单个磁盘可用率99%-99.9%
高性能:服务器性能
常见的防御性编程策略
针对出错之后不能恢复的情况,最好的办法是写另外一个对象,确认成功之后原子的交换对象。同时也能避免对一个对象的修改持锁时间过长。这种思路广泛用在很多地方。
保存备份文件,当前的文件有可能有人在读在写,所以每次线程都写一个单独的备份文件,最后原子的覆盖之前的文件。
升级系统。自动升级的时候下载了新的可执行文件,然后删除原来的文件,替换成下载文件。当然估计不会有人直接覆盖之前的文件。
一些NOSQL的冻结。OB里面比较典型的就是UpdateServer的内存冻结,当然是copy on write实现的,最后原子的切换B树的根指针。主要是为了minor fqreeze的时候依然能提供写入服务。
=运算符重载的时候,如果当前类持有的对象先释放了,但是又没能成功复制需要拷贝的对...
vim7.4 && vimgdb编译
首先,你下载的vim7.4代码的一般结构跟常见的工程是不一样的,主要体现在configure不会生成Makefile,make的时候是通过Makefile的配置生成config.h的,也就是说你想的好好的希望如下操作:
./configure --prefix=$HOME --with-features=huge --enable-multibyte --enable-pythoninterp --enable-cscope --enable-fontset --enable-gdb --enable-largefile \
--enable-gui=gnome2 \
--enable-luainterp \
--enable-tclinterp \
--with-pyth...
总结Oceanbase编码中需要注意的一些细节
所有指针使用之前都需要判断是否为NULL,尤其是如果有IF分支的情况下,如:
if (it != NULL)
{
xxx
}
else
{
it不能再使用了
}
不要使用strcpy而应该使用strncpy。
所有成员函数都应该考虑是否为const函数.
所有函数都需要判断传入值是否有效。
有返回值的函数,需要先定义返回值的默认值,不能直接返回中间结果。比如:
//这样是很容易造成问题的
int * xxx(xxx)
{
int* it = NULL;
for(int * it =xxx;it != xxx; it ++...
用树莓派和DS18B20监控温度变化
基本的教程在这里:
引脚定义
传感器教程1
传感器教程2
鉴于我的硬件水平只限于插板子焊板子和对针脚,其他的都还给数电模电老师了,我还是老老实实买了模块,省的自己焊电阻。
芯片,模块都是淘宝买的,随便搜一家就行,几块钱的东西一般不会有假的。
整个过程可以按照教程1,2 对应针脚完成,如果顺利基本一次成功。别人的知识产权我就不好摘录了。但是代码我优化了一下,硬件工程师的代码果然是写的异常粗犷。修改后的代码如下:
#!/usr/bin/python
#coding=utf-8
#Filename:temperature.py
import os,datetime,time
def calc_temperature(filename):
...
OB的Offset和Limit
数据库的实现里面很重要的两个功能就是Limit和Offset,在web里面,这是分页的基本功能依赖。对于用户来说,一屏不可能显示全部的数据,所以数据请求可以拆散成多个,每次从上次的offset开始读取下一个limit的数据。有些情况下, 我们不需要知道一共有多少数据,只需要循环获取并统计期望的数据和得到的数据,直到两个不匹配。在实际web使用中,这种策略一般不使用,因为预先知道分页数。当然我也真见过这么用的,这nm简直就是无底洞。不知道点到什么时候是个头。
相应的,正常的策略我们是需要知道数据有多少页的。也就有如下几种策略:
最烂的实现当然是直接刷出所有数据分页显示其他隐藏。其实数据量如果确实很小的情况下,这样也合理。提高响应速度。
发一条count()先统计所有数据,然...
用来把一个线程的日志输出到单独文件的脚本
很多开源项目的日志都是把多个线程的日志打印到一个文件的,有时候我们需要查看一个线程号下的所有日志,vim选中高亮线程号固然是一种方法,但是看起来不直观,以下脚本完成输出一个线程所有日志到一个文件的功能。
"plugin-写一个线程的log到单独文件
function! ThreadLog()
let file = readfile(expand("%:p"))
let pattern = expand('<cword>')
let matches = []
for line in file
let match = matchstr(line, pattern)
if(!empty(match))
...
转载王垠的一段话
王垠虽然挺扯,这段话还是有道理的:
我对清华,还有 Princeton,Harvard,MIT,Stanford,Berkeley,CMU 等学校的学生都有了解。这些所谓的“世界一流大学”或者“世界一流大学 wannabee”差不多都是类似的气氛。你冲着它们的名气和“关系网”挤破了头皮进去,然后就每天有人在你耳边对其它人感叹:哇,他好牛啊!发了好多 paper,还得了XX奖。跟参加传销大会似的,让你怀疑这些人还有没有自尊。然后就是填鸭式的教育,无止境的作业和考试,让你感觉他们不是在“教育”你,而是在“筛选”你。这种筛选总是筛掉最差的,但也筛掉最好的。因为最好的学生能意识到你在干什么,他们不给你筛选他们的机会。一旦发现其实没学到东西,中途就辍学出去创业了。所以剩下来的就是最一般的,循规...
506 post articles, 64 pages.