Maison > base de données > tutoriel mysql > le corps du texte

Introduction à la méthode d'implémentation du cache secondaire avec MySQL et Redis (exemple de code)

不言
Libérer: 2019-02-01 09:35:28
avant
3035 Les gens l'ont consulté

Ce que cet article vous apporte est une introduction à la méthode d'implémentation du cache secondaire avec MySQL et Redis (exemples de code). Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer. .

Introduction à redis

  • Redis est entièrement open source et gratuit, respecte le protocole BSD et est une base de données clé-valeur hautes performances

  • Redis possède les trois fonctionnalités suivantes avec d'autres produits de cache clé-valeur :

    • Redis prend en charge la persistance des données et peut enregistrer les données en mémoire sur le disque et redémarrer Il peut être chargé à nouveau pour être utilisé

    • Redis prend non seulement en charge les données de type clé-valeur simples, mais fournit également le stockage de listes, d'ensembles, de zset, de hachage et d'autres structures de données

    • Redis prend en charge la sauvegarde des données, c'est-à-dire la sauvegarde des données en mode maître-esclave

Avantages

  • Performances extrêmement élevées - Redis peut lire à une vitesse de 110 000 fois/s et écrire à une vitesse de 81 000 fois/s

  • Types de données riches - Redis prend en charge les chaînes et les listes dans les cas binaires , Hachages, ensembles et ensembles ordonnés Opérations de type de données

  • Atomique – Toutes les opérations dans Redis sont atomiques, ce qui signifie qu'elles sont soit exécutées avec succès, soit pas exécutées du tout en cas d'échec. Les opérations individuelles sont atomiques. Plusieurs opérations prennent également en charge les transactions, c'est-à-dire l'atomicité, encapsulées via les instructions MULTI et EXEC

Télécharger et installer

  • Télécharger et décompresser

wget http://download.redis.io/releases/redis-5.0.3.tar.gz
tar xzf redis-5.0.3.tar.gz
Copier après la connexion
  • Déplacez le dossier vers /usr/local/

mv redis-5.0.3 /usr/local/
Copier après la connexion
  • Entrez le dossier et compiler et tester

cd /usr/local/redis-5.0.3
sudo make test
Copier après la connexion
  • Compiler et installer

sudo make install
Copier après la connexion
  • Démarrer redis

redis-server
Copier après la connexion

Si l'écran suivant apparaît, cela signifie que la base de données redis a été démarrée :
jpg

mysql et redis font un cache secondaire

  • Pour les données avec un volume d'accès relativement important, afin d'obtenir les données plus rapidement, nous devons mettre en cache les données obtenues à partir de la base de données.

  • Utiliser le processus de mise en cache Redis dans le projet

    La mise en cache des données doit prendre en compte les problèmes de synchronisation : si les données sont mises en cache, lors de l'interrogation des données, si les données sont mis en cache, S'il y a des données, les données mises en cache seront renvoyées directement sans interroger la base de données. Lorsque les données de la base de données changent, une incohérence de la base de données peut se produire. Vous pouvez envisager de supprimer les données mises en cache correspondantes à chaque fois que vous modifiez la base de données, de sorte que lors d'une nouvelle requête, la base de données soit interrogée et mise en cache

    1. lors de l'interrogation de la requête. dans le cache

    2. S'il n'y a pas de données dans le cache, interrogez la base de données et enregistrez les données dans le cache

    3. Si les données est interrogé dans le cache Retour directement, plus besoin d'interroger la base de données

Étape de mise en œuvre
  • Créer le fichier redisPool.go pour l'initialisation du pool de connexion

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
        },
    }
}
Copier après la connexion
  • Créer le fichier main.go pour implémenter le cache de deuxième niveau

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)
    }
}
Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:cnblogs.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!