如何用go语言与redis、mysql交互并写一个简单的二级缓存

go语言简介

首先go语言作为一门新语言,2007年开始研发,2009年11月开源,2012年初发布Go1稳定版本,截止目前还是在1.0时代,那么,这么一个“新生代语言”相比于活跃在各大公司之前的前辈,如:C,Java,python等具有哪些优势呢?
go语言的最大的优势在于高并发,go程,协程,一台pc机,即可完成百万级别的并发
go语言有自动垃圾回收机制,而且是一门底层语言

redis简介

redis是一种高速高性能的内存数据库,存储的是键值对数据
由于极高的存储和访问速度,redis常被用来作为数据缓存服务器
另外redis是支持数据持久化的(即redis会自动将数据写入磁盘)——这是redis大杀四方的重要原因
redis支持多个slave端同时向master端进行写入,这经常被用在分布式爬虫等场景中
2010年以后redis开始大面积流行,关系型数据库(核心数据)+redis(缓存)是常规的、常见的数据解决方案

mysql简介

Mysql是最流行的关系型数据库管理系统;
所谓的关系型数据库,是指建立在关系模型基础上的数据库,即数据表之间不是相互独立的,而是彼此关联的;
数据表中的每行代表一条数据,每列代表一个属性(也叫字段);
最著名的三大关系型数据库包括:Oracle(甲骨文),SQLServer(微软),MySQL(甲骨文);
MySQL是开源、免费的,且功能强大(64位机最大支持8T存储);
支持C/C++、Python、Java、PHP、Ruby、Perl等多种语言;

正文

下面就直奔主题
众所周知,在工作中,redis和mysql都是常用的数据库,redis常用来缓存,mysql作为关系型数据库常用来存储核心数据,那么如何实现交互呢

package main

import (
	"fmt"
	
	//此处注意“_”表示引用mysql函数中init的方法而无需使用函数
	_ "github.com/go-sql-driver/mysql"
	
	"github.com/garyburd/redigo/redis"
	"github.com/jmoiron/sqlx"
)

type Person struct {
	//对应id表字段
	Id int `db:"id"`
	//对应name表字段
	Name string `db:"name"`
	//对应age表字段
	Age int `db:"age"`
	//对应rmb表字段
	Rmb float64 `db:"rmb"`
}

func main() {
	var cmd string

	for {
		fmt.Println("请输入命令:")
		fmt.Scan(&cmd)
		//fmt.Println("你输入的是:",cmd)

		switch cmd {
		case "getall":
			GetAll()
		default:
			fmt.Println("不能识别的命令")
		}

		fmt.Println()
	}

}

func GetAll() {
	//先看看redis里有没有数据
	conn, _ := redis.Dial("tcp", "localhost:6379")
	defer conn.Close()
	reply, err := conn.Do("lrange", "mlist", 0, -1)
	pkeys, _ := redis.Strings(reply, err)
	fmt.Println(pkeys)

	if len(pkeys) > 0 {
		//如果有
		fmt.Println("从redis获得数据")

		// 从redis里直接读取
		for _, key := range pkeys {
			retStrs, _ := redis.Strings(conn.Do("hgetall", key))
			//fmt.Println(retStrs)
			fmt.Printf("{%s %s %s}\n", retStrs[1], retStrs[3], retStrs[5])
		}

	} else {
		//如果没有
		fmt.Println("从mysql获得数据")

		//查询数据库
		db, _ := sqlx.Open("mysql", "root:123456@tcp(localhost:3306)/mydb")
		defer db.Close()

		var persons []Person
		db.Select(&persons, "select id,name,age,rmb from person")
		fmt.Println(persons)

		//写入redis并且设置过期时间
		for _, p := range persons {
			//将p以hash形式写入redis
			_, e1 := conn.Do("hmset", p.Id, "name", p.Name, "age", p.Age, "rmb", p.Rmb)

			//将这个hash的key加入mlist
			_, e2 := conn.Do("rpush", "mlist", p.Id)

			//设置过期时间
			_, e3 := conn.Do("expire", p.Id, 60)
			_, e4 := conn.Do("expire", "mlist", 60)

			if e1 != nil || e2 != nil || e3 != nil || e4 != nil {
				fmt.Println(p.Name, "写入失败", e1, e2, e3, e4)
			} else {
				fmt.Println(p.Name, "写入成功")
			}
		}
	}
}

这样一个简单的二级缓存就完成了,打印结果为,在终端输入getall命令后查redis里有无数据,有则遍历打印,无则查询mysql中,打印之,并把数据写入redis作为缓存,时间我设置为60s,具体需要可以修改。

MySQL 教程MySQL 是流行的关系型数据库管理系统,在 WEB 应用方面 MySQL 是最好的 RDBMS(Relational Database Management System:关系数据库管理系统)应用软件之一。在本教程中,会让大家快速掌握 MySQL 的基本知识,并轻松使用 MySQL 数据库。什么是数据库?数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。每个数据库都有一个或多个不同的 API 用于创建,访问,管理,搜索和复制所保存的数据。我们也可以将数据存储在文件中,但是在文件中读数据速度相对较慢。所以,现在我们使用关系型数据库管理系统(RDBMS)来存储和管理大数据量。所谓的关系型数据库,是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。RDBMS 即关系数据库管理系统(Relational Database Management System)的特点:1.数据以表格的形式出现2.每行为各种记录名称3.每列为记录名称所对应的数据域4.许多的行和列组成一张表单5.若干的表单组成databaseRDBMS 术语 在我们开始学习MySQL 数据库前,让我们先了解下RDBMS的一些术语:数据库: 数据库是一些关联表的集合。数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。外键:外键用于关联两个表。复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。MySQL 为关系型数据库(Relational Database Management System), 这种所谓的关系型可以理解为表格的概念, 一个关系型数据库由一个或数个表格组成, 如图所示的一个表格: 表头(header): 每一列的名称;列(col): 具有相同数据类型的数据的集合;行(row): 每一行用来描述某条记录的具体信息;值(value): 行的具体信息, 每个值必须与该列的数据类型相同;键(key): 键的值在当前列中具有唯一性。MySQL数据库MySQL一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL 是开源的,目前隶属于 Oracle 旗下产品。MySQL 支持大型的数据库。可以处理拥有上千万条记录的大型数据库。MySQL 使用标准的 SQL 数据语言形式。MySQL 可以运行于多个系统上,并且支持多种语言。这些编程语言包括 C、C++、Python、Java、Perl、PHP、Eiffel、Ruby 和 Tcl 等。MySQL 对PHP有很好的支持,PHP 是目前流行的 Web 开发语言。MySQL 支持大型数据库,支持 5000 万条记录的数据仓库,32 位系统表文件最大可支持 4GB,64 位系统支持最大的表文件为8TB。MySQL 是可以定制的,采用了 GPL 协议,你可以修改源码来开发自己的 MySQL 系统。Redis 教程REmote DIctionary Server(Redis) 是一个由 Salvatore Sanfilippo 的 key-value 存储系统,是跨平台的非关系型数据库。Redis一个开源的使用 ANSI C 语言编、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值