用HSCALE实现MySQL的数据分布式存储

 

针对单个表过大造成的性能问题,MySQL在5.1开始引入了分区表(partition),可以将数据在内部拆分存储,对应用透明,但是分区表只能将表在同一个数据库内部分解,而且对于表的维护(比如执行alter table)还是比较麻烦。手工分表也是一个解决方法,手工分表还有一个好处是可以将表分布到不同的服务器中,实现分布式存储。但是手工分表要求应用程序做相应的改写,以支持从不同的表中来存取数据。

HSCALE简单来说就是一个支持手工分表的中间层,对于应用来说看起来还是一个表,而由HSCALE来负责底层子表的数据存取。HSCALE是基于MySQL Proxy的一个插件应用,通过MySQL Proxy的lua脚本拦截分拆对应的SQL语句来实现数据的分布存储,而且使用lua脚本可以自由定制分表策略,比起MySQL自己的partition更加灵活些。现在版本还是0.2,功能有限,只能实现同库分表,但是基于MySQL Proxy的架构,未来要实现示分库分表也不是什么难事。

作者利用mysqlslap对HSCALE和MySQL Proxy做了几组性能测试,结果参考这里,还有这里

当然,现在MySQL Proxy和HSCALE都是刚刚起步,要在产品库中应用还有很长的一段路要走,从上面的性能测试中可以看到基于最新的MySQL Proxy 0.7版的HSCALE性能有了较大的提升,期待后续版本有更好的表现。

好的,下面是一份使用C语言和GTK+编写的基本MP3播放器。需要在Linux系统下编译运行,同时需要安装GTK+和GStreamer库。 ```c #include <gtk/gtk.h> #include <string.h> #include <gst/gst.h> GtkWidget *window, *vbox, *hbox1, *hbox2, *hbox3, *hbox4, *label, *button1, *button2, *button3, *button4, *button5, *button6, *button7, *button8, *scale; GstElement *playbin; gfloat volume = 0.5; void on_window_destroy(GtkWidget *widget, gpointer data) { gtk_main_quit(); } void play_music() { gchar *file_uri = g_strdup_printf("file://%s", "./Music/test.mp3"); g_object_set(playbin, "uri", file_uri, NULL); gst_element_set_state(playbin, GST_STATE_PLAYING); g_free(file_uri); } void pause_music() { gst_element_set_state(playbin, GST_STATE_PAUSED); } void resume_music() { gst_element_set_state(playbin, GST_STATE_PLAYING); } void stop_music() { gst_element_set_state(playbin, GST_STATE_NULL); } void set_volume(gfloat value) { volume = value; g_object_set(G_OBJECT(playbin), "volume", volume, NULL); } void play_next() { stop_music(); } void play_previous() { stop_music(); } void set_repeat_mode() { g_print("已设置为列表循环模式\n"); } void set_shuffle_mode() { g_print("已设置为随机播放模式\n"); } void init_gstreamer() { GstBus *bus; GstMessage *msg; gst_init(NULL, NULL); playbin = gst_element_factory_make("playbin", NULL); bus = gst_element_get_bus(playbin); gst_bus_add_watch(bus, (GstBusFunc) gst_bus_cb, NULL); gst_object_unref(bus); } void on_button_clicked(GtkWidget *widget, gpointer data) { gchar *button_name = gtk_button_get_label(GTK_BUTTON(widget)); if (strcmp(button_name, "开始播放") == 0) { play_music(); } else if (strcmp(button_name, "暂停播放") == 0) { pause_music(); } else if (strcmp(button_name, "继续播放") == 0) { resume_music(); } else if (strcmp(button_name, "单曲播放") == 0) { g_print("已设置为单曲播放模式\n"); } else if (strcmp(button_name, "列表循环") == 0) { set_repeat_mode(); } else if (strcmp(button_name, "随机播放") == 0) { set_shuffle_mode(); } else if (strcmp(button_name, "上一首") == 0) { play_previous(); } else if (strcmp(button_name, "下一首") == 0) { play_next(); } else if (strcmp(button_name, "退出系统") == 0) { stop_music(); gtk_main_quit(); } } int main(int argc, char *argv[]) { gtk_init(&argc, &argv); init_gstreamer(); window = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_title(GTK_WINDOW(window), "MP3 Player"); gtk_window_set_default_size(GTK_WINDOW(window), 300, 200); g_signal_connect(window, "destroy", G_CALLBACK(on_window_destroy), NULL); vbox = gtk_vbox_new(FALSE, 10); hbox1 = gtk_hbox_new(FALSE, 10); hbox2 = gtk_hbox_new(FALSE, 10); hbox3 = gtk_hbox_new(FALSE, 10); hbox4 = gtk_hbox_new(FALSE, 10); label = gtk_label_new("音量控制"); gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); scale = gtk_hscale_new_with_range(0, 1, 0.1); gtk_scale_set_value_pos(GTK_SCALE(scale), GTK_POS_RIGHT); gtk_scale_set_digits(GTK_SCALE(scale), 1); gtk_scale_set_value(GTK_SCALE(scale), volume); g_signal_connect(scale, "value-changed", G_CALLBACK(set_volume), NULL); gtk_box_pack_start(GTK_BOX(vbox), scale, FALSE, FALSE, 0); button1 = gtk_button_new_with_label("开始播放"); g_signal_connect(button1, "clicked", G_CALLBACK(on_button_clicked), NULL); gtk_box_pack_start(GTK_BOX(hbox1), button1, TRUE, TRUE, 0); button2 = gtk_button_new_with_label("暂停播放"); g_signal_connect(button2, "clicked", G_CALLBACK(on_button_clicked), NULL); gtk_box_pack_start(GTK_BOX(hbox1), button2, TRUE, TRUE, 0); button3 = gtk_button_new_with_label("继续播放"); g_signal_connect(button3, "clicked", G_CALLBACK(on_button_clicked), NULL); gtk_box_pack_start(GTK_BOX(hbox1), button3, TRUE, TRUE, 0); button4 = gtk_button_new_with_label("单曲播放"); g_signal_connect(button4, "clicked", G_CALLBACK(on_button_clicked), NULL); gtk_box_pack_start(GTK_BOX(hbox2), button4, TRUE, TRUE, 0); button5 = gtk_button_new_with_label("列表循环"); g_signal_connect(button5, "clicked", G_CALLBACK(on_button_clicked), NULL); gtk_box_pack_start(GTK_BOX(hbox2), button5, TRUE, TRUE, 0); button6 = gtk_button_new_with_label("随机播放"); g_signal_connect(button6, "clicked", G_CALLBACK(on_button_clicked), NULL); gtk_box_pack_start(GTK_BOX(hbox2), button6, TRUE, TRUE, 0); button7 = gtk_button_new_with_label("上一首"); g_signal_connect(button7, "clicked", G_CALLBACK(on_button_clicked), NULL); gtk_box_pack_start(GTK_BOX(hbox3), button7, TRUE, TRUE, 0); button8 = gtk_button_new_with_label("下一首"); g_signal_connect(button8, "clicked", G_CALLBACK(on_button_clicked), NULL); gtk_box_pack_start(GTK_BOX(hbox3), button8, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(hbox4), gtk_label_new(""), TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox1, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox2, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox3, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox4, TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(window), vbox); gtk_widget_show_all(window); gtk_main(); return 0; } ``` 以上代码实现了一个简单的MP3播放器,包括音乐播放、暂停、继续、停止、上一首、下一首、列表循环、随机播放、音量控制和退出系统等功能。可以根据需要进行修改和扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值