MySQL provocar llamadas a UDF Redis sincronización de publicación-suscripción modelo

El uso de C / C ++ extensiones Hiredis y Redis interactivo

Fredis

Hiredis es una biblioteca de cliente C minimalista de la base de datos Redis.

https://github.com/redis/hiredis

Hiredis entrar en el catálogo:
Aquí Insertar imagen Descripción

make

Aquí Insertar imagen DescripciónAquí Insertar imagen Descripción

make install

Si MySQL es entorno de estibador, el CP hiredis paquete de instalación en el recipiente después de la ventana acoplable, ejecute el siguiente comando:

mkdir -p /usr/local/include/hiredis /usr/local/include/hiredis/adapters /usr/local/lib
cp -pPR hiredis.h async.h read.h sds.h /usr/local/include/hiredis
cp -pPR adapters/*.h /usr/local/include/hiredis/adapters
cp -pPR libhiredis.so /usr/local/lib/libhiredis.so.0.14
cd /usr/local/lib && ln -sf libhiredis.so.0.14 libhiredis.so
cp -pPR libhiredis.a /usr/local/lib
mkdir -p /usr/local/lib/pkgconfig
cp -pPR hiredis.pc /usr/local/lib/pkgconfig

función de compilación UDF

Una función definida por el usuario (UDF) es una manera de extender MySQL con una nueva función que funciona como una función nativa de MySQL (built-in) como el ABS () o CONCAT ().

Para que el mecanismo UDF para el trabajo, las funciones deben escribirse en C o C ++ (u otro lenguaje que puede utilizar convenciones de llamada C), el sistema operativo debe soportar carga dinámica y debe haber compilado mysqld dinámicamente (no estáticamente).

La creación de redis.cpp

#include <stdio.h>
#include <string.h>
#include <string>
#include <mysql.h>
#include <hiredis/hiredis.h>
using namespace std;

const char *redisHost="173.0.20.109";
int redisPort=16379;
const char *redis_password="redis-secret-0123passw0rd";

extern "C" long long redis_publish(UDF_INIT *initid, UDF_ARGS *args, char *is_null, char *error)  
{  

    redisContext* c = redisConnect(redisHost, redisPort); 
    char *channelName = (char *)args->args[0];  
    char *message = (char *)args->args[1]; 
    if ( c->err)  
    {  
        redisFree(c);  
        strcpy(error,"connect error");  
        return -1;
    }
   
    redisReply* r = (redisReply *)redisCommand(c, "AUTH %s", redis_password);
    if (r->type == REDIS_REPLY_ERROR) {
    	return -1;
    }
    r = (redisReply*)redisCommand(c, " publish %s %s ",channelName,message);
    if (r->type == REDIS_REPLY_ERROR) {
    	return -1;
    }
    freeReplyObject(r);

    redisFree(c);  //free redis connect
    return 1;
}  

extern "C" my_bool redis_publish_init(UDF_INIT *initid, UDF_ARGS *args, char *message)  
{  
    if(args->arg_count!=2){
        strcpy(
            message
        ,   "Expected exactly two arguments"
        );      
        return 1;
    }
    return 0;
} 

Compilar

g++ -fPIC -Wall -shared -DMYSQL_DYNAMIC_PLUGIN -o redis.so redis.cpp -I /usr/include/mysql/ -L /usr/local/lib/ -l hiredis

la generación de archivos .so
Aquí Insertar imagen Descripción

mysql> show variables like 'plugin_dir';
docker cp redis.so 容器ID:/usr/lib/mysql/plugin

la operación de SQL con Redis

.So archivo para ejecutar

función de vista MySQL UDF que ya existe

select * from mysql.func;

Aquí Insertar imagen Descripción
La creación de la función redis_publish

CREATE FUNCTION redis_publish RETURNS STRING SONAME 'redis.so';

Aquí Insertar imagen Descripción

error

Error: 11 libhiredis.so.0.14: no se puede abrir el archivo objeto compartido: No existe el fichero o directorio

sudo cp /usr/local/lib/libhiredis.so.0.14 /usr/lib/

ERROR 1127 (HY000): No se puede
Aquí Insertar imagen Descripción
encontrar el símbolo 'redis_publish' en la biblioteca porque la función de MySQL UDF que ya existen, incluyendo el redis.so, después de volver a compilar los archivos fuente de reemplazo redis.so generados, ninguna necesidad original de MySQL redis.so las funciones UDF caen, y luego volver a importar.
Aquí Insertar imagen Descripción

corrida

mysql> select redis_publish('msg_channel','hello world!');

Aquí Insertar imagen Descripción
Aquí Insertar imagen Descripción

Publicado 72 artículos originales · ganado elogios 66 · Vistas de 150.000 +

Supongo que te gusta

Origin blog.csdn.net/miaodichiyou/article/details/102579573
Recomendado
Clasificación