外出先で言語の研究ノート5(ネットワークプログラミング、Redisの)

外出先でのネットワークプログラミング

サーバー側server.go

import "net"
// 为每一个客户端请求开启协程
func process(conn net.Conn) {
	defer conn.Close()    //关闭连接
	for {
		buf := make([]byte, 1024)
		//等待读取conn里的client消息,如果没收到消息会阻塞,n代表读到的字节数
		n,err := conn.Read(buf)
		// 将收到的client信息打印,注意1:必须是Print因为从client读取时已带换行换行,真正读取的数据到n为止
		fmt.Print(string(buf[:n]))
	}
}

func main() {
	// 服务器监听8000端口
	listen, err = net.Listen("tcp", 0.0.0.0:8000)
	
	defer listen.Close()
	
	// 等待客户端连接
	for {
		conn, err = listen.Accept()
		
		// 得到客户端的ip和port
		ip_port := conn.RemoteAddr().string
		go process(conn)
	}
}

クライアントclient.go

import "net"
import "bufio"

func main() {
	// server端的ip和port
	conn, err = net.Dial("tcp", 192.168.1.10:8888)

	// 客户端发送数据到服务器
	// ①:client先从终端获取标准输入
	reader,err := bufio.NewReader(os.Stdin)
	line,err := reader.ReadString('\n')  // 以换行作为终止标志
	
	// ②:将读取的数据发给server,参数是byte类型的切片,返回的是字符串
	n,err := conn.Write([]byte(line))
	fmt.Printf("发送给server的数据:%v", n)
}

Redisの

  • デフォルトのポート6379

  • データベースの切り替え:1を選択

  • データの追加:セット名をデフォルトでデータベースに追加AMBER 0

  • flushdb:現在のデータベースをクリア

  • flushall:すべてのデータベースをクリア

  • デル名:データのセットを削除します。

  • 10歳のアンバーMSET名前:同時に複数の値を設定します

  • MGET名の年齢:同時に複数の値を取得

  • オブジェクトのハッシュ割り当て:HSET USER1名アンバー

  • hget USER1「名前」:オブジェクトのハッシュ値を取得します。

  • hgetall USER1:ハッシュは、一度、すべての情報を取得します

  • hmset user2の名前「ルーシー」44歳の仕事の「Java」:すべて一度にハッシュ割り当て

  • hmget user2の名の年齢:より多くのフェッチハッシュ

  • いくつかの属性を設定し、ハッシュ・ビュー・オブジェクト:HLENはuser2

  • hexistユーザー名:ハッシュオブジェクトが指定したフィールドを持つかどうかをチェックします

Redisのリスト:キー値が複数に対応することができます

  • 挿入リスト(左):hpush NUM 1 2 3
  • リストの挿入(右):rpush num個1 2 3
  • リストは、すべてを取得します:LRANGE 0 -1
  • リストのポップアップ(左端):LPOP NUM
  • リストのポップアップ(右端):RPOP NUM
  • 削除リスト:デルNUM
  • リストの長さ:llen NUM

Redisのセット:無秩序

  • インサート:マイク・ベラSADD名アンバー
  • さらに、挿入された:SADD名マイクが失敗を追加するよう求め
  • 表示:smembers名
  • sismember名マイク:指定されたキーデータが存在するかどうか確認してください
  • SREM名のベラ:指定されたデータベラを削除します

Redisの接続を行きます

import "github.com/xxx/redis"

func main() {
	// go连接redis
	conn,er := redis.Dial("tcp", "192.168.1.10:6379")
	defer conn.Close()
	
	// 向redis写入数据,返回值是空接口类型,set首字母大小写随意
	_,err = conn.Do("set", "name", "amber")
	
	// res对应的是空接口类型,需要类型转换
	res,err := redis.String(conn.Do("get", "name"))

// 上述的set/get均可更换成hset/hget等方式
}

Redisの接続プールの
定義:による閉鎖へのリソースの消費を削減しながら、クライアントは、接続を要求する場合、接続プールから直接それぞれが利用でき、閉じられていない、複数の接続プールCONNを作成

import "github.com/xxx/redis"

var pool *redis.Pool   //定义全局pool
// 程序启动时初始化连接池
func init() {
	pool = &redis.Pool{
		MaxIdle : 8,    //最大空闲数
		MaxActice : 0,  //最大连接数,0代表不限制
		IdleTimeout : 100,   //中断连接超过100s,放回连接池
		Dial : func() (redis.Conn{}, err){
			return redis.Dial("tcp", "192.168.1.10:6379")   //初始化连接,指定主机
		}
	}
}

func main() {
	// 从pool取出连接
	conn := pool.Get()
	defer conn.Close()
	_, err := conn.Do("set", "name", "amber")
	r, err := redis.String(conn.Do("get", "name"))
	fmt.Println("name=", r)
}
// pool要始终保持开启,不可关闭
发布了171 篇原创文章 · 获赞 72 · 访问量 8853

おすすめ

転載: blog.csdn.net/ambzheng/article/details/103646350