一: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. Lodop部署web网站 客户端本地打印角色

    Lodop用于客户端本地打印,部署到web网站非常简单,此博文介绍的是混合部署方式,该方式兼容所有浏览器,当浏览器支持np插件的时候,使用Lodop插件方式,浏览器不支持np插件,会用C-Lodop服 ...

  2. C# WebSocket模拟发送接收

    WebSocket服务端 C#示例代码 using System; using System.Collections.Generic; using System.Linq; using System. ...

  3. luogu4187

    P4187 [USACO18JAN]Stamp Painting 样例 input3 2 2output6 input6 10 5output190 sol:首先可以发现,对于合法的序列,只要有一串至 ...

  4. 【深入Java虚拟机】之一:Java内存模型

    [深入Java虚拟机]之:Java内存区域与内存溢出 内存区域 Java虚拟机在执行Java程序的过程中会把他所管理的内存划分为若干个不同的数据区域.Java虚拟机规范将JVM所管理的内存分为以下几个 ...

  5. Spring 使用介绍(四)—— SpEL

    一.SpEL介绍 Spring表达式语言全称为“Spring Expression Language”,缩写为“SpEL”,可在运行时构建复杂表达式 使用步骤: 1)创建解析器:ExpressionP ...

  6. Elasticsearch 关键字与SQL关键字对比总结

    由于Elasticsearch和MongoDB/Redis/Memcache一样,是非关系型数据库.而平常使用的MySql,Oracle,SQLServer 等为关系型数据库,二者有着本质的区别,Es ...

  7. 【XSY2332】Randomized Binary Search Tree 概率DP FFT

    题目描述 \(\forall 0\leq i<n\),求有多少棵\(n\)个点,权值和优先级完全随机的treap的树高为\(i\). \(n\leq 30000\) 题解 设\(f_{i,j}\ ...

  8. 【Luogu4781】【模板】拉格朗日插值

    [Luogu4781][模板]拉格朗日插值 题面 洛谷 题解 套个公式就好 #include<cstdio> #define ll long long #define MOD 998244 ...

  9. [2017-8-02]Android Learning Day8

    自定义动画效果 新建一个customAnim类 package com.liwenchi.myapplication; import android.view.animation.Animation; ...

  10. [FJOI2015]火星商店问题(分治+可持久化)

    题目描述 火星上的一条商业街里按照商店的编号1,2 ,…,n ,依次排列着n个商店.商店里出售的琳琅满目的商品中,每种商品都用一个非负整数val来标价.每个商店每天都有可能进一些新商品,其标价可能与已 ...