一: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. CSAW 2016:Rock-100

    ELF文件 拖进ida 震惊: 这一堆堆都是什么神仙函数呀!! f5看一下伪代码 可以看出来 其实看起来函数很多 但是真正管用的函数也就那么几个 如果sub_4017E6的值是0 那么就会输出flag ...

  2. Jenkins+PowerShell持续集成环境搭建(七)构建触发器

    Jenkins 有三种类型的构建触发器,如下图: Build after other projects are built:在其他项目构建后构建: Build periodically:定时构建: P ...

  3. 原子变量与CAS算法(二)

    一.锁机制存在的问题 (1)在多线程竞争下,加锁.释放锁会导致比较多的上下文切换和调度延时,引起性能问题. (2)一个线程持有锁会导致其它所有需要此锁的线程挂起. (3)如果一个优先级高的线程等待一个 ...

  4. 1.docker 数据卷的备份和恢复(非大数据量)

    在生产环境中使用 Docker,很多时候需要对数据进行持久化,或者进行容器间的数据共享. 容器中的管理数据主要有两种方式: 数据卷 (Data Volumes): 容器内数据直接映射到本地主机环境: ...

  5. hdu—3861(tarjan+二分图)

    题意:给你n个城市,每个城市之间有一条有向边,将城市划分为几个区域,问你最小的划分方法, 划分规则为:能相互到达的放在一个区域:然后区域内的a,b两点肯定存在某种方式,使得a能到b或者b能到a(注意, ...

  6. 第四十天 并发编程之io模型

    一.今日内容 1.网络IO的两个阶段 waitdata copydata 2阻塞IO模型 之前写的都是阻塞 无论多线程 多进程 还是 进程池 线程池 3.非阻塞IO模型 在非阻塞IO中 需要不断循环询 ...

  7. hz2016的noip模拟赛(d1 + d2)

    QAQ怕不是真的凉凉 d1 205 + d2 170 = 375 感觉难度和noip差不多 那么这可是有够凉的 官方题解 D1 D2 D1 T1 某地的ENLIGHTENED总部总部有N个Agent, ...

  8. Hdoj 1003.Max Sum 题解

    Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the max sum ...

  9. cf455C Civilization (并查集)

    并查集维护每个联通块的直径和最小的最大深度,每次连得时候连的肯定是最大深度最小的那两个点 #pragma GCC optimize(3) #include<bits/stdc++.h> # ...

  10. CSS解决文字超出显示省略号问题

    超出一行 white-space: nowrap; overflow: hidden; text-overflow: ellipsis; 超出多行 overflow: hidden; text-ove ...