精华内容
下载资源
问答
  • 使用场景当我们需要redis存储大量数据时,只有一台redis服务器不能够满足需求;但如果扩大内容,由于需要长时间去寻址,也不能达到要求.就需要另一种方式Redis分片说明一般是采用多台Redis,分别去存储用户数据,从而...

    使用场景

    当我们需要redis存储大量的数据时,只有一台redis服务器不能够满足需求;但如果扩大内容,由于需要长时间去寻址,也不能达到要求.
    就需要另一种方式

    Redis分片

    说明

    一般是采用多台Redis,分别去存储用户的数据,从而实现内存数据的扩容.
    对于用户而言:会将Redis分片的多个Redis当作一个整体,不在乎数据存在那个中,只在乎能不能存储
    分片的主要作用:实现内存的扩容

    准备

    1.创建目录
    在redis根目录中创建一个shards目录
    image
    2.分片搭建
    由于Redis启动是根据配置文件运行的,所以如果需要准备3台redis,则需要复制3份配置文件redis.conf. 端口号依次为6379/6380/6381.
    命令:cp redis.conf shards/6379.conf/cp redis.conf shards/6380.conf/cp redis.conf shards/6381.conf
    3.修改端口号
    根据配置文件名称,动态修改对应的端口即可--文件中port修改
    4.启动Redis
    启动Redis服务:

     redis-server  6379.conf
     redis-server  6380.conf
     redis-server  6381.conf

    通过ps -ef | grep redis检查服务是否启动.

    入门案例

     /**
         * 测试Redis分片机制
         * 业务思路:
         *      用户需要通过API来操作3台redis.用户无需关心数据如何存储,
         *      只需要了解数据能否存储即可.
         */
        @Test
        public void testShards(){
            List<JedisShardInfo> list = new ArrayList<>();
            list.add(new JedisShardInfo("192.168.126.129", 6379));
            list.add(new JedisShardInfo("192.168.126.129", 6380));
            list.add(new JedisShardInfo("192.168.126.129", 6381));
            ShardedJedis shardedJedis = new ShardedJedis(list);
            shardedJedis.set("2020", "redis分片");
            System.out.println(shardedJedis.get("2020"));
        }

    一致性hash算法

    通过上边的入门案例,我们可以看到有输出的kv结果,证明我们的分片是成功进行了存储的,但是我们共启动了三个redis服务,我们通过服务端keys *命令的查找,也发现,其数据是存储在6381端口的redis中.
    那么它是怎么判断存储在哪个redis中呢?--这就用到了hash一致性算法

    介绍

    百度介绍如下:
    一致性哈希算法在1997年由麻省理工学院提出,是一种特殊的哈希算法,目的是解决分布式缓存的问题。在移除或者添加一个服务器时,能够尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。一致性哈希解决了简单哈希算法在分布式哈希表( Distributed Hash Table,DHT) 中存在的动态伸缩等问题

    hash

    1. 常见hash是8位16进制数
    2. 16进制数取值:0-9 A-F 共16个数
    3. hash的取值范围:00000000-FFFFFFFF(00000000与FFFFFFFFF是同一个数)
    4. 00000000-FFFFFFFF共有2^32个数
    5. 对相同的数据取hash值相同

    一致性hash说明

    步骤:
    1.首先计算node节点hash值
    2.将用户的key进行hash计算,之后按照顺时针的方向找到最近的node节点之后链接,执行set操作.
    如图所示:
    image

    一致性hash特性

    1. 特性一--平衡性

    平衡性是指hash的结果应该平均分配到各个节点,这样从算法上解决了负载均衡问题
    说明: 如果发现节点中存储的数据负载不均,则采用虚拟节点的方式实现数据的平衡(相对平衡)
    image

    1. 特性二--单调性

    单调性是指在新增或者删减节点时,不影响系统正常运行,因为可以实现自动的数据迁移.
    原则: 在进行数据迁移时 应该尽可能少的改变原有的数据.(只有发生迁移的移动,迁移到最近的节点)

    1. 特性三--分散性

    分散性是指数据应该分散地存放在分布式集群中的各个节点(节点自己可以有备份),不必每个节点都存储所有的数据

    SpringBoot整合Redis分片

    分片说明

    1.Redis分片的主要的作用是实现内存数据的扩容,Redis分片如果宕机不能实现高可用.
    2.Redis的分片的计算发生在业务服务器(tomcat)中 将需要保存的数据存储到redis中.
    3.Redis分片的执行的效率是最高的.(只负责存和取)

    整合实现

    1.编辑redis.properties配置文件

    #配置多台的redis信息 redis.nodes=192.168.126.129:6379,192.168.126.129:6380,192.168.126.129:6381

    2.编辑redis配置类

    @Value("${redis.nodes}") 
    private String nodes; //node,node,node 
    /** 
    * 添加Redis分片的配置 
    * 需求1: 动态的获取IP地址/PORT端口 
    * 动态的获取多个的节点信息. 方便以后扩展 
    */ 
    @Bean 
    public ShardedJedis shardedJedis(){ 
        List<JedisShardInfo> list = new ArrayList<>(); 
        String[] strArray = nodes.split(","); //[node,node,node] for (String node : strArray){ //ip:port 
            String host = node.split(":")[0]; 
            int port = Integer.parseInt(node.split(":")[1]); 
            list.add(new JedisShardInfo(host,port )); 
        } 
        return new ShardedJedis(list); 
    }

    3.修改AOP注入项-->将AOP缓存中的注入项改为分片对象

    //注入缓存reids对象  
    @Autowired  
    private ShardedJedis jedis; //注入redis分片机制

    只更改了类型并没改变名称,减少代码修改.

    展开全文
  • redis 出现,很大程度补偿了memcached 这类 keyvalue 存储不足,在部分场合可以对关系数据库起到很好补充作用。它提供了 Python,Ruby,Erlang,PHP 客户端,使用很方便。Redis 所有数据都是保存在内存中,然后不...

    一redis简介:redis 是一个高性能的 key-value 数据库。 redis 的出现,很大程度补偿了memcached 这类 keyvalue 存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了 Python,Ruby,Erlang,PHP 客户端,使用很方便。Redis 的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个appendonly file(aof)里面(这称为“全持久化模式”)。

    二主机环境 rhel6.5 selinx and iptales disabled

    1. Redis 安装

    实验环境   172.25.254.2    vm2.example.com   上

    首先得到    zxf redis-3.0.2.tar.gz

    tar zxf redis-3.0.2.tar.gz

    cd redis-3.0.2

    make && make install

    1.1. 配置并启动服务

    cd utils/

    ./install_server.sh              这里一路回车都使用的默认

    点击(此处)折叠或打开

    [root@vm2 utils]# ./install_server.sh

    Welcome to the redis service installer

    This script will help you easily set up a running redis server

    Please select the redis port for this instance: [6379]

    Selecting default: 6379

    Please select the redis config file name [/etc/redis/6379.conf]

    Selected default - /etc/redis/6379.conf

    Please select the redis log file name [/var/log/redis_6379.log]

    Selected default - /var/log/redis_6379.log

    Please select the data directory for this instance [/var/lib/redis/6379]

    Selected default - /var/lib/redis/6379

    Please select the redis executable path [/usr/local/bin/redis-server]

    Selected config:

    Port : 6379

    Config file : /etc/redis/6379.conf

    Log file : /var/log/redis_6379.log

    Data dir : /var/lib/redis/6379

    Executable : /usr/local/bin/redis-server

    Cli Executable : /usr/local/bin/redis-cli

    Is this ok? Then press ENTER to go on or Ctrl-C to abort.

    Copied /tmp/6379.conf => /etc/init.d/redis_6379

    Installing service...

    Successfully added to chkconfig!

    Successfully added to runlevels 345!

    Starting Redis server...

    Installation successful!

    1.2简单测试,如下就证明成功

    点击(此处)折叠或打开

    [root@vm2 utils]# redis-cli

    127.0.0.1:6379> ping

    PONG

    2 安装lnmp架构2.1 安装以下软件包

    点击(此处)折叠或打开

    [root@vm2 lnmp]# ls

    nginx-1.8.0-1.el6.ngx.x86_64.rpm php-fpm-5.3.3-38.el6.x86_64.rpm

    php-5.3.3-38.el6.x86_64.rpm php-gd-5.3.3-38.el6.x86_64.rpm

    php-cli-5.3.3-38.el6.x86_64.rpm php-mbstring-5.3.3-38.el6.x86_64.rpm

    php-common-5.3.3-38.el6.x86_64.rpm php-mysql-5.3.3-38.el6.x86_64.rpm

    php-devel-5.3.3-38.el6.x86_64.rpm php-pdo-5.3.3-38.el6.x86_64.rpm

    [root@vm2 lnmp]# yum install -y *

    2.2安装 php 的 redis 扩展

    首先得到    phpredis-master.zip

    unzip  phpredis-master.zip

    cd  phpredis-master

    phpize

    ./configure

    make  &&  make  install

    cd /etc/php.d/

    cp mysql.ini  redis.ini

    vim /etc/php.ini                     #添加以下行

    extension=redis.so               #加载 redis 模块

    点击(此处)折叠或打开

    [root@vm2 php.d]# /etc/init.d/php-fpm start

    Starting php-fpm: [ OK ]

    2.3简单配置 nginx

    vim /etc/nginx/conf.d/default.conf

    location / {

    root   /usr/share/nginx/html;

    index   index.php  index.html index.htm;

    }

    location ~ \.php$ {

    root           /usr/share/nginx/html;

    fastcgi_pass   127.0.0.1:9000;

    fastcgi_index  index.php;

    fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;

    include        fastcgi_params;

    }

    启动 nginx

    点击(此处)折叠或打开

    [root@vm2 php.d]# nginx -t

    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

    nginx: configuration file /etc/nginx/nginx.conf test is successful

    [root@vm2 php.d]# nginx

    [root@vm2 php.d]# netstat -antlpe| grep nginx

    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 0 14520 6352/nginx

    vim   /etc/php-fpm.d/www.conf     将这个配置文件中user和group改为nginx  默认是apache

    user = nginx

    group = nginx

    /etc/init.d/php-fpm restart

    点击(此处)折叠或打开

    [root@vm2 php.d]# /etc/init.d/php-fpm restart

    Stopping php-fpm: [ OK ]

    Starting php-fpm: [ OK ]

    3 在另一台虚拟机上安装mysql

    实验环境   172.25.254.3    vm3.example.com   上

    yum  install  -y  mysql-server

    点击(此处)折叠或打开

    [root@vm3 mnt]# mysql

    Welcome to the MySQL monitor. Commands end with ; or \g.

    Your MySQL connection id is 2

    Server version: 5.1.71 Source distribution

    Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

    Oracle is a registered trademark of Oracle Corporation and/or its

    affiliates. Other names may be trademarks of their respective

    owners.

    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

    mysql> grant all on test.* to redis@'172.25.254.2' identified by 'redhat';

    Query OK, 0 rows affected (0.00 sec)

    mysql> flush privileges;

    Query OK, 0 rows affected (0.00 sec)

    编写如下代码

    点击(此处)折叠或打开

    [root@vm3 mnt]# cat test.sql

    use test;

    CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;

    INSERT INTO `test` VALUES (1,'test1'),(2,'test2'),(3,'test3'),(4,'test4'),(5,'test5'),(6,'test6'),(7,'test7'),(8,'test8'),(9,'test9');

    [root@vm3 mnt]# mysql < test.sql

    4创建 php 测试页面在172.25.254.2上面进入nginx默认发布目录

    cd     /usr/share/nginx/html

    vim  test.php

    点击(此处)折叠或打开

    $redis = new Redis();

    $redis->connect('127.0.0.1',6379) or die ("could net connect redis server");

    # $query = "select * from test limit 9";

    $query = "select * from test";

    for ($key = 1; $key < 10; $key++)

    {

    if (!$redis->get($key))

    {

    $connect = mysql_connect('172.25.254.3','redis','redhat');

    mysql_select_db(test);

    $result = mysql_query($query);

    //如果没有找到$key,就将该查询sql的结果缓存到redis

    while ($row = mysql_fetch_assoc($result))

    {

    $redis->set($row['id'],$row['name']);

    }

    $myserver = 'mysql';

    break;

    }

    else

    {

    $myserver = "redis";

    $data[$key] = $redis->get($key);

    }

    }

    echo $myserver;

    echo "

    ";

    for ($key = 1; $key < 10; $key++)

    {

    echo "number is $key";

    echo "

    ";

    echo "name is $data[$key]";

    echo "

    ";

    }

    ?>然后在浏览器进行测试,这时候我们已经实现了 redis 作为 mysql 的缓存服务器,但是如果更新了 mysql,redis

    中仍然会有对应的 KEY,数据就不会更新,此时就会出现 mysql 和 redis 数据不一致的情

    况。所以接下来就要通过 mysql 触发器将改变的数据同步到 redis 中。

    34d848b6e4ec90364b5879891f811b03.png

    5,配置 gearman 实现数据同步

    1. 安装 gearman 软件包:

    gearmand libgearman-devel libgearman libevent libevent-devel

    libevent-doc libevent-headers tokyocabinet

    2,启动服务

    点击(此处)折叠或打开

    [root@vm2 html]# /etc/init.d/gearmand start

    Starting gearmand: [ OK ]

    3.安装 php 的 gearman 扩展

    https://pecl.php.net

    yum install -y db*-devel

    tar zxf gearman-1.1.2.tgz

    cd gearman-1.1.2

    ./configure --with-php-config=/usr/bin/php-config

    make && make install

    # vim /etc/php.ini

    extension=gearman.so

    /etc/init.d/php-fpm  restart

    点击(此处)折叠或打开

    [root@vm2 html]# /etc/init.d/php-fpm restart

    Stopping php-fpm: [ OK ]

    Starting php-fpm: [ OK ]

    4. 安装 lib_mysqludf_json

    lib_mysqludf_json UDF 库函数将关系数据映射为 JSON 格式。通常,数据库中的数据映

    射为 JSON 格式,是通过程序来转换的。

    https://github.com/mysqludf/lib_mysqludf_json

    yum install -y mysql-devel# unzip lib_mysqludf_json-master.zip

    cd lib_mysqludf_json-master

    gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so

    lib_mysqludf_json.c

    查看 mysql 的模块目录:

    f22db43ce09e80bae89aef94f5f823c7.png

    5. 安装 gearman-mysql-udf

    这个插件是用来管理调用 Gearman 的分布式的队列。

    https://launchpad.net/gearman-mysql-udf

    tar zxf gearman-mysql-udf-0.6.tar.gz

    cd gearman-mysql-udf-0.6

    ./configure --with-mysql=/usr/bin/mysql_config

    --libdir=/usr/lib64/mysql/plugin/

    make# make install

    拷贝 lib_mysqludf_json.so 模块:

    cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/

    注册 UDF 函数

    点击(此处)折叠或打开

    mysql> CREATE FUNCTION json_object RETURNS STRING SONAME

    'lib_mysqludf_json.so';

    mysql> CREATE FUNCTION gman_do_background RETURNS STRING SONAME

    'libgearman_mysql_udf.so';

    mysql> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME

    'libgearman_mysql_udf.so';

    查看函数

    fb0619d3405621d29e6cbdf501b4ffde.png

    指定 gearman 的服务信息

    7c3ea15b25bddd17ea564922ae19c45e.png

    6. 编写 mysql 触发器(根据实际情况编写)

    点击(此处)折叠或打开

    vim test.sql

    use test;

    DELIMITER $$

    CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN

    SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as

    `id`, NEW.name as `name`));

    END$$

    DELIMITER ;

    查看触发器

    3da791118c09313b4d873198f873e07a.png

    7. 编写 gearman 的 worker 端

    点击(此处)折叠或打开

    vim worker.php

    $worker = new GearmanWorker();

    $worker->addServer();

    $worker->addFunction('syncToRedis', 'syncToRedis');

    $redis = new Redis();

    $redis->connect('127.0.0.1', 6379);

    while($worker->work());

    function syncToRedis($job)

    {

    global $redis;

    $workString = $job->workload();

    $work = json_decode($workString);

    if(!isset($work->id)){

    return false;

    }

    $redis->set($work->id, $work->name); #这条语句就是将 id 作 KEY 和

    name 作 VALUE 分开存储,需要和前面写的 php 测试代码的存取一致。

    }

    ?>

    后台运行 worker

    nohup php worker.php &

    47e821b7f16702e786b1924b890cc78b.png

    然后在3上更新数据库

    d3760f23459a804dea820366642bfde7.png

    然后再浏览器中进行测试

    418c5989dfa1b3bf403482d9944d3108.png

    88633bbd11cb212f557e7511bf9adc33.png

    展开全文
  • 转自:https://www.iyunv.com/thread-52670-1-1.html一、redis简介Redis是一个key-value存储系统。和Memcached类似,为了保证效率,数据都是缓存在内存中。...在部分场合可以对关系数据库起到很好补充作用...

    转自:https://www.iyunv.com/thread-52670-1-1.html

    一、redis简介

    Redis是一个key-value存储系统。和Memcached类似,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++(hiredis),C#,PHP,JavaScript,Perl,Object-C,Python,Ruby等客户端,使用很方便。

    二、架构图

    44a9f04682613f4cb3154c01f8173da3.png

    大致结构就是读写分离,将mysql中的数据通过触发器同步到redis中

    三、安装LNMP环境(这里为了省事,就是用yum来安装)

    1、修改yum源

    [iyunv@redis ~]#vim /etc/yum.repos.d/epel.repo #添加这个文件

    [epel]

    name=Extra Packages for Enterprise Linux 6 - $basearchbaseurl=http://download.fedoraproject.org/pub/epel/6/$basearchfailovermethod=priority

    enabled=1gpgcheck=0[nginx]

    name=nginx repo

    baseurl=http://nginx.org/packages/centos/6/$basearch/gpgcheck=0enabled=1

    2、yum安装

    [iyunv@redis ~]#yum -y install nginx php php-fpm php-cli php-common php-gd php-mbstring php-mysql php-pdo php-devel php-xmlrpc php-xml php-bcmath php-dba php-enchant mysql mysql-server

    3、简单配置一下nginx

    [iyunv@redis ~]#vim /etc/nginx/nginx.conf

    server {

    listen80;#定义使用www.xx.com访问

    server_name www.xx.com;#设定本虚拟主机的访问日志

    access_log /logs/www.xx.com.access.log main;#默认请求

    location /{

    root/www/; #定义服务器的默认网站根目录位置

    index index.php index.html index.htm; #定义首页索引文件的名称

    }

    location ~ \.php${

    root/www/;

    fastcgi_pass127.0.0.1:9000;

    fastcgi_index index.php;

    fastcgi_param SCRIPT_FILENAME/www/$fastcgi_script_name;

    include fastcgi_params;

    }

    }

    4、启动服务

    [iyunv@redis ~]#sed -i 's/apache/nginx/g' /etc/php-fpm.d/www.conf

    [iyunv@redis ~]#/etc/init.d/php-fpm start

    正在启动 php-fpm: [确定]

    [iyunv@redis ~]#/etc/init.d/mysqld start

    正在启动 mysqld: [确定]

    [iyunv@redis ~]#mkdir /{logs,www}

    [iyunv@redis ~]#chown -R nginx:nginx /{logs,www}

    [iyunv@redis ~]#/etc/init.d/nginx start

    正在启动 nginx: [确定]

    [iyunv@redis www]#service iptables stop

    iptables: Flushing firewall rules: [ OK ]

    iptables: Setting chains to policy ACCEPT:filter[ OK ]

    iptables: Unloading modules: [ OK ]

    [iyunv@redis redis]#netstat -tnlp #查看监听

    Active Internet connections (only servers)

    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

    tcp0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2101/nginx

    tcp0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 7544/php-fpm

    tcp0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1871/mysqld

    5、给mysql授权

    [iyunv@redis ~]#mysql

    mysql> grant all privileges on *.* to root@localhost identified by '123456';

    mysql> flush privileges;

    6、测试

    [iyunv@redis ~]#vim /www/index.php

    phpinfo();?>

    然后访问页面看到php的相关信息,基础环境就算搭建完成了。

    四、安装redis

    1、安装redis

    [iyunv@redis ~]#wget -c -t 0 http://download.redis.io/releases/redis-2.8.19.tar.gz

    [iyunv@redis ~]#mkdir /usr/local/redis

    [iyunv@redis ~]#tar xvf redis-2.8.19.tar.gz#安装很简单、直接make就可以了

    [iyunv@redis ~]#cd redis-2.8.19

    [iyunv@redis redis-2.8.19]#make

    #编译完成后,将src中的可执行文件拷贝到刚刚创建的目录中

    [iyunv@redis src]#cp redis-benchmark redis-check-aof redis-check-dump redis-cli redis-sentinel redis-server /usr/local/redis/

    [iyunv@redis redis-2.8.19]#cp redis.conf sentinel.conf /usr/local/redis/

    Redis-benchmark      压力测试工具

    Redis-check-aof      检查redis持久化命令文件的完整性

    Redis-check-dump     检查redis持久化数据文件的完整性

    Redis-cli            redis在linux上的客户端

    Redis-sentinel       redis-sentinel是集群管理工具,主要负责主从切换。

    Redis-server         Redis服务器的daemon启动程序

    2、安装php的redis扩展

    [iyunv@redis ~]#wget -c -t 0 https://github.com/owlient/phpredis/archive/master.zip

    [iyunv@redis ~]#unzip master.zip

    [iyunv@redis ~]#cd phpredis-master/

    [iyunv@redis phpredis-master]#phpize

    [iyunv@redis phpredis-master]#./configure --with-php-config=/usr/bin/php-config

    [iyunv@redis phpredis-master]#make && make install

    #修改php的配置文件,如果没有“extension=redis.so”,就加上这一行

    [iyunv@redis ~]#vim /etc/php.ini

    extension=redis.so

    [iyunv@redis ~]#/etc/init.d/php-fpm restart

    停止 php-fpm: [确定]

    正在启动 php-fpm: [确定]

    3、是否安装成功

    还是访问phpinfo的那个界面

    e0e3f71bb5ffe1f7f2175b789b83bc28.png

    看到这个就是安装完成了。

    五、读写分离

    这里只是简单的做了一下读,没有写操作的相关代码,过一会测试,直接到数据库里执行update来模拟写操作。

    1、在mysql中插入一些测试数据

    [iyunv@redis ~]#mysql -u root -p123456

    mysql>create database mytest;

    mysql> CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

    mysql> INSERT INTO `test` VALUES (1,'sven'),(2,'jim'),(3,'zhu'),(4,'wang'),(5,'ftd'),(6,'test'),(7,'test01'),(8,'test02'),(9,'test03');

    mysql> select *from mytest.test;+----+--------+

    | id | name |

    +----+--------+

    | 1 | sven |

    | 2 | jim |

    | 3 | zhu |

    | 4 | wang |

    | 5 | ftd |

    | 6 | test |

    | 7 | test01 |

    | 8 | test02 |

    | 9 | test03 |

    +----+--------+

    2、编写php的测试代码

    <?php $redis = newRedis();$redis->connect('127.0.0.1',6379) or die ("could net connect redis server");$query = "select * from test limit 8";//为了简单一点,这里就读取了8条数据

    for ($key = 1; $key < 9; $key++)

    {if (!$redis->get($key))

    {$connect = mysql_connect('127.0.0.1','root','123456');mysql_select_db(mytest);$result = mysql_query($query);//如果没有找到$key,就将该查询sql的结果缓存到redis

    while ($row = mysql_fetch_assoc($result))

    {$redis->set($row['id'],$row['name']);

    }$myserver = 'mysql';break;

    }else{$myserver = "redis";$data[$key] = $redis->get($key);

    }

    }echo $myserver;echo "
    ";for ($key = 1; $key < 9; $key++)

    {echo "number is $key";echo "
    ";echo "name is $data[$key]";echo "
    ";

    }?>

    第一次访问,redis中没有对应的KEY时

    69e89144ef78e4616760865ec12700ad.png

    再次访问,此时redis中已有相关数据

    d5199d9f3770cc3daa5f6729992317f4.png

    到这里,我们已经实现了redis作为mysql的缓存服务器,但是如果更新了mysql,redis中仍然会有对应的KEY,数据就不会更新,此时就会出现mysql和redis数据不一致的情况。所以接下来就要通过mysql触发器将改变的数据同步到redis中。

    六、通过gearman实现同步

    1、介绍

    Gearman是一个支持分布式的任务分发框架:

    Gearman Job Server:Gearman核心程序,需要编译安装并以守护进程形式运行在后台。

    Gearman Client:可以理解为任务的请求者。

    Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行,Gearman Worker接收到Gearman Client传递的任务内容后,会按顺序处理。

    大致流程:

    下面要编写的mysql触发器,就相当于Gearman的客户端。修改表,插入表就相当于直接下发任务。然后通过lib_mysqludf_json UDF库函数将关系数据映射为JSON格式,然后在通过gearman-mysql-udf插件将任务加入到Gearman的任务队列中,最后通过redis_worker.php,也就是Gearman的worker端来完成redis数据库的更新。

    2、安装启动

    [iyunv@redis ~]#yum -y install gearmand libgearman-devel

    [iyunv@redis ~]#/etc/init.d/gearmand start

    正在启动 gearmand: [确定]

    [iyunv@redis ~]#/etc/init.d/gearmand status

    gearmand (pid 7702) 正在运行...

    3、安装php的gearman扩展

    [iyunv@redis ~]#wget -c -t 0 https://pecl.php.net/get/gearman-1.1.1.tgz

    [iyunv@redis ~]#tar xvf gearman-1.1.1.tgz

    [iyunv@redis ~]#cd gearman-1.1.1

    [iyunv@redis gearman-1.1.1]#phpize

    [iyunv@redis gearman-1.1.1]#./configure --with-php-config=/usr/bin/php-config

    [iyunv@redis gearman-1.1.1]#make

    [iyunv@redis gearman-1.1.1]#make install

    #如果php的配置文件中没有extension = gearman.so,就加上此行

    [iyunv@redis ~]#vim /etc/php.ini

    extension = gearman.so

    [iyunv@redis ~]#/etc/init.d/php-fpm restart

    停止 php-fpm: [确定]

    正在启动 php-fpm: [确定]

    5cf32c630b0df0c651fdefcf04182b7e.png

    这样就是安装成功了

    4、安装lib_mysqludf_json

    lib_mysqludf_json UDF库函数将关系数据映射为JSON格式。通常,数据库中的数据映射为JSON格式,是通过程序来转换的。

    [iyunv@redis ~]#wget -c -t 0 https://github.com/mysqludf/lib_mysqludf_json/archive/master.zip

    [iyunv@redis ~]#unzip master.zip

    [iyunv@redis ~]#cd lib_mysqludf_json-master/

    [iyunv@redis lib_mysqludf_json-master]#gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

    lib_mysqludf_json.c:40:23: 错误:my_global.h:没有那个文件或目录

    lib_mysqludf_json.c:41:20: 错误:my_sys.h:没有那个文件或目录

    lib_mysqludf_json.c:43:19: 错误:mysql.h:没有那个文件或目录

    lib_mysqludf_json.c:44:21: 错误:m_ctype.h:没有那个文件或目录

    lib_mysqludf_json.c:45:22: 错误:m_string.h:没有那个文件或目录#这里编译报错是因为没有安装mysql的开发包,如果是源码安装的mysql,需要在/etc/ld.so.conf.d/

    #目录下新建一个文件告诉系统mysql的头文件在哪里

    [iyunv@redis lib_mysqludf_json-master]#yum -y install mysql-devel

    [iyunv@redis lib_mysqludf_json-master]#gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

    mysql> show global variables like 'plugin_dir';+---------------+-------------------------+

    | Variable_name | Value |

    +---------------+-------------------------+

    | plugin_dir | /usr/lib64/mysql/plugin |

    +---------------+-------------------------+

    #将模块拷贝到插件目录下

    [iyunv@redis lib_mysqludf_json-master]#cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/

    #注册UDF函数

    mysql> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';

    5、安装gearman-mysql-udf

    这个插件是用来管理调用 Gearman 的分布式的队列。

    [iyunv@redis ~]#wget -c -t 0 https://launchpad.net/gearman-my ... ysql-udf-0.6.tar.gz

    [iyunv@redis ~]#tar xvf gearman-mysql-udf-0.6.tar.gz

    [iyunv@redis ~]#cd gearman-mysql-udf-0.6

    [iyunv@redis gearman-mysql-udf-0.6]#./configure --with-mysql=/usr/bin/mysql_config --libdir=/usr/lib64/mysql/plugin/

    [iyunv@redis gearman-mysql-udf-0.6]#make

    [iyunv@redis gearman-mysql-udf-0.6]#make install

    #注册UDF函数

    mysql> CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so';

    mysql> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';#查看函数

    mysql> select * from mysql.func;+--------------------+-----+-------------------------+----------+

    | name | ret | dl | type |

    +--------------------+-----+-------------------------+----------+

    | json_object | 0 | lib_mysqludf_json.so | function |

    | gman_do_background | 0 | libgearman_mysql_udf.so | function |

    | gman_servers_set | 0 | libgearman_mysql_udf.so | function |

    +--------------------+-----+-------------------------+----------+

    #指定gearman的服务信息

    mysql> SELECT gman_servers_set('127.0.0.1:4730');

    6、编写mysql触发器(根据实际情况编写)

    DELIMITER $$CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN

    SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as`name`));END$$

    DELIMITER ;

    7、编写gearman的worker端

    [iyunv@redis ~]#vim /www/redis_worker.php

    <?php $worker =new GearmanWorker();$worker->addServer();$worker->addFunction('syncToRedis', 'syncToRedis');$redis =new Redis();$redis->connect('127.0.0.1', 6379);while($worker->work());

    function syncToRedis($job)

    {

    global$redis;$workString = $job->workload();$work = json_decode($workString);if(!isset($work->id)){returnfalse;

    }$redis->set($work->id, $work->name);

    }?>

    #后台运行

    [iyunv@redis www]#nohup php redis_worker.php &

    "$redis->set($work->id, $work->name);"这条语句就是将id作KEY和name作VALUE分开存储,需要和前面写的php测试代码的存取一致。

    8、更新mysql中的数据

    mysql> set @RECV = 1;

    mysql> select @RECV;+------+

    | @RECV|

    +------+

    | 1 |

    +------+

    mysql> update test set name = 'ssss' where id = 1;

    mysql> select @RECV;+------+

    | @RECV|

    +------+

    | NULL |

    +------+

    从返回值可以看到,触发器是触发成功的(这里的@RECV是上面mysql TIGGER的返回值)。我们在redis中查看数据:

    [iyunv@redis redis]#./redis-cli

    127.0.0.1:6379> get 1

    "sven"

    这里的数据居然没有变化,这是我们就要排错了。

    [iyunv@redis ~]#vim /var/log/audit/audit.log

    type=AVC msg=audit(1427807674.425:107): avc: denied { name_connect } for pid=12453 comm="mysqld" dest=4730 scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=system_u:o

    bject_r:port_t:s0 tclass=tcp_socket#看到这样一条日志,就知道是selinux阻止了同步

    #现在将selinux的模式调成Permissive

    [iyunv@redis ~]#getenforce

    Enforcing

    [iyunv@redis ~]#setenforce 0

    [iyunv@redis ~]#getenforce

    Permissive

    设置完成以后,再次执行update,进入redis进行查看

    127.0.0.1:6379> get 1

    "ssss"

    刷新一下刚刚的php界面

    2f7d8e373bd170157d85c2263eae4f4a.png

    到这里就基本算是大功告成了,只要application将数据写到mysql中,mysql触发器检测到更新,就会通过Gearman将数据同步到redis中。然后读取的话,就直接从redis中进行读取。当然这只是个实验环境,实际上还有很多细节要调整。

    展开全文
  • 一、redis简介Redis是一个key-value存储系统。和Memcached类似,为了保证效率,数据都是缓存在内存中。...在部分场合可以对关系数据库起到很好补充作用。它提供了Java,C/C++(hiredis),C#,PHP,JavaScript,Per...

    一、redis简介

    Redis是一个key-value存储系统。和Memcached类似,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。在部分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++(hiredis),C#,PHP,JavaScript,Perl,Object-C,Python,Ruby等客户端,使用很方便。

    二、架构图

    94a327cd31525867608aec0e0cb8e77b.png

    大致结构就是读写分离,将mysql中的数据通过触发器同步到redis中

    三、安装LNMP环境(这里为了省事,就是用yum来安装)

    1、修改yum源

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    [iyunv@redis ~]# vim /etc/yum.repos.d/epel.repo #添加这个文件

    [epel]

    name=Extra Packages for Enterprise Linux 6 - $basearch

    baseurl=http://download.fedoraproject.org/pub/epel/6/$basearch

    failovermethod=priority

    enabled=1

    gpgcheck=0

    [nginx]

    name=nginx repo

    baseurl=http://nginx.org/packages/centos/6/$basearch/

    gpgcheck=0

    enabled=1

    2、yum安装

    1

    [iyunv@redis ~]# yum -y install nginx php php-fpm php-cli php-common php-gd php-mbstring php-mysql php-pdo php-devel php-xmlrpc php-xml php-bcmath php-dba php-enchant mysql mysql-server

    3、简单配置一下nginx

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    [iyunv@redis ~]# vim /etc/nginx/nginx.conf

    server {

    listen 80;

    #定义使用www.xx.com访问

    server_name www.xx.com;

    #设定本虚拟主机的访问日志

    access_log /logs/www.xx.com.access.log main;

    #默认请求

    location / {

    root /www/; #定义服务器的默认网站根目录位置

    index index.php index.html index.htm; #定义首页索引文件的名称

    }

    location ~ \.php$ {

    root /www/;

    fastcgi_pass 127.0.0.1:9000;

    fastcgi_index index.php;

    fastcgi_param SCRIPT_FILENAME /www/$fastcgi_script_name;

    include fastcgi_params;

    }

    }

    4、启动服务

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    [iyunv@redis ~]# sed -i 's/apache/nginx/g' /etc/php-fpm.d/www.conf

    [iyunv@redis ~]# /etc/init.d/php-fpm start

    正在启动 php-fpm: [确定]

    [iyunv@redis ~]# /etc/init.d/mysqld start

    正在启动 mysqld: [确定]

    [iyunv@redis ~]# mkdir /{logs,www}

    [iyunv@redis ~]# chown -R nginx:nginx /{logs,www}

    [iyunv@redis ~]# /etc/init.d/nginx start

    正在启动 nginx: [确定]

    [iyunv@redis www]# service iptables stop

    iptables: Flushing firewall rules: [ OK ]

    iptables: Setting chains to policy ACCEPT: filter [ OK ]

    iptables: Unloading modules: [ OK ]

    [iyunv@redis redis]# netstat -tnlp #查看监听

    Active Internet connections (only servers)

    Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name

    tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2101/nginx

    tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 7544/php-fpm

    tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1871/mysqld

    5、给mysql授权

    1

    2

    3

    4

    [iyunv@redis ~]# mysql

    mysql> grant all privileges on *.* to root@localhost identified by '123456';

    mysql> flush privileges;

    6、测试

    1

    2

    3

    4

    [iyunv@redis ~]# vim /www/index.php

    phpinfo();

    ?>

    然后访问页面看到php的相关信息,基础环境就算搭建完成了。

    四、安装redis

    1、安装redis

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    [iyunv@redis ~]# wget -c -t 0 http://download.redis.io/releases/redis-2.8.19.tar.gz

    [iyunv@redis ~]# mkdir /usr/local/redis

    [iyunv@redis ~]# tar xvf redis-2.8.19.tar.gz

    #安装很简单、直接make就可以了

    [iyunv@redis ~]# cd redis-2.8.19

    [iyunv@redis redis-2.8.19]# make

    #编译完成后,将src中的可执行文件拷贝到刚刚创建的目录中

    [iyunv@redis src]# cp redis-benchmark redis-check-aof redis-check-dump redis-cli redis-sentinel redis-server /usr/local/redis/

    [iyunv@redis redis-2.8.19]# cp redis.conf sentinel.conf /usr/local/redis/

    Redis-benchmark 压力测试工具

    Redis-check-aof 检查redis持久化命令文件的完整性

    Redis-check-dump 检查redis持久化数据文件的完整性

    Redis-cli redis在linux上的客户端

    Redis-sentinel redis-sentinel是集群管理工具,主要负责主从切换。

    Redis-server Redis服务器的daemon启动程序

    2、安装php的redis扩展

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    [iyunv@redis ~]# wget -c -t 0 https://github.com/owlient/phpredis/archive/master.zip

    [iyunv@redis ~]# unzip master.zip

    [iyunv@redis ~]# cd phpredis-master/

    [iyunv@redis phpredis-master]# phpize

    [iyunv@redis phpredis-master]# ./configure --with-php-config=/usr/bin/php-config

    [iyunv@redis phpredis-master]# make && make install

    #修改php的配置文件,如果没有“extension=redis.so”,就加上这一行

    [iyunv@redis ~]# vim /etc/php.ini

    extension=redis.so

    [iyunv@redis ~]# /etc/init.d/php-fpm restart

    停止 php-fpm: [确定]

    正在启动 php-fpm: [确定]

    3、是否安装成功

    还是访问phpinfo的那个界面

    682ec413b1aa9bdae54194bd21801b4e.png

    看到这个就是安装完成了。

    五、读写分离

    这里只是简单的做了一下读,没有写操作的相关代码,过一会测试,直接到数据库里执行update来模拟写操作。

    1、在mysql中插入一些测试数据

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    [iyunv@redis ~]# mysql -u root -p123456

    mysql> create database mytest;

    mysql> CREATE TABLE `test` (`id` int(7) NOT NULL AUTO_INCREMENT, `name` char(8) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

    mysql> INSERT INTO `test` VALUES (1,'sven'),(2,'jim'),(3,'zhu'),(4,'wang'),(5,'ftd'),(6,'test'),(7,'test01'),(8,'test02'),(9,'test03');

    mysql> select * from mytest.test;

    +----+--------+

    | id | name |

    +----+--------+

    | 1 | sven |

    | 2 | jim |

    | 3 | zhu |

    | 4 | wang |

    | 5 | ftd |

    | 6 | test |

    | 7 | test01 |

    | 8 | test02 |

    | 9 | test03 |

    +----+--------+

    2、编写php的测试代码

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    $redis = new Redis();

    $redis->connect('127.0.0.1',6379) or die ("could net connect redis server");

    $query = "select * from test limit 8";

    //为了简单一点,这里就读取了8条数据

    for ($key = 1; $key < 9; $key++)

    {

    if (!$redis->get($key))

    {

    $connect = mysql_connect('127.0.0.1','root','123456');

    mysql_select_db(mytest);

    $result = mysql_query($query);

    //如果没有找到$key,就将该查询sql的结果缓存到redis

    while ($row = mysql_fetch_assoc($result))

    {

    $redis->set($row['id'],$row['name']);

    }

    $myserver = 'mysql';

    break;

    }

    else

    {

    $myserver = "redis";

    $data[$key] = $redis->get($key);

    }

    }

    echo $myserver;

    echo "
    ";

    for ($key = 1; $key < 9; $key++)

    {

    echo "number is $key";

    echo "
    ";

    echo "name is $data[$key]";

    echo "
    ";

    }

    ?>

    第一次访问,redis中没有对应的KEY时

    32e6a1e0e7be557d13ff30bf9aaf7f5e.png

    再次访问,此时redis中已有相关数据

    9779c44c418142f729b6ab8a2fbad7f0.png

    到这里,我们已经实现了redis作为mysql的缓存服务器,但是如果更新了mysql,redis中仍然会有对应的KEY,数据就不会更新,此时就会出现mysql和redis数据不一致的情况。所以接下来就要通过mysql触发器将改变的数据同步到redis中。

    六、通过gearman实现同步

    1、介绍

    Gearman是一个支持分布式的任务分发框架:

    Gearman Job Server:Gearman核心程序,需要编译安装并以守护进程形式运行在后台。

    Gearman Client:可以理解为任务的请求者。

    Gearman Worker:任务的真正执行者,一般需要自己编写具体逻辑并通过守护进程方式运行,Gearman Worker接收到Gearman Client传递的任务内容后,会按顺序处理。

    大致流程:

    下面要编写的mysql触发器,就相当于Gearman的客户端。修改表,插入表就相当于直接下发任务。然后通过lib_mysqludf_json UDF库函数将关系数据映射为JSON格式,然后在通过gearman-mysql-udf插件将任务加入到Gearman的任务队列中,最后通过redis_worker.php,也就是Gearman的worker端来完成redis数据库的更新。

    2、安装启动

    1

    2

    3

    4

    5

    [iyunv@redis ~]# yum -y install gearmand libgearman-devel

    [iyunv@redis ~]# /etc/init.d/gearmand start

    正在启动 gearmand: [确定]

    [iyunv@redis ~]# /etc/init.d/gearmand status

    gearmand (pid 7702) 正在运行...

    3、安装php的gearman扩展

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    [iyunv@redis ~]# wget -c -t 0 https://pecl.php.net/get/gearman-1.1.1.tgz

    [iyunv@redis ~]# tar xvf gearman-1.1.1.tgz

    [iyunv@redis ~]# cd gearman-1.1.1

    [iyunv@redis gearman-1.1.1]# phpize

    [iyunv@redis gearman-1.1.1]# ./configure --with-php-config=/usr/bin/php-config

    [iyunv@redis gearman-1.1.1]# make

    [iyunv@redis gearman-1.1.1]# make install

    #如果php的配置文件中没有extension = gearman.so,就加上此行

    [iyunv@redis ~]# vim /etc/php.ini

    extension = gearman.so

    [iyunv@redis ~]# /etc/init.d/php-fpm restart

    停止 php-fpm: [确定]

    正在启动 php-fpm: [确定]

    f7b6f7e6b22dbe98d8a77e4f1a7ee64b.png

    这样就是安装成功了

    4、安装lib_mysqludf_json

    lib_mysqludf_json UDF库函数将关系数据映射为JSON格式。通常,数据库中的数据映射为JSON格式,是通过程序来转换的。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    [iyunv@redis ~]# wget -c -t 0 https://github.com/mysqludf/lib_mysqludf_json/archive/master.zip

    [iyunv@redis ~]# unzip master.zip

    [iyunv@redis ~]# cd lib_mysqludf_json-master/

    [iyunv@redis lib_mysqludf_json-master]# gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

    lib_mysqludf_json.c:40:23: 错误:my_global.h:没有那个文件或目录

    lib_mysqludf_json.c:41:20: 错误:my_sys.h:没有那个文件或目录

    lib_mysqludf_json.c:43:19: 错误:mysql.h:没有那个文件或目录

    lib_mysqludf_json.c:44:21: 错误:m_ctype.h:没有那个文件或目录

    lib_mysqludf_json.c:45:22: 错误:m_string.h:没有那个文件或目录

    #这里编译报错是因为没有安装mysql的开发包,如果是源码安装的mysql,需要在/etc/ld.so.conf.d/

    #目录下新建一个文件告诉系统mysql的头文件在哪里

    [iyunv@redis lib_mysqludf_json-master]# yum -y install mysql-devel

    [iyunv@redis lib_mysqludf_json-master]# gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c

    mysql> show global variables like 'plugin_dir';

    +---------------+-------------------------+

    | Variable_name | Value |

    +---------------+-------------------------+

    | plugin_dir | /usr/lib64/mysql/plugin |

    +---------------+-------------------------+

    #将模块拷贝到插件目录下

    [iyunv@redis lib_mysqludf_json-master]# cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/

    #注册UDF函数

    mysql> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so';

    5、安装gearman-mysql-udf

    这个插件是用来管理调用 Gearman 的分布式的队列。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    [iyunv@redis ~]# wget -c -t 0 https://launchpad.net/gearman-my ... ysql-udf-0.6.tar.gz

    [iyunv@redis ~]# tar xvf gearman-mysql-udf-0.6.tar.gz

    [iyunv@redis ~]# cd gearman-mysql-udf-0.6

    [iyunv@redis gearman-mysql-udf-0.6]# ./configure --with-mysql=/usr/bin/mysql_config --libdir=/usr/lib64/mysql/plugin/

    [iyunv@redis gearman-mysql-udf-0.6]# make

    [iyunv@redis gearman-mysql-udf-0.6]# make install

    #注册UDF函数

    mysql> CREATE FUNCTION gman_do_background RETURNS STRING SONAME 'libgearman_mysql_udf.so';

    mysql> CREATE FUNCTION gman_servers_set RETURNS STRING SONAME 'libgearman_mysql_udf.so';

    #查看函数

    mysql> select * from mysql.func;

    +--------------------+-----+-------------------------+----------+

    | name | ret | dl | type |

    +--------------------+-----+-------------------------+----------+

    | json_object | 0 | lib_mysqludf_json.so | function |

    | gman_do_background | 0 | libgearman_mysql_udf.so | function |

    | gman_servers_set | 0 | libgearman_mysql_udf.so | function |

    +--------------------+-----+-------------------------+----------+

    #指定gearman的服务信息

    mysql> SELECT gman_servers_set('127.0.0.1:4730');

    6、编写mysql触发器(根据实际情况编写)

    1

    2

    3

    4

    5

    DELIMITER $$

    CREATE TRIGGER datatoredis AFTER UPDATE ON test FOR EACH ROW BEGIN

    SET @RECV=gman_do_background('syncToRedis', json_object(NEW.id as `id`, NEW.name as `name`));

    END$$

    DELIMITER ;

    7、编写gearman的worker端

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    [iyunv@redis ~]# vim /www/redis_worker.php

    $worker = new GearmanWorker();

    $worker->addServer();

    $worker->addFunction('syncToRedis', 'syncToRedis');

    $redis = new Redis();

    $redis->connect('127.0.0.1', 6379);

    while($worker->work());

    function syncToRedis($job)

    {

    global $redis;

    $workString = $job->workload();

    $work = json_decode($workString);

    if(!isset($work->id)){

    return false;

    }

    $redis->set($work->id, $work->name);

    }

    ?>

    #后台运行

    [iyunv@redis www]# nohup php redis_worker.php &

    "$redis->set($work->id, $work->name);"这条语句就是将id作KEY和name作VALUE分开存储,需要和前面写的php测试代码的存取一致。

    8、更新mysql中的数据

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    mysql> set @RECV = 1;

    mysql> select @RECV;

    +------+

    | @RECV|

    +------+

    | 1 |

    +------+

    mysql> update test set name = 'ssss' where id = 1;

    mysql> select @RECV;

    +------+

    | @RECV|

    +------+

    | NULL |

    +------+

    从返回值可以看到,触发器是触发成功的(这里的@RECV是上面mysql TIGGER的返回值)。我们在redis中查看数据:

    1

    2

    3

    [iyunv@redis redis]# ./redis-cli

    127.0.0.1:6379> get 1

    "sven"

    这里的数据居然没有变化,这是我们就要排错了。

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    [iyunv@redis ~]# vim /var/log/audit/audit.log

    type=AVC msg=audit(1427807674.425:107): avc: denied { name_connect } for pid=12453 comm="mysqld" dest=4730 scontext=unconfined_u:system_r:mysqld_t:s0 tcontext=system_u:o

    bject_r:port_t:s0 tclass=tcp_socket

    #看到这样一条日志,就知道是selinux阻止了同步

    #现在将selinux的模式调成Permissive

    [iyunv@redis ~]# getenforce

    Enforcing

    [iyunv@redis ~]# setenforce 0

    [iyunv@redis ~]# getenforce

    Permissive

    设置完成以后,再次执行update,进入redis进行查看

    1

    2

    127.0.0.1:6379> get 1

    "ssss"

    刷新一下刚刚的php界面

    227c8e6e30af1ec3d16cd3e9be5609bc.png

    到这里就基本算是大功告成了,只要application将数据写到mysql中,mysql触发器检测到更新,就会通过Gearman将

    http://www.cnblogs.com/hellowzd/p/5163782.html

    展开全文
  • Linux环境部署redis缓存服务器redis的配置说明

    千次阅读 多人点赞 2020-11-28 17:30:49
    关于redis在网站架构中位置和作用,大家可以参见我另一篇文章: https://blog.csdn.net/qq_45273552/article/details/109429549 这里笔者用是“终端神器”—mobaxterm 来操作linux,笔者也建议小伙伴们使用...
  • redis缓存服务器

    2019-04-20 00:01:39
    redis缓存服务器是一个基于键值存储内存服务器,用于减少数据库访问压力。操作数据时,先访问redis再访问数据库。储存对象时可先转换为Json串作为值进行存储。 一、作用及持久化 1.作用 2.持久化对比 一个...
  • 缓存redis奥义

    2019-10-12 18:38:44
    就是利用缓存服务器的内存数据交互效率大于磁盘交互效率,将数据存储到缓存服务器上,典型空间换取时间方案, 提高数据检索效率。 下面案例只要针对资讯类服务分析,如果是银行、地图等则可能不完全适合。...
  • Redis是用C语言开发一个开源高性能键值对(key-value)数据库。它通过提供多种键值数据类型来适应不同场景下存储需求,目前为止Redis支持键值数据类型如 下: 字符串类型(String) 哈希类型(hash) 列表...
  • php_redis缓存服务器

    2020-03-27 22:54:08
    redis缓存作用: 可以让数据库更好减轻压力,缓存动态数据,实现redis与mysql读写分离。 redis负责读取数据,mysql负责写入。 如果客户端请求在redis上未命中,则去MySQL进行查询,并由MySQL反...
  • Redis构架缓存服务器要点 1.nosql非关系型数据库产品:redis,mongodb,memcached ...缓存服务器作用:加快访问速度,环节数据库压力 3、关系型数据库与非关系型数据库区别:----面试问题 一 什么是关
  • 转自:https://www.iyunv.com/thread-52670-1-1.html一、redis简介Redis是一个key-value存储系统。和Memcached类似,为了保证效率,数据都是缓存在内存中。...在部分场合可以对关系数据库起到很好补充作用...
  • Redis缓存服务器 什么是redis? redis是一个开源,C语言编写的高级键值缓存和持久性存储的Nosql数据库产品,它可以作为数据库,也可以作为缓存作用的消息中间人 redis的特点:1.高速读写的能力,存储数据的类型...
  • Redis的作用

    2019-04-12 10:43:50
    排行榜: 使用redis的SortSet数据结构可以很容易实现排行榜功能。 计算器/限速器:利用Redis的原子性的自增操作,我们可以实现用户访问数、点赞数等。也可以实现限速器,限制某个用户访问某个API的频率,防止用户...
  • redis 作为 mysql的缓存服务器(读写分离)一、redis简介Redis是一个key-value存储系统。和Memcached类似,为了保证效率,数据都是缓存在内存中。区别redis会周期性把更新数据写入磁盘或者把修改操作写入追加...
  • redis 出现,很大程度补偿了memcached 这类 keyvalue 存储不足,在部分场合可以对关系数据库起到很好补充作用。它提供了 Python,Ruby,Erlang,PHP 客户端,使用很方便。Redis 所有数据都是保存在内存中,然后不...
  • redis 出现,很大程度补偿了memcached 这类 keyvalue 存储不足,在部分场合可以对关系数据库起到很好补充作用。它提供了 Python,Ruby,Erlang,PHP 客户端,使用很方便。Redis 所有数据都是保存在内存中,然后不...
  • redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C ,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用...
  • 一、redis简介Redis是一个key-value存储系统。和Memcached类似,为了保证效率,数据都是缓存在内存中。...在部分场合可以对关系数据库起到很好补充作用。它提供了Java,C/C++(hiredis),C#,PHP,JavaScript,Per...
  • 介绍2.redis的特点3.区别4.安装Redis5.数据持久化RDB快照备份恢复6.redis主从配置主从简介**部署三台机器redis---主从同步****7.redis-sentinel---哨兵模式**哨兵简介哨兵作用哨兵工作模式主观下线与客观下线 配置...
  • Redis的作用场景

    2020-05-29 16:12:03
    2.排行榜,在使用传统的关系型数据库(mysql oracle 等)来做这个事儿,非常的麻烦,而利用Redis的SortSet(有序集合)数据结构能够简单的搞定; 3.计算器/限速器,利用Redis中原子性的自增操作,我们可以统计类似用户...
  • 一、redis简介 Redis是一个key-value存储系统。和Memcached类似,为了保证效率,数据都是缓存在...在部分场合可以对关系数据库起到很好补充作用。它提供了Java,C/C++(hiredis),C#,PHP,JavaScript,Perl,Objec
  • 补充作用。它提供了 Python,Ruby,Erlang,PHP 客户端,使用很方便。 Redis 所有数据都是保存在内存中,然后不定期通过异步方式保存到磁盘上 (这称为“半持久化模式”);也可以把每一次数...
  • 存储不足,在部分场合可以对关系数据库起到很 好补充作用。它提供了 Python,Ruby,Erlang,PHP 客户端,使用很方便。 Redis 所有数据都是保存在内存中,然后不定期通过异步方式保存到磁盘上 (这称为“半持...
  • 经过排查,其主要原因在于使用SQL获取热点新闻过程中消耗了将近2秒时间,于是乎,我们又想到了一个简单粗暴解决方案,即把SQL查询结果直接缓存在当前api服务器的内存中(设置缓存有效时间...
  • 一、redis简介Redis是一个key-value存储系统。和Memcached类似,为了保证效率,数据都是缓存在内存中。...在部分场合可以对关系数据库起到很好补充作用。它提供了Java,C/C++(hiredis),C#,PHP,JavaScript,Per...

空空如也

空空如也

1 2 3 4 5 ... 13
收藏数 243
精华内容 97
关键字:

缓存服务器redis的作用

redis 订阅