一: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示例的更多相关文章

  1. go语言之行--golang操作redis、mysql大全

    一.redis 简介 redis(REmote DIctionary Server)是一个由Salvatore Sanfilippo写key-value存储系统,它由C语言编写.遵守BSD协议.支持网 ...

  2. Python学习笔记(五)之Python操作Redis、mysql、mongodb数据库

    操作数据库 一.数据库 数据库类型主要有关系型数据库和菲关系型数据库. 数据库:用来存储和管理数的仓库,数据库是通过依据“数据结构”将数据格式化,以记录->表->库的关系存储.因此数据查询 ...

  3. php操作redis常用方法代码示例

     redis 的连接 描述:实例连接到一个Redis. 参数:host: string,port: int 返回值:BOOL 成功返回:TRUE;失败返回:FALSE $redis = new Red ...

  4. Nginx Lua拓展模块操作Redis、Mysql

    # Nginx的拓展模块 # ngx_lua模块 # 淘宝开发的ngx_lua模块通过lua解释器集成近Nginx,可以采用lua脚本实现业务逻辑,由于lua的紧凑.快速以及内建协程,所以在保证宝兵法 ...

  5. Java代码操作Redis的sentinel和Redis的集群Cluster操作

    总共四台机器,crxy99,crxy98分别是主节点和从节点.   crxy97和crxy96是两个监控此主从架构的sentinel节点. 看代码: import org.junit.Test; im ...

  6. Python操作redis总结

    安装模块及配置 首先安装redis,在Ubuntu下输入指令pip install redis即可.下载完成后,cd到指定目录下,打开指定文件,如下图所示: 输入密码打开后,修改指定地方的内容,与上篇 ...

  7. lua操作json,mysql,redis等

    ==========================example for lua json======================= local cjson = require("cj ...

  8. golang 操作 Redis & Mysql & RabbitMQ

    golang 操作 Redis & Mysql & RabbitMQ Reids 安装导入 go get github.com/garyburd/redigo/redis import ...

  9. PHP 操作redis 详细讲解转的

    http://www.cnblogs.com/jackluo/p/3412670.html phpredis是redis的php的一个扩展,效率是相当高有链表排序功能,对创建内存级的模块业务关系 很有 ...

随机推荐

  1. ADO.NET工具类(二)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...

  2. Zookeeper注册中心底层实现小记

    内容摘自微信公众号,程序员小灰.推荐-ing Zookeeper的数据模型 Zookeeper的数据模型是什么样子呢?它很像数据结构当中的树,也很像文件系统的目录. 树是由节点所组成,Zookeepe ...

  3. Joseph POJ - 1012 约瑟夫环递推

    题意:约瑟夫环  初始前k个人后k个人  问m等于多少的时候 后k个先出去 题解:因为前k个位置是不动的,所以只要考虑每次递推后的位置在不在前面k个就行 有递推式 ans[i]=(ans[i-1]+m ...

  4. UOJ268 [清华集训2016] 数据交互 【动态DP】【堆】【树链剖分】【线段树】

    题目分析: 不难发现可以用动态DP做. 题目相当于是要我求一条路径,所有与路径有交的链的代价加入进去,要求代价最大. 我们把链的代价分成两个部分:一部分将代价加入$LCA$之中,用$g$数组保存:另一 ...

  5. verilog parameter 位宽问题

    前言 一直以为parameter 的位宽是无限的,其实不然. 流程: 仿真一下就知道啦: 用处: 精准控制位宽理论上会占用更少的内存,其他好像并没有什么卵用,注意不要越界,我这里系统默认32bit位宽 ...

  6. 【UOJ349】【WC2018】即时战略 LCT 动态点分治

    这是一道交互题 题目大意 有一棵\(n\)个点的树.最开始\(1\)号点是白的,其他点是黑的. 每次你可以执行一个操作:\(explore(x,y)\).要求\(x\)是一个白点.该函数会返回从\(x ...

  7. Dynamic CRM 2015学习笔记(5)CRM 2015 导入 OData Query Designer 解决方案

    以前一直使用OData Query Designer来生成.验证odata查询字符串,本想把它导入到CRM 2015的环境里,但报错: 到MSDN上发现太老版本的solution确实不能再导入到crm ...

  8. Ability

    Base:网络安全,sklearn(ML),日本語,企业存储 Branch1:自动化,Git Branch2:HW系统架构 Branch3:shadowsocks源码:

  9. HDU 2604 Queuing(矩阵快速幂)

    题目链接:Queuing 题意:有一支$2^L$长度的队伍,队伍中有female和male,求$2^L$长度的队伍中除 fmf 和 fff 的队列有多少. 题解:先推导递推式:$f[i]=f[i-1] ...

  10. push的时候报错:Permission denied (publickey)

    最近,在push的时候遇到一个问题,简单描述下过程(git客户端命令行操作) 我先在本地建了一个文件夹,mkdir dubbodemo 然后进入到这个文件夹,cd dubbodemo 添加我的内容 初 ...