go语言学习笔记5(网络编程,Redis)

go网络编程

服务器端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

  • 切换数据库:select 1

  • 添加数据:set name amber 默认添加到数据库0

  • 清空当前数据库:flushdb

  • 清空所有数据库:flushall

  • 删除一组数据:del name

  • 同时设置多个值:mset name amber age 10

  • 同时获取多个值:mget name age

  • 哈希给对象赋值:hset user1 name amber

  • 哈希获取对象值:hget user1 “name”

  • 哈希一次获取全部信息:hgetall user1

  • 哈希一次全部赋值:hmset user2 name “lucy” age 44 job “java”

  • 哈希一次获取多个:hmget user2 name age

  • 哈希查看对象设置几个属性:hlen user2

  • 哈希查看对象是否有指定字段:hexist user name

Redis List:一个key可对应多个value

  • List插入(左侧):hpush num 1 2 3
  • List插入(右侧):rpush num 1 2 3
  • List获取全部:lrange 0 -1
  • List弹出(最左侧):lpop num
  • List弹出(最右侧):rpop num
  • List删除:del num
  • List长度:llen num

Redis Set:无序

  • 插入:sadd name amber bella mike
  • 追加插入:sadd name mike 提示添加失败
  • 查看:smembers name
  • 查看指定数据是否存在key中:sismember name mike
  • 删除指定数据bella:srem name bella

go连接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,也不关闭,每次client请求连接时直接从连接池获取,减少因关闭而消耗资源

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