• ADADADADAD

    怎么在MySQL和Redis中实现二级缓存[ mysql数据库 ]

    mysql数据库 时间:2024-11-28 13:27:42

    作者:文/会员上传

    简介:

    redis简介Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库Redis 与其他 key - value 缓存产品有以下三个特点:Redis支持数据的持久化,可以将内存中的数据保

    以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。

    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指令包起来

        下载与安装

        下载并解压缩

        wgethttp://download.redis.io/releases/redis-5.0.3.tar.gztarxzfredis-5.0.3.tar.gz

        将文件夹移动到/usr/local/中

        mvredis-5.0.3/usr/local/

        进入到文件夹中并编译测试

        cd/usr/local/redis-5.0.3sudomaketest

        编译安装

        sudomakeinstall

        启动redis

        redis-server

        mysql与redis做二级缓存

        对于访问量比较大的数据我们为了能够更快的获取到数据需要对数据库中获取的数据进行数据缓存。

        在项目当中使用Redis缓存流程

          查询时先从缓存当中查询

          缓存当中如果没有数据再从数据库查询,并将数据保存进缓存当中

          如果缓存中查询到了数据直接返回,不再需要查询数据库

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

          步骤实现

          创建redisPool.go文件用于连接池的初始化

          packageredigo_poolimport("flag""github.com/garyburd/redigo/redis""time")var(Pool*redis.PoolRedisServer=flag.String("redisServer",":6379",""))funcinit(){Pool=&redis.Pool{MaxIdle:3,//最大空闲链接数,表示即使没有redis链接事依然可以保持N个空闲链接,而不被清除MaxActive:3,//最大激活连接数,表示同时最多有多少个链接IdleTimeout:240*time.Second,//最大空闲链接等待时间,超过此时间,空闲将被关闭Dial:func()(redis.Conn,error){c,err:=redis.Dial("tcp",*RedisServer)iferr!=nil{returnnil,err}returnc,err},TestOnBorrow:func(credis.Conn,ttime.Time)error{iftime.Since(t)<time.Minute{returnnil}_,err:=c.Do("PING")returnerr},}}

          创建main.go文件实现二级缓存

          packagemainimport("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")typePersonstruct{Idint`db:"id"`Namestring`db:"name"`Ageint`db:"age"`Rmbint`db:"rmb"`}funcmain(){varcmdstringfor{fmt.Println("输入命令")fmt.Scan(&cmd)switchcmd{case"getall":getAll()default:fmt.Println("不能识别其他命令")}fmt.Println()}}funcgetAll(){//从连接池当中获取链接conn:=redigo_pool.Pool.Get()//先查看redis中是否有数据//conn,_:=redis.Dial("tcp","localhost:6379")deferconn.Close()values,_:=redis.Values(conn.Do("lrange","mlist",0,-1))iflen(values)>0{//如果有数据fmt.Println("从redis获取数据")//从redis中直接获取for_,key:=rangevalues{pid:=string(key.([]byte))id,_:=strconv.Atoi(pid)results,_:=redis.Bytes(conn.Do("GET",id))varpPersonerr:=json.Unmarshal(results,&p)iferr!=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")deferdb.Close()varpersons[]Personrows,_:=db.Query("selectid,name,age,rmbfromperson")forrows.Next(){varidintvarnamestringvarageintvarrmbintrows.Scan(&id,&name,&age,&rmb)per:=Person{id,name,age,rmb}persons=append(persons,per)}//写入到redis中:将person以hash的方式写入到redis中for_,p:=rangepersons{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)iferr1!=nil||err2!=nil{fmt.Println("写入失败")}else{fmt.Println("写入成功")}}conn.Do("EXPIRE","mlist",60*5)}}
    怎么在MySQL和Redis中实现二级缓存.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: mysqlredis