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=" ...
随机推荐
- 监测IIS上网站的连接数
1.运行,输入,perfmon.msc 2.性能监视器>右侧区域>右键 添加计数器 3.在“可用计数器” 区域,选择Web Service,展开Web Service,选择Current ...
- 健康类App原型制作分享-Mindmate
Mindmate是一款健康类App,主要是帮助人们快速入眠,放松情绪,它拥有小清新的界面,配图全是由插画组成,生动有趣.在这款原型中,为了保持App的原有特色,将插画通过图片组件导入进来:音乐播放界面 ...
- github push403错误的处理
如果没有什么别的问题的话,推荐使用SSH的方式.请参考:http://stackoverflow.com/questions/7438313/pushing-to-git-returning-erro ...
- polymer-developer guide-registration and lifecycle
注册和声明周期 my = Polymer({ is: "proto-element", created: function() { this.innerHTML = 'create ...
- C#动态编译引擎-CS-Script 简单使用
Technorati 标记: cs-script 介绍可以参看 http://www.cnblogs.com/shanyou/p/3413585.html 还可以参看 这个 项目介绍 性能测试 c ...
- gearman服务连接php java
在实际工作中,会碰到两个问题 (1)现有系统想集成一个开发组件,而该组件的SDK却没有现有语言版本. (2)系统中的一项功能非常耗费资源,最好能利用其它机器来处理. 本文介绍gearman的使用,实现 ...
- 基于Quartz.net的远程任务管理系统 三
在上一篇中,已经把服务端都做好了.那接下来就是Web的管理端了,因为很多时候服务器是有专门的运维来管理的,我们没有权限去操作,所以有个可以管理Job的工具还是很有必要的. Web管理端,我选择现在很成 ...
- Oracle数据泵导出导入(expdp/impdp)
一.创建表空间 create tablespace atp logging datafile 'D:\oracle\oradata\orcl\atp.dbf' size 50m autoextend ...
- C#语言各个版本特性(二)
二.排序Product 1.按名称对产品进行排序,以特定顺序显示一个列表的最简单方式就是先将列表排序,再遍历并显示其中的项. C#1.1 使用IComparer对ArrayList进行排序 produ ...
- Devexpress Winform初学笔记
作为一个软件开发人员来说,得有自己的博客,可以用来ZB,哈哈!玩笑话..... 写博客并不仅仅是用来ZB的,他可以用来记录你在技术道路上探索遇到的坎,当然也有提高逼格的次然因素啦!小弟刚入博客园不久, ...