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的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系 很有 ...
随机推荐
- hibernate主配置文件中指定session与当前线程绑定
配置一条属性 <property name="hibernate.current_session_context_class">thread</property& ...
- hdu-5536(字典树)
题意:给你n个数,让你在n个数中选三个,使得(a1+a2)^a3的值最大,a1!=a2!=a3(下标不等于): 解题思路:01字典树可以写,因为数据小,我们可以先把n个数建一颗字典树,然后两边for找 ...
- Qt5 入门
main()函数中第一句是创建一个QApplication类的实例. 对于 Qt 程序来说,main()函数一般以创建 application 对象(GUI 程序是QApplication,非 GUI ...
- C语言实现字符串逆序输出
方法一: #include <stdio.h> #include <stdlib.h> #include <string.h> void Reverse(char ...
- AIM Tech Round 4 Div. 1
A:显然最优方案是对所形成的置换的每个循环排个序. #include<iostream> #include<cstdio> #include<cmath> #inc ...
- BZOJ4653 [NOI2016] 区间 【线段树】
题目分析: 首先思考一个二分答案的做法.我们可以注意到答案具有单调性,所以可以二分答案. 假设当前二分的答案是$ k $.那么按照大小顺序插入每个区间,同时在末端删除会对答案产生影响的区间.这里不妨用 ...
- MT【257】任意存在并存
函数$f(x)=\dfrac{4x}{x+1}(x>0),g(x)=\dfrac{1}{2}(|x-a|-|x-b|),(a<b)$, 若对任意$x_1>0$,存在$x_2\le x ...
- MT【247】恒成立画图像
若$|x^2+|x-a|+3a|\le2$对任意$x\in[-1,1]$恒成立,则$a$ 的取值范围_____ 分析:转化为$f(x)=|x-a|+3a$的图像夹在$y=-2-x^2$与$y=2-x^ ...
- python装饰器中的计时器thd.strat用法
thd = KThread(target=_new_func, args=(), kwargs=new_kwargs) thd.start() thd.join(seconds) alive = th ...
- bzoj4540 序列 (单调栈+莫队+rmq)
首先,如果我知道[l,r],要转移到[l,r+1]的时候,就是加上以r+1为右端点,[l,r+1]为左端点的区间的最小值,其他情况和这个类似 考虑这玩意怎么求 右端点固定的话,我左端点越往左走,这个最 ...