近月学习记录(一)
最近换了一个公司,确切来说应该是进入了一个新的行业,很多东西的学习都是从0开始的,学的东西很多很杂,先分点记下,以便以后复习回忆或者近一步学习
1.key-value数据库
像redis,memcached都是这样的数据库,网上有一篇小日本的文章,写得很详细很好,虽然是小日本的,但也只能将就一下了
memcached全面剖析系列
再说一下学习中了解到它的一些特点(可能有些不准确的地方):
1.它像一个大map,所有的内容都是键值对
2.它的所有内容都是放内存中的,但可以用其他的辅助手段做持久化
3.因为是操作内存的,而且只有纯粹的操作,没有任何额外的过程(像sql的编译),所以它很快,快得难以想象,但这个快是以牺牲很多其他的东西为代价的
4.它难以维护,它没有图形化操作工具,这也很容易理解,像我们想去像维护sql数据库一样维护一个map,你能有什么好办法吗?
5.没有数据完整性之类的概念,所有逻辑上的关联都是人为地去维护的,所以让它更进一步难以维护。
6.因为它的所有数据都放在内存中的,所以数据库服务器崩溃对数据的影响几乎是致命的(即使你使用了一些持久化的办法)
7.它也算个新生的东西,所以很多东西很不完善,像memcached的协议还是只有文本形式的,二进制协议正在制定中。
8.memcached集群默认中的一致性hash的用的是一个圆圈形的连续的hash值,服务器对应的hash值一般是不连续的,动态增减服务器会变得很方便。具体可以看小日本的文章
9.数据库服务器的主要硬件消耗是内存,而非cpu,小日本的文章也说了,cpu使用率几乎为0
10.它与sql数据库的区别也是很明显的,它更注重的是简单而高效。
近日用这种数据库进行了一些开发,也获得了一些经验和收获
1.虽然数据库没有提供主键外键这样一些的关联,但事实上是需要的,这时我们会人为的去维护这样一个关系,如存入一个对象,对象中带着一个list,这个list中可以索引到另外的一些key值,我们人为地使用一些原子操作去维护他们之前的关系(可以看到它的不稳健性),实质上是将数据库的一些工作由我们人为地去维护了。
2.在分布式的架构中,对整个应用的同步操作可以通过数据库来做,在思考模式上,与传统的单机上的并发是完全不一样的。
举个例子:
下面是proto文件的内容,上面的java代码引用的是编译后的代码
很失望~真的没做压缩,只是按照文档所说的,当成了“Length-delimited”,然后再进行编码,结果如下:
0a:04:01:00:00:01
把package去掉看看?
08:01:08:00:08:00:08:01
完全按单个的形式来编码的~~
至此,protobuf已基本明晰了,包括一些细节,如
enum:按varint编码
repeat非package:当成“Length-delimited”,再按varint进行编码
只是repeat:按正常编码,然后用同一个索引
总的来说,对文档的解读算是全部明晰了,但对google的神话也有点失望
再看看易用性
protobuf生成的类其实就是一个DTO,因为它是由编译生成的,所以为了以后扩展方便,我们不能修改它,这样想使用它就有两种方式(如果你之前设计中没有DTO的概念),一种是继承它(缺点是代码后期会稍微有点乱),一种是做一次拷贝(条理较为清晰,但效率上显然会稍慢,毕竟多一次对象拷贝的过程)
如果本身就有DTO,那就简单了,只需要替换DTO就ok了
3.java与c的对接
1.c的char是一个byte的,但java的是两个
2.c中对多个byte的数据类型的编码会根据环境的不同而不同,java则默认就是网络序,而网络序就是我们正常的读取习惯(这个序特别容易搞乱,尤其是自己code的时候,建议写单元测试用ByteBuffer进行验证一下)