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:
make
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
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;
La creación de la función redis_publish
CREATE FUNCTION redis_publish RETURNS STRING SONAME 'redis.so';
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
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.
corrida
mysql> select redis_publish('msg_channel','hello world!');