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缓存流程
    1. 查询时先从缓存当中查询
    2. 缓存当中如果没有数据再从数据库查询,并将数据保存进缓存当中
    3. 如果缓存中查询到了数据直接返回,不再需要查询数据库

    数据缓存应该考虑同步问题:如果对数据进行了缓存,当查询数据时,如果缓存中有数据则直接返回缓存数据不会查询数据库,当数据库数据改变的时候就有可能出现数据库不一致的问题。可以考虑在每次修改数据库的时候同时将对应的缓存数据删除,这样重新查询的时候就会查询数据库并缓存

步骤实现
  • 创建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)
}
}
 
***********转摘:https://www.cnblogs.com/develop-SZT/p/10344594.html

MySQL与Redis实现二级缓存的更多相关文章

  1. Spring + MySQL + Mybatis + Redis【二级缓存】

    一.Redis环境 Redis 官网 :http://redis.io/ windows下载:https://github.com/dmajkic/redis/downloads 1.文件解压缩 2. ...

  2. Spring + MySQL + Mybatis + Redis【二级缓存】执行流程分析

    一级缓存基于 PerpetualCache 的 HashMap 本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后,该Session中的所有 Cache 就 ...

  3. SpringMVC + MyBatis + Mysql + Redis(作为二级缓存) 配置

    2016年03月03日 10:37:47 标签: mysql / redis / mybatis / spring mvc / spring 33805 项目环境: 在SpringMVC + MyBa ...

  4. SpringMVC +Spring + MyBatis + Mysql + Redis(作为二级缓存) 配置

    转载:http://blog.csdn.net/xiadi934/article/details/50786293 项目环境: 在SpringMVC +Spring + MyBatis + MySQL ...

  5. redis实现二级缓存

    缓存的作用就是降低数据库的使用率,来减轻数据库的负担.我们平常的操作一般都是查>改,所以数据库的有些查操作是重复的,如果一直使用数据库就会有负担.Mybatis也会做缓存,也会有一级缓存和二级缓 ...

  6. mybatis plus使用redis作为二级缓存

    建议缓存放到 service 层,你可以自定义自己的 BaseServiceImpl 重写注解父类方法,继承自己的实现.为了方便,这里我们将缓存放到mapper层.mybatis-plus整合redi ...

  7. mybatis 使用redis实现二级缓存(spring boot)

    mybatis 自定义redis做二级缓存 前言 如果关注功能实现,可以直接看功能实现部分 何时使用二级缓存 一个宗旨---不常变的稳定而常用的 一级是默认开启的sqlsession级别的. 只在单表 ...

  8. Mybatis的二级缓存、使用Redis做二级缓存

    目录 什么是二级缓存? 1. 开启二级缓存 如何使用二级缓存: userCache和flushCache 2. 使用Redis实现二级缓存 如何使用 3. Redis二级缓存源码分析 什么是二级缓存? ...

  9. springboot+mybatis 用redis作二级缓存

    1.加入相关依赖包: <?xml version="1.0" encoding="UTF-8"?> <project xmlns=" ...

随机推荐

  1. sql添加/移除约束

    唯一:ALTER TABLE TableName ADD CONSTRAINT UQ_NickName UNIQUE(NickName) 主键:ALTER TABLE TableName ADD CO ...

  2. Linux confluence5.8.10 wiki安装

    选择首先需要java环境 其次需要mysql mysql安装请参考: http://www.cnblogs.com/syuf/p/7818710.html 安装好mysql之后,创建一个库 # mys ...

  3. PKUWC2019 真·游记

    由于我这个大傻逼考试结果实在是没法看,所以这篇游记将尽可能略去和考试有关的内容,变成一篇真正的游记…… 接下来的内容中将会出现各种旅游攻略,寻求干货的同学可以提前左转了. Day -7 学考终于结束了 ...

  4. radiobutton 选中的项不能去掉选择的问题

    代码如下: RadioButton rbtn = new RadioButton(getApplicationContext()); rbtn.setText(String.valueOf(item. ...

  5. Oracle GoldenGate 三、加密

    写在开始前 从上周开始,我花了大量的业余时间阅读GoldenGate官方文档,并根据文档实践和进一步学习了解GoldenGate,以下便是根据官方文档理解总结的GoldenGate学习内容: Orac ...

  6. 使用JFinal框架连接数据库,实现注册、登录功能

    使用JFinal框架连接数据库,实现注册.登录功能 1.在Eclipse中新建Dynamic Web project项目 2.导入jfinal-2.2-bin-with-src.jar.c3p0-0. ...

  7. Nginx搭建后,图片存储在Tomcat上,前端无法回显图片问题

    一.Nginx与Tomcat连接搭建的环境,Nginx设置了前端的访问路径为 (1)前端代码配置: root /usr/local/nginx/html; index index.html index ...

  8. dojoConfig包的配置(7/26号夜)

    主页代码: <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> ...

  9. lambda distinct

    public ActionResult Index() { IList<RegisterModel> regList = new List<RegisterModel>() { ...

  10. Android-自定义控件之事件分发

    最大范围 外层蓝色区域是继承ViewGroup 中间红色区域,也是继承ViewGroup 最中间黑色区域,是继承View 布局相关的代码: <!-- 事件分发 --> <view.c ...