go操作redis和mysql示例
一:redis示例
使用redis的包是: github.com/garyburd/redigo/redis
1:编写第一个示例: 链接,设置,获取
redis_basic.go
package main import (
"fmt"
"github.com/garyburd/redigo/redis"
) func main() {
c, err := redis.Dial("tcp", "192.168.0.109:6379") //连接到redis
if err != nil {
fmt.Println("conn redis failed, err: ", err)
return
} defer c.Close() //set
_, err = c.Do("SET", "name", "redis-go")
if err != nil {
fmt.Println("err")
return
}
//get
r, err := redis.String(c.Do("GET", "name"))
if err != nil {
fmt.Println(err)
return
}
fmt.Println(r) //hset
_, err = c.Do("HSET", "names", "redis", "hset")
if err != nil {
fmt.Println(err)
return
}
//hget
r, err = redis.String(c.Do("HGET", "names", "redis"))
if err != nil {
fmt.Println("hget err: ", err)
return
}
fmt.Println(r) //exipres
_, err = c.Do("expires", "names", 5)
if err != nil {
fmt.Println("expire err: ", err)
return
}
}
2: 管道操作示例
请求/响应服务可以实现持续处理新请求,客户端可以发送多个命令到服务器而无需等待响应,最后在一次读取多个响应。
使用Send(),Flush(),Receive()方法支持管道化操作
Send向连接的输出缓冲中写入命令。
Flush将连接的输出缓冲清空并写入服务器端。
Recevie按照FIFO顺序依次读取服务器的响应
redis_pipline.go
package main import (
"fmt"
"github.com/garyburd/redigo/redis"
) func main() {
c, err := redis.Dial("tcp", "192.168.0.109:6379")
if err != nil {
fmt.Println("conn redis failed, err: ", err)
return
}
defer c.Close() c.Send("SET", "name1", "redis001")
c.Send("SET", "name2", "redis002")
c.Flush() v, err := c.Receive()
fmt.Printf("v: %v, err: %v \n", v, err) v, err = c.Receive()
fmt.Printf("v: %v, err: %v \n", v, err) v, err = c.Receive() // 夯住,一直等待
fmt.Printf("v:%v,err:%v\n", v, err)
}
3: 连接池示例
package main import (
"fmt"
"github.com/garyburd/redigo/redis"
) var pool *redis.Pool func init() {
pool = &redis.Pool{
MaxIdle: 20, //最大的空闲连接数,表示即使没有redis连接时依然可以保持N个空闲的连接,而不被清除,随时处于待命状态
MaxActive: 120, //最大的激活连接数,表示同时最多有N个连接
IdleTimeout: 350, //最大的空闲连接等待时间,超过此时间后,空闲连接将被关闭
Dial: func() (redis.Conn, error) {
return redis.Dial("tcp", "192.168.0.109:6379")
},
}
} func main() {
client := pool.Get()
defer client.Close() _, err := client.Do("SET", "names", "redis-pool")
if err != nil {
fmt.Println("set error: ", err)
return
} r, err := redis.String(client.Do("GET", "names"))
if err != nil {
fmt.Println("get error: ", err)
return
}
fmt.Println(r)
}
二: mysql示例
虽然go的mysql包有很多,比如gorm,xorm, 但是我们使用一个简单的 sqlx(github.com/jmoiron/sqlx)
这里有sqlx的用法 http://jmoiron.github.io/sqlx/
1: 增加
mysql_insert.go
package main import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
) var DB *sqlx.DB type User struct {
Name string `db:"name"`
Email string `db:"email"`
Password string `db:"password"`
} func init() {
db, err := sqlx.Open("mysql", "root:root@(localhost:3306)/blog")
if err != nil {
fmt.Println("open mysql err: ", err)
return
}
DB = db
} func main() {
res, err := DB.Exec("INSERT INTO users (name, email, password) VALUES (?, ?, ?)", "mysqldemo", "my@12.com", "111")
if err != nil {
fmt.Println("insert err: ", err)
return
}
id, err := res.LastInsertId()
if err != nil {
fmt.Println("get last id err: ", err)
return
}
fmt.Println("insert success: ", id)
}
2: 修改
mysql_update.go
package main import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
) var DB *sqlx.DB type User struct {
Name string `db:"name"`
Email string `db:"email"`
Password string `db:"password"`
} func init() {
db, err := sqlx.Open("mysql", "root:root@(localhost:3306)/blog")
if err != nil {
fmt.Println("open mysql err: ", err)
return
}
DB = db
} func main() {
_, err := DB.Exec("UPDATE users SET name=? WHERE id=?", "mysqlupdate", 1)
if err != nil {
fmt.Println("update err: ", err)
return
}
}
3:删除
mysql_del.go
package main import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
) var DB *sqlx.DB type User struct {
Name string `db:"name"`
Email string `db:"email"`
Password string `db:"password"`
} func init() {
db, err := sqlx.Open("mysql", "root:root@(localhost:3306)/blog")
if err != nil {
fmt.Println("open mysql err: ", err)
return
}
DB = db
} func main() {
_, err := DB.Exec("DELETE FROM users WHERE id = ?", 2)
if err != nil {
fmt.Println("del err : ", err)
return
}
fmt.Println("del success")
}
4:查询
mysql_select.go
package main import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
) var DB *sqlx.DB type User struct {
Name string `db:"name"`
Email string `db:"email"`
Password string `db:"password"`
} func init() {
db, err := sqlx.Open("mysql", "root:root@(localhost:3306)/blog")
if err != nil {
fmt.Println("open mysql err: ", err)
return
}
DB = db
} func main() {
var users []User
err := DB.Select(&users, "SELECT name, email, password FROM users WHERE id=?", 1)
if err != nil {
fmt.Println("select err: ", err)
return
}
fmt.Println("select success: ", users) person := []User{}
DB.Select(&person, "SELECT name,email,password FROM users")
fmt.Println(person)
}
5: 事务
mysql_trans.go
package main import (
"fmt"
_ "github.com/go-sql-driver/mysql"
"github.com/jmoiron/sqlx"
"log"
) //事务
var DB *sqlx.DB type User struct {
Name string `db:"name"`
Email string `db:"email"`
Password string `db:"password"`
} func init() {
db, err := sqlx.Open("mysql", "root:root@(localhost:3306)/blog")
if err != nil {
fmt.Println("open mysql err: ", err)
return
}
DB = db
} func main() {
tx, err := DB.Begin()
if err != nil {
log.Println("DB begin failed err: ", err)
return
} defer func() {
if p := recover(); p != nil {
tx.Rollback()
panic(p)
}
}()
//这里写一个demo
if _, err = tx.Exec("INSERT INTO users (name, email, password) VALUES (?, ?, ?)", "demo2", "demo@12.com", "333"); err != nil {
tx.Rollback()
return
}
if _, err = tx.Exec("INSERT INTO users (name, email, password) VALUES (?, ?, ?)", "demo3", "demo3@12.com", "444"); err != nil {
tx.Rollback()
return
} err = tx.Commit()
return
}
go操作redis和mysql示例的更多相关文章
- go语言之行--golang操作redis、mysql大全
		一.redis 简介 redis(REmote DIctionary Server)是一个由Salvatore Sanfilippo写key-value存储系统,它由C语言编写.遵守BSD协议.支持网 ... 
- Python学习笔记(五)之Python操作Redis、mysql、mongodb数据库
		操作数据库 一.数据库 数据库类型主要有关系型数据库和菲关系型数据库. 数据库:用来存储和管理数的仓库,数据库是通过依据“数据结构”将数据格式化,以记录->表->库的关系存储.因此数据查询 ... 
- php操作redis常用方法代码示例
		redis 的连接 描述:实例连接到一个Redis. 参数:host: string,port: int 返回值:BOOL 成功返回:TRUE;失败返回:FALSE $redis = new Red ... 
- Nginx Lua拓展模块操作Redis、Mysql
		# Nginx的拓展模块 # ngx_lua模块 # 淘宝开发的ngx_lua模块通过lua解释器集成近Nginx,可以采用lua脚本实现业务逻辑,由于lua的紧凑.快速以及内建协程,所以在保证宝兵法 ... 
- Java代码操作Redis的sentinel和Redis的集群Cluster操作
		总共四台机器,crxy99,crxy98分别是主节点和从节点. crxy97和crxy96是两个监控此主从架构的sentinel节点. 看代码: import org.junit.Test; im ... 
- Python操作redis总结
		安装模块及配置 首先安装redis,在Ubuntu下输入指令pip install redis即可.下载完成后,cd到指定目录下,打开指定文件,如下图所示: 输入密码打开后,修改指定地方的内容,与上篇 ... 
- lua操作json,mysql,redis等
		==========================example for lua json======================= local cjson = require("cj ... 
- golang 操作 Redis & Mysql & RabbitMQ
		golang 操作 Redis & Mysql & RabbitMQ Reids 安装导入 go get github.com/garyburd/redigo/redis import ... 
- PHP 操作redis 详细讲解转的
		http://www.cnblogs.com/jackluo/p/3412670.html phpredis是redis的php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系 很有 ... 
随机推荐
- window.onpopstate
			概述 window.onpopstate是popstate事件在window对象上的事件句柄. 每当处于激活状态的历史记录条目发生变化时,popstate事件就会在对应window对象上触发. 如果当 ... 
- servlet篇 之 生命周期
			二:Servlet的生命周期 背景知识: servlet是单例,在web项目运行期间,一个servlet只会创建一个对象[tomcat帮我们实例 化][尽量不要在servlet中定义成员变量].因为w ... 
- layui laydate设置当前日期往后不可选
			layui laydate设置当前日期往后不可选 laydate.render({ elem: '#demo', max: maxDate() }); // 设置最大可选的日期 function ma ... 
- 【HDU - 4340】Capturing a country(树形DP)
			BUPT2017 wintertraining(15) #8A 题意 n(<100)个城市组成的树.A攻击i城市需要a[i]代价,B需要b[i].如果一个城市的邻居被A攻击了,那么A攻击它只要A ... 
- nowcoder提高集训营第5场
			凉 (比赛链接)[https://www.nowcoder.com/acm/contest/177#question] T1 (题目链接)[https://www.nowcoder.com/acm/c ... 
- Centos7 Install Kubernetes
			环境搭建配置官方 k8s yum 源: cat <<EOF > /etc/yum.repos.d/virt7-docker-common-release.repo [virt7-do ... 
- Summary (7Road)
			今天有幸参加了一次考试,碰到的一些考题如下: 很多东西,明明都是会的,可是就是写不出来.可见自己的Linux基础还是很薄弱,懒得去记这些有用的东西.既然自己不是老板,不是项目经理,就该努力记住这些基础 ... 
- SA / SAM 题目集
			上一次做 SA / SAM 相关的题还要数到某场毒瘤 NOIP 模拟赛--这么久没做了都快忘光了--写点东西记录一些最近做到的水好题. LOJ2059 「TJOI / HEOI2016」字符串 题意 ... 
- 【BZOJ3165】[HEOI2013]Segment(李超线段树)
			[BZOJ3165][HEOI2013]Segment(李超线段树) 题面 BZOJ 洛谷 题解 似乎还是模板题QwQ #include<iostream> #include<cst ... 
- Luogu P5283 / LOJ3048 【[十二省联考2019]异或粽子】
			联考Day1T1...一个考场上蠢了只想到\(O(n^2)\)复杂度的数据结构题 题目大意: 求前\(k\)大区间异或和的和 题目思路: 真的就是个sb数据结构题,可持久化01Trie能过(开O2). ... 
