MySQL与Redis实现二级缓存
redis简介
- Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库
- Redis 与其他 key - value 缓存产品有以下三个特点:
- Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
- Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
- Redis支持数据的备份,即master-slave模式的数据备份
优势
- 性能极高 - Redis能读的速度是110000次/s,写的速度是81000次/s
- 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作
- 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来
下载与安装
- 下载并解压缩
wget http://download.redis.io/releases/redis-5.0.3.tar.gz
tar xzf redis-5.0.3.tar.gz
- 将文件夹移动到/usr/local/中
mv redis-5.0.3 /usr/local/
- 进入到文件夹中并编译测试
cd /usr/local/redis-5.0.3
sudo make test
- 编译安装
sudo make install
- 启动redis
redis-server
若出现以下画面则表示redis数据库已经启动了:
jpg
mysql与redis做二级缓存
- 对于访问量比较大的数据我们为了能够更快的获取到数据需要对数据库中获取的数据进行数据缓存。
- 在项目当中使用Redis缓存流程
- 查询时先从缓存当中查询
- 缓存当中如果没有数据再从数据库查询,并将数据保存进缓存当中
- 如果缓存中查询到了数据直接返回,不再需要查询数据库
数据缓存应该考虑同步问题:如果对数据进行了缓存,当查询数据时,如果缓存中有数据则直接返回缓存数据不会查询数据库,当数据库数据改变的时候就有可能出现数据库不一致的问题。可以考虑在每次修改数据库的时候同时将对应的缓存数据删除,这样重新查询的时候就会查询数据库并缓存
步骤实现
- 创建redisPool.go文件用于连接池的初始化
package redigo_pool
import (
"flag"
"github.com/garyburd/redigo/redis"
"time"
)
var (
Pool *redis.Pool
RedisServer = flag.String("redisServer", ":6379", "")
)
func init() {
Pool = &redis.Pool{
MaxIdle: 3, //最大空闲链接数,表示即使没有redis链接事依然可以保持N个空闲链接,而不被清除
MaxActive: 3, //最大激活连接数,表示同时最多有多少个链接
IdleTimeout: 240 * time.Second,//最大空闲链接等待时间,超过此时间,空闲将被关闭
Dial: func() (redis.Conn, error) {
c, err := redis.Dial("tcp", *RedisServer)
if err != nil {
return nil, err
}
return c, err
},
TestOnBorrow: func(c redis.Conn, t time.Time) error {
if time.Since(t) < time.Minute {
return nil
}
_, err := c.Do("PING")
return err
},
}
}
- 创建main.go文件实现二级缓存
package main
import (
"database/sql"
"encoding/json"
"fmt"
"github.com/garyburd/redigo/redis"
_ "github.com/go-sql-driver/mysql"
"strconv"
"web/redis/redigo_pool"
_ "web/redis/redigo_pool"
)
type Person struct {
Id int `db:"id"`
Name string `db:"name"`
Age int `db:"age"`
Rmb int `db:"rmb"`
}
func main() {
var cmd string
for{
fmt.Println("输入命令")
fmt.Scan(&cmd)
switch cmd {
case "getall":
getAll()
default:
fmt.Println("不能识别其他命令")
}
fmt.Println()
}
}
func getAll() {
//从连接池当中获取链接
conn := redigo_pool.Pool.Get()
//先查看redis中是否有数据
//conn,_ :=redis.Dial("tcp","localhost:6379")
defer conn.Close()
values, _ := redis.Values(conn.Do("lrange", "mlist",0,-1))
if len(values) > 0 {
//如果有数据
fmt.Println("从redis获取数据")
//从redis中直接获取
for _,key := range values{
pid :=string(key.([]byte))
id ,_:= strconv.Atoi(pid)
results,_ := redis.Bytes(conn.Do("GET",id))
var p Person
err := json.Unmarshal(results,&p)
if err != nil {
fmt.Println("json 反序列化出错")
}else {
fmt.Printf("name = %s\n",p.Name)
}
}
}else {
fmt.Println("从mysql中获取")
//查询数据库
db,_ := sql.Open("mysql","root:Szt930708@tcp(localhost:3306)/mydb")
defer db.Close()
var persons []Person
rows,_ := db.Query("select id,name,age,rmb from person")
for rows.Next() {
var id int
var name string
var age int
var rmb int
rows.Scan(&id,&name,&age,&rmb)
per := Person{id,name,age,rmb}
persons = append(persons,per)
}
//写入到redis中:将person以hash的方式写入到redis中
for _,p := range persons{
p_byte,_ := json.Marshal(p)
_,err1 := conn.Do("SETNX",p.Id,p_byte)
_,err2 := conn.Do("lpush","mlist",p.Id)
// 设置过期时间
conn.Do("EXPIRE",p.Id,60*5)
if err1 != nil || err2 != nil {
fmt.Println("写入失败")
}else {
fmt.Println("写入成功")
}
}
conn.Do("EXPIRE","mlist",60*5)
}
}
MySQL与Redis实现二级缓存的更多相关文章
- Spring + MySQL + Mybatis + Redis【二级缓存】
一.Redis环境 Redis 官网 :http://redis.io/ windows下载:https://github.com/dmajkic/redis/downloads 1.文件解压缩 2. ...
- Spring + MySQL + Mybatis + Redis【二级缓存】执行流程分析
一级缓存基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就 ...
- SpringMVC + MyBatis + Mysql + Redis(作为二级缓存) 配置
2016年03月03日 10:37:47 标签: mysql / redis / mybatis / spring mvc / spring 33805 项目环境: 在SpringMVC + MyBa ...
- SpringMVC +Spring + MyBatis + Mysql + Redis(作为二级缓存) 配置
转载:http://blog.csdn.net/xiadi934/article/details/50786293 项目环境: 在SpringMVC +Spring + MyBatis + MySQL ...
- redis实现二级缓存
缓存的作用就是降低数据库的使用率,来减轻数据库的负担.我们平常的操作一般都是查>改,所以数据库的有些查操作是重复的,如果一直使用数据库就会有负担.Mybatis也会做缓存,也会有一级缓存和二级缓 ...
- mybatis plus使用redis作为二级缓存
建议缓存放到 service 层,你可以自定义自己的 BaseServiceImpl 重写注解父类方法,继承自己的实现.为了方便,这里我们将缓存放到mapper层.mybatis-plus整合redi ...
- mybatis 使用redis实现二级缓存(spring boot)
mybatis 自定义redis做二级缓存 前言 如果关注功能实现,可以直接看功能实现部分 何时使用二级缓存 一个宗旨---不常变的稳定而常用的 一级是默认开启的sqlsession级别的. 只在单表 ...
- Mybatis的二级缓存、使用Redis做二级缓存
目录 什么是二级缓存? 1. 开启二级缓存 如何使用二级缓存: userCache和flushCache 2. 使用Redis实现二级缓存 如何使用 3. Redis二级缓存源码分析 什么是二级缓存? ...
- springboot+mybatis 用redis作二级缓存
1.加入相关依赖包: <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...
随机推荐
- U盘修复技巧
目前,U盘的使用已经非常普遍,人们经常用U盘来备份.携带.转移文件.但是,如果将U盘从USB口拔出之前,忘记了执行卸载*作,或者执行卸载*作不彻底,或者由于误*作,而直接将U盘从USB口拔了出来,就有 ...
- Golang之接口(interface)
Golang最重要的接口,,,, package main import ( "fmt" ) //interface类型默认是指针 /* 接口的实现 Golang中的接口,不需要显 ...
- 牛掰的python与unix
python的中心哲学 Python 2.7.5 (default, Nov 6 2016, 00:28:07) [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)] on ...
- 配置yum源方法,以及失效时的处理
正常方法如下: step1: 备份原CentOS-Base.repo 文件 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-B ...
- [Tools]SurveyMonkey
做问卷调查,推荐一个好工具,免费的 SurveyMonkey : it's free, quick & easy! https://www.surveymonkey.com/
- linux / centos 安装SQL Server 2017 设置默认语言与排序规则Chinese_PRC_CI_AS
安装 安装很简单参照官方教程 https://docs.microsoft.com/zh-cn/sql/linux/quickstart-install-connect-red-hat?view=sq ...
- Docker添加官方加速源(必须)
在国内使用Docker必须用加速镜像不然的话无论是pull 官方的还是私有的镜像都会WAIT TIME EXCEED 下面给出macos的添加方式,非常简单 macOS 对于使用 macOS 的用户, ...
- LightOJ 1428 Melody Comparison (KMP + 后缀数组)
题意:给定两个串A,B,问你A有多少不同的子串,并且不包含B. 析:首先A有多少个不同的子串,可以用后缀数组来解决,也就是 n - sa[i] - h[i] + 1.但是要是不包含B,可以先预处理A和 ...
- mongodb3 设置用户名密码 ,linux
--29T09:: I CONTROL [initandlisten] ** WARNING: You are running on a NUMA machine. --29T09:: I CONTR ...
- java并发编程实战:第十五章----原子变量与非阻塞机制
非阻塞算法:使用底层的原子机器指令(例如比较并交换指令)代替锁来确保数据在并发访问中的一致性 应用于在操作系统和JVM中实现线程 / 进程调度机制.垃圾回收机制以及锁和其他并发数据结构 可伸缩性和活跃 ...