前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >连接redis

连接redis

作者头像
李海彬
发布2018-03-26 14:25:45
1.5K0
发布2018-03-26 14:25:45
举报
文章被收录于专栏:Golang语言社区Golang语言社区
使用Redi
代码语言:javascript
复制
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

代码语言:javascript
复制
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
}

本文来自:ITEYE博客

感谢作者:ciaos

查看原文:go语言七——连接redis

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-04-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档