使用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客户端库——go-redis的源代码压缩包。这个库特别值得关注的是它支持Redis Cluster,这是一个用于在多个节点上分发Redis数据的高可用性解决方案。让我们...
本文将探讨一款基于Go语言实现的Redis内存分析工具——"go-redis-memory-analysis-master",它能够帮助我们识别并处理那些占用内存较多的Key,从而优化Redis的内存使用。 首先,让我们了解Redis内存管理的基础知识...
本文将重点探讨使用Go语言实现Redis Cluster协调器——redis-cluster-go-coordinator的相关知识。 一、Redis Cluster基础知识 Redis Cluster是一种分布式解决方案,通过数据分片(sharding)将数据分散到多个节点...
在游戏开发领域,Go语言的这些特性使得它成为构建高性能服务器的理想选择,尤其是在处理大量并发连接的多人在线游戏中。 Go-Spaceship框架的核心设计理念是模块化和可扩展性。它允许开发者轻松地添加新的游戏逻辑,...
AliceBob的开源项目——Miniredis,就是专为Go语言的单元测试而设计的一个纯Go实现的微型Redis服务器。该项目的目标是提供一个轻量级、易于集成的解决方案,以便开发者在测试环境中模拟真实的Redis服务器行为。 ...
Go-goim项目,正如其名,是基于Google推出的强类型、静态类型的编程语言——Golang实现的。Golang以其简洁的语法、高效的并发模型和内置垃圾回收机制,成为了构建高并发、高性能服务的理想选择。Go-goim充分利用了...
本文将详细介绍一个基于Go语言开发的单点登录系统(go-sso),包括其核心功能、技术栈以及如何部署和使用该系统。 #### 二、核心功能 此单点登录系统实现了以下核心功能: 1. **手机号注册**:用户可以通过输入...
3. **服务器编程语言**:Xfire可能使用了各种编程语言来构建其webserver,如C++(因为Xfire客户端就是用C++编写的),或者使用更现代的语言如Python、Java或Go。 4. **数据库集成**:为了存储和检索用户信息、游戏...
为了实现高效的派单流程,Grab的地理服务系统经历了多个阶段的演进,其中Go语言扮演了关键角色。 派单流程是Grab的核心功能,涉及到寻找并分配最近的司机来接单。这个过程包括调用Nearby Service来获取附近司机,...
【我的冰箱后端——Go语言实现的高效API服务器】 在当今的互联网时代,智能家居设备的后端服务成为了连接用户与设备的重要桥梁。"my_fridge_backend"项目就是一个典型的例子,它是一个基于Go语言构建的冰箱后台管理...
在数据库服务器上部署了使用Go语言自研的Agent——servant,通过HTTP服务调度Agent执行各种任务,确保数据库服务器不会通过明文密码直接连接到ZanDB的元数据库,从而增强了系统的健壮性和安全性。 总体上,ZanDB的...