[ja] apply patch
This commit is contained in:
229
ja/ebook/05.6.md
229
ja/ebook/05.6.md
@@ -1,115 +1,114 @@
|
|||||||
# 5.6 NOSQLデータベースの操作
|
# 5.6 NOSQLデータベースの操作
|
||||||
NoSQL(Not Only SQL)とは、リレーション型ではないデータベースのことを言います。Web2.0の高まりにしたがって、伝統的なリレーショナルデータベースがWeb2.0ページに使われています。特にとても大きな規模で高度にマルチスレッドなSNS型のWeb2.0の純粋な動的ホームページでは明らかに力不足となっています。多くの解決が難しい問題が暴露され、リレーショナルでないデータベースはその特徴から非常に早く発展してきています。
|
NoSQL(Not Only SQL)とは、リレーション型ではないデータベースのことを言います。Web2.0の高まりにしたがって、伝統的なリレーショナルデータベースがWeb2.0ページに使われています。特にとても大きな規模で高度にマルチスレッドなSNS型のWeb2.0の純粋な動的ホームページでは明らかに力不足となっています。多くの解決が難しい問題が暴露され、リレーショナルでないデータベースはその特徴から非常に早く発展してきています。
|
||||||
|
|
||||||
Go言語は21世紀のC言語として、NOSQLもとてもよくサポートしています。現在流行しているNOSQLには主にredis、mongoDB、CassandraとMembase等があります。これらのデータベースはどれも高性能、マルチスレッドといった特徴があり、現在すでに広くあらゆるアプリケーションの中で使用されています。ここでは主にredisとmongoDBの操作についてご説明します。
|
Go言語は21世紀のC言語として、NOSQLもとてもよくサポートしています。現在流行しているNOSQLには主にredis、mongoDB、CassandraとMembase等があります。これらのデータベースはどれも高性能、マルチスレッドといった特徴があり、現在すでに広くあらゆるアプリケーションの中で使用されています。ここでは主にredisとmongoDBの操作についてご説明します。
|
||||||
|
|
||||||
## redis
|
## redis
|
||||||
redisはkey-valueを保存するシステムです。Memcachedに似ていて、保存されるvalue型はもっと多く、string(文字列)、list(リスト)、set(集合)とzset(順序付きset)を含みます。
|
redisはkey-valueを保存するシステムです。Memcachedに似ていて、保存されるvalue型はもっと多く、string(文字列)、list(リスト)、set(集合)とzset(順序付きset)を含みます。
|
||||||
|
|
||||||
現在redisが最もよく使われているのは新浪のマイクロブログプラットフォームでしょう。その次にFacebookに買収された画像フォーラムであるinstagramがあります。その他有名な[インターネット企業](http://redis.io/topics/whos-using-redis)もそうです。
|
現在redisが最もよく使われているのは新浪のマイクロブログプラットフォームでしょう。その次にFacebookに買収された画像フォーラムであるinstagramがあります。その他有名な[インターネット企業](http://redis.io/topics/whos-using-redis)もそうです。
|
||||||
|
|
||||||
Goは現在redisのドライバで以下をサポートしています
|
Goは現在redisのドライバで以下をサポートしています
|
||||||
- https://github.com/alphazero/Go-Redis
|
- https://github.com/alphazero/Go-Redis
|
||||||
- http://code.google.com/p/tideland-rdc/
|
- http://code.google.com/p/tideland-rdc/
|
||||||
- https://github.com/simonz05/godis
|
- https://github.com/simonz05/godis
|
||||||
- https://github.com/hoisie/redis.go
|
- https://github.com/hoisie/redis.go
|
||||||
|
|
||||||
現在私がforkした最新のドライバではいくつかのbugが修正されています。現在私自身の短縮ドメイン名サービスのプロジェクトの中で使用されています。(毎日200WぐらいのPV数があります。)
|
現在私がforkした最新のドライバではいくつかのbugが修正されています。現在私自身の短縮ドメイン名サービスのプロジェクトの中で使用されています。(毎日200WぐらいのPV数があります。)
|
||||||
|
|
||||||
https://github.com/astaxie/goredis
|
https://github.com/astaxie/goredis
|
||||||
|
|
||||||
以降では私がforkしたこのredisドライバでどのようにデータの操作を行うかご紹介します。
|
以降では私がforkしたこのredisドライバでどのようにデータの操作を行うかご紹介します。
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/astaxie/goredis"
|
"github.com/astaxie/goredis"
|
||||||
"fmt"
|
"fmt"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
var client goredis.Client
|
var client goredis.Client
|
||||||
//文字列操作
|
// ポートをredisのデフォルトポートに設定
|
||||||
var client goredis.Client
|
client.Addr = "127.0.0.1:6379"
|
||||||
client.Set("a", []byte("hello"))
|
|
||||||
val, _ := client.Get("a")
|
//文字列操作
|
||||||
fmt.Println(string(val))
|
client.Set("a", []byte("hello"))
|
||||||
client.Del("a")
|
val, _ := client.Get("a")
|
||||||
|
fmt.Println(string(val))
|
||||||
//list操作
|
client.Del("a")
|
||||||
|
|
||||||
var client goredis.Client
|
//list操作
|
||||||
vals := []string{"a", "b", "c", "d", "e"}
|
vals := []string{"a", "b", "c", "d", "e"}
|
||||||
for _, v := range vals {
|
for _, v := range vals {
|
||||||
client.Rpush("l", []byte(v))
|
client.Rpush("l", []byte(v))
|
||||||
}
|
}
|
||||||
dbvals,_ := client.Lrange("l", 0, 4)
|
dbvals,_ := client.Lrange("l", 0, 4)
|
||||||
for i, v := range dbvals {
|
for i, v := range dbvals {
|
||||||
println(i,":",string(v))
|
println(i,":",string(v))
|
||||||
}
|
}
|
||||||
client.Del("l")
|
client.Del("l")
|
||||||
}
|
}
|
||||||
|
|
||||||
redisの操作が非常に簡単だとお分かりいただけたかと思います。実際のプロジェクトの中で使用していますが、性能も非常に高いのです。clientのコマンドとredisのコマンドは基本的に同じです。ですので元のredisの操作と非常によく似ています。
|
redisの操作が非常に簡単だとお分かりいただけたかと思います。実際のプロジェクトの中で使用していますが、性能も非常に高いのです。clientのコマンドとredisのコマンドは基本的に同じです。ですので元のredisの操作と非常によく似ています。
|
||||||
|
|
||||||
## mongoDB
|
## mongoDB
|
||||||
|
|
||||||
MongoDBは高性能でオープンソース、モードレスなドキュメント型データベースです。これはリレーショナルデータベースとノンリレーショナルデータベースの間のプロダクトです。ノンリレーショナルデータベースの中では機能が最も豊富で、リレーショナルベースに最もよく似ています。サポートされるデータ形式は非常にルーズで、jsonによく似たbjson形式によってデータを保存します。そのため、比較的複雑なデータを保存することができます。Mongoの最大の特徴は検索言語が非常に強力でその文法がオブジェクト指向の検索文に少し似ていることです。データベースに対してインデックスを設定することもできます。
|
MongoDBは高性能でオープンソース、モードレスなドキュメント型データベースです。これはリレーショナルデータベースとノンリレーショナルデータベースの間のプロダクトです。ノンリレーショナルデータベースの中では機能が最も豊富で、リレーショナルベースに最もよく似ています。サポートされるデータ形式は非常にルーズで、jsonによく似たbjson形式によってデータを保存します。そのため、比較的複雑なデータを保存することができます。Mongoの最大の特徴は検索言語が非常に強力でその文法がオブジェクト指向の検索文に少し似ていることです。データベースに対してインデックスを設定することもできます。
|
||||||
|
|
||||||
下の図はmysqlとmongoDBの間の対応関係を示しています。非常に簡単だとわかりますが、mongoDBの性能は非常に良いです。
|
下の図はmysqlとmongoDBの間の対応関係を示しています。非常に簡単だとわかりますが、mongoDBの性能は非常に良いです。
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
図5.1 MongoDBとMysqlの操作の対応図
|
図5.1 MongoDBとMysqlの操作の対応図
|
||||||
|
|
||||||
現在GoでサポートされているmongoDBのもっとも良いドライバは[mgo](http://labix.org/mgo)です。このドライバは現在もっともオフィシャルのpkgになりそうなものです。
|
現在GoでサポートされているmongoDBのもっとも良いドライバは[mgo](http://labix.org/mgo)です。このドライバは現在もっともオフィシャルのpkgになりそうなものです。
|
||||||
|
|
||||||
次にどのようにしてGoからmongoDBを操作するのかご説明します:
|
次にどのようにしてGoからmongoDBを操作するのかご説明します:
|
||||||
|
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"labix.org/v2/mgo"
|
"labix.org/v2/mgo"
|
||||||
"labix.org/v2/mgo/bson"
|
"labix.org/v2/mgo/bson"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Person struct {
|
type Person struct {
|
||||||
Name string
|
Name string
|
||||||
Phone string
|
Phone string
|
||||||
}
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
session, err := mgo.Dial("server1.example.com,server2.example.com")
|
session, err := mgo.Dial("server1.example.com,server2.example.com")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
defer session.Close()
|
defer session.Close()
|
||||||
|
|
||||||
session.SetMode(mgo.Monotonic, true)
|
session.SetMode(mgo.Monotonic, true)
|
||||||
|
|
||||||
c := session.DB("test").C("people")
|
c := session.DB("test").C("people")
|
||||||
err = c.Insert(&Person{"Ale", "+55 53 8116 9639"},
|
err = c.Insert(&Person{"Ale", "+55 53 8116 9639"},
|
||||||
&Person{"Cla", "+55 53 8402 8510"})
|
&Person{"Cla", "+55 53 8402 8510"})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
result := Person{}
|
result := Person{}
|
||||||
err = c.Find(bson.M{"name": "Ale"}).One(&result)
|
err = c.Find(bson.M{"name": "Ale"}).One(&result)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
fmt.Println("Phone:", result.Phone)
|
fmt.Println("Phone:", result.Phone)
|
||||||
}
|
}
|
||||||
|
|
||||||
mgoの操作方法とbeedbの操作方法はほとんど似ていることがわかります。どちらもstructに基づいて操作する方法です。これこそがGo Styleです。
|
mgoの操作方法とbeedbの操作方法はほとんど似ていることがわかります。どちらもstructに基づいて操作する方法です。これこそがGo Styleです。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## links
|
## links
|
||||||
* [目次](<preface.md>)
|
* [目次](<preface.md>)
|
||||||
* 前へ: [beedbライブラリを使用してORM開発を行う](<05.5.md>)
|
* 前へ: [beedbライブラリを使用してORM開発を行う](<05.5.md>)
|
||||||
* 次へ: [概要](<05.7.md>)
|
* 次へ: [概要](<05.7.md>)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user