`

go语言七——连接redis

 
阅读更多

使用Redigo这个库

package main

import (
	"fmt"
	"redis"
	"time"
	"strconv"
)

var (
	server string = "192.168.1.105:6379"
	password string = "passwd"
)

var pool *redis.Pool

func test(i int) {

	c := pool.Get()
	defer c.Close()

	t:=strconv.Itoa(i)
	c.Do("SETEX","foo"+t,20,i)

	reply, err := redis.Int(c.Do("GET","foo"+t))
	if err == nil {
		fmt.Print(reply)
	} else {
		fmt.Print(err)
	}
	time.Sleep(1*time.Second)
}

func poolInit() (*redis.Pool) {
	//redis pool
	return &redis.Pool{
		MaxIdle: 3,
		IdleTimeout: 240 * time.Second,
		Dial: func () (redis.Conn, error) {
			c, err := redis.Dial("tcp", server)
			if err != nil {
				return nil, err
			}
			if _, err := c.Do("AUTH", password); err != nil {
				c.Close()
				return nil, err
			}
			//if _, err := c.Do("SELECT",1); err != nil {
				// c.Close()
				// return nil, err
			//}
			return c, err
		},
		TestOnBorrow: func(c redis.Conn, t time.Time) error {
			_, err := c.Do("PING")
			return err
		},
	}
}

func main() {

	pool = poolInit()

	for i:=0;i<1000000;i++ {
		test(i)
	}
}

 如果服务器端口不可用或者服务i不可用,则c.Do会返回错误,端口不可用立即返回Connection Refused,而服务器不可达会等待一段时间超时再返回。下面这段代码实现先查找缓存,查询失败时查询mysql

type Record struct {
    Key string
    Val string
}

func fetch_key(key string) string {

        var val string
        out := make(chan string)
        timeout := make(chan string, 1)

        //超时两秒
        go func() {
                time.Sleep(2 * time.Second)
                timeout <- ""
        }()

        //查询缓存(Redis)
        c := G_pool.Get()
        defer c.Close()
        if reply, err := redis.String(c.Do("GET", key)); err == nil {
                go func(string) {
                        out <- reply
                }(reply)
        } else {
                go func() {
                        //查询数据库(Mysql)
                        db, e := sql.Open("mysql", "username:password@tcp(mysqlip:mysqlport)/dbname?charset=utf8")
                        if e != nil {
                                out <- ""
                        }
                        defer db.Close()

                        rows, e := db.Query("select key,val from dbname.tablename where key=" + key)
                        if e != nil {
                                out <- ""
                        }
                        if rows == nil {
                                out <- ""
                        }
                        for rows.Next() {
                                rec := new(Record)
                                row_err := rows.Scan(&rec.Key,&rec.Val)
                                if row_err != nil {
                                        out <- ""
                                }
                                //将结果存入缓存(Redis),超时1天
                                c.Do("SETEX",key,86400,rec.Val)
                                out <- rec.Size
                        }
                        out <- ""
                }()
        }
        //等待结果或者超时
        select {
                case val = <-timeout:
                case val = <-out:
        }
        return val
}

 

分享到:
评论

相关推荐

    开源项目-go-redis-redis.zip

    【开源项目-go-redis-redis.zip】是一个包含Go语言实现的Redis客户端库——go-redis的源代码压缩包。这个库特别值得关注的是它支持Redis Cluster,这是一个用于在多个节点上分发Redis数据的高可用性解决方案。让我们...

    go-redis-memory-analysis-master.zip

    本文将探讨一款基于Go语言实现的Redis内存分析工具——"go-redis-memory-analysis-master",它能够帮助我们识别并处理那些占用内存较多的Key,从而优化Redis的内存使用。 首先,让我们了解Redis内存管理的基础知识...

    redis-cluster-go-coordinator

    本文将重点探讨使用Go语言实现Redis Cluster协调器——redis-cluster-go-coordinator的相关知识。 一、Redis Cluster基础知识 Redis Cluster是一种分布式解决方案,通过数据分片(sharding)将数据分散到多个节点...

    Go-Spaceship-用Golang编写的多人游戏后端框架

    在游戏开发领域,Go语言的这些特性使得它成为构建高性能服务器的理想选择,尤其是在处理大量并发连接的多人在线游戏中。 Go-Spaceship框架的核心设计理念是模块化和可扩展性。它允许开发者轻松地添加新的游戏逻辑,...

    开源项目-alicebob-miniredis.zip

    AliceBob的开源项目——Miniredis,就是专为Go语言的单元测试而设计的一个纯Go实现的微型Redis服务器。该项目的目标是提供一个轻量级、易于集成的解决方案,以便开发者在测试环境中模拟真实的Redis服务器行为。 ...

    Go-goim是一个golang写的IM服务器

    Go-goim项目,正如其名,是基于Google推出的强类型、静态类型的编程语言——Golang实现的。Golang以其简洁的语法、高效的并发模型和内置垃圾回收机制,成为了构建高并发、高性能服务的理想选择。Go-goim充分利用了...

    Xfire案例,webserver——Xfire案例

    3. **服务器编程语言**:Xfire可能使用了各种编程语言来构建其webserver,如C++(因为Xfire客户端就是用C++编写的),或者使用更现代的语言如Python、Java或Go。 4. **数据库集成**:为了存储和检索用户信息、游戏...

    golang实现单点登录系统(go-sso)

    本文将详细介绍一个基于Go语言开发的单点登录系统(go-sso),包括其核心功能、技术栈以及如何部署和使用该系统。 #### 二、核心功能 此单点登录系统实现了以下核心功能: 1. **手机号注册**:用户可以通过输入...

    Go在Grab地理服务中的实践.pdf

    为了实现高效的派单流程,Grab的地理服务系统经历了多个阶段的演进,其中Go语言扮演了关键角色。 派单流程是Grab的核心功能,涉及到寻找并分配最近的司机来接单。这个过程包括调用Nearby Service来获取附近司机,...

    my_fridge_backend:我的冰箱后端

    【我的冰箱后端——Go语言实现的高效API服务器】 在当今的互联网时代,智能家居设备的后端服务成为了连接用户与设备的重要桥梁。"my_fridge_backend"项目就是一个典型的例子,它是一个基于Go语言构建的冰箱后台管理...

    数据库自动化运维方案.docx

    在数据库服务器上部署了使用Go语言自研的Agent——servant,通过HTTP服务调度Agent执行各种任务,确保数据库服务器不会通过明文密码直接连接到ZanDB的元数据库,从而增强了系统的健壮性和安全性。 总体上,ZanDB的...

Global site tag (gtag.js) - Google Analytics