一、REDIS
1、Redis 简介
Redis 是完全开源的,遵守 BSD 协议,是一个高性能的 key-value 数据库。
特点
1.Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
2.Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
3.Redis支持数据的备份,即master-slave模式的数据备份。
2、Redis 安装部署
server1
获取软件 redis-6.2.4.tar.gzcd redis-6.2.4/ make ##编译 //当遇到’fatal error: jemalloc/jemalloc.h: No such file or directory‘错误 //删除redis 重新解压编译 make install ./install_server.sh ##安装 vim install_server.sh ##报错需注释 // _pid_1_exe="$(readlink -f /proc/1/exe)" #if [ "${_pid_1_exe##*/}" = systemd ] #then # echo "This systems seems to use systemd." # echo "Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!" # exit 1 // #fi vim /etc/redis/6379.conf // # bind 127.0.0.1 // protected-mode=no
server2
获取软件 redis-6.2.4.tar.gztar zxf redis-6.2.4.tar.gz make make install ./install_server.sh (系统级服务) cp systemd-redis_server.service /usr/lib/systemd/system/redis.service vim /usr/lib/systemd/system/redis.service [Service] // #ExecStart=/usr/local/bin/redis-server --supervised systemd --daemonize no #Alternatively, have redis-server load a configuration file: ExecStart=/usr/local/bin/redis-server /etc/redis/redis.conf #LimitNOFILE=10032 #NoNewPrivileges=yes #OOMScoreAdjust=-900 #PrivateTmp=yes Type=forking #TimeoutStartSec=infinity #TimeoutStopSec=infinity #UMask=0077 #User=redis #Group=redis // #WorkingDirectory=/var/lib/redis mkdir /etc/redis/ vim /etc/redis/redis.conf // protected-mode no ##关闭保护模式 # bind 127.0.0.1 ##注释此行本地连接,使用远程连接 daemonize yes ##redis默认不是以守护进程的方式运行,可以通过该配置项修改,使用yes时,启用守护进程 logfile "/var/log/redis.log" ##日志文件路径 // dir /var/lib/redis/ ##指定本地数据库存放目录 mkdir /var/lib/redis/ systemctl daemon-reload systemctl start redis.service
server3
获取软件 redis-6.2.4.tar.gztar zxf redis-6.2.4.tar.gz make make install ./install_server.sh vim /etc/redis/6379.conf daemonize yes #bind 127.0.0.1 -::1 protected-mode no
二、Redis主从复制
server1
/etc/init.d/redis_6379 restart ##刷新服务 redis-cli ##连接 redis > set name westos > get name
server2
vim /etc/redis/redis.conf slaveof 172.25.22.1 6379 systemctl stop redis.service systemctl start redis.service ##刷新服务
server3
vim /etc/redis/redis.conf slaveof 172.25.22.1 6379 /etc/init.d/redis_6379 restart
测试
三、自动选举master
server1
cd redis-6.2.4/ cp sentinel.conf /etc/redis/ vim /etc/redis/sentinel.conf // sentinel monitor mymaster 172.25.22.1 6379 2 // sentinel down-after-milliseconds mymaster 10000 scp /etc/redis/sentinel.conf server2:/etc/redis/sentinel.conf scp /etc/redis/sentinel.conf server3:/etc/redis/sentinel.conf
检测:
redis-sentinel /etc/redis/sentinel.conf redis-cli info
停掉server1 master主机
server3为master主机
四、redis 集群
手动添加
mkdir /usr/local/redis cd /usr/local/redis/ mkdir 700{1..6} cd 7001 vim redis.conf ##重复 // port 7002 cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 appendonly yes // daemonize yes redis-server redis.conf ##启动端口 redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1 ##创建主从集群
当需要加入新的主从
mkdir 7007 /7008 vim redis.conf redis-cli --cluster add-node 127.0.0.1:7001 127.0.0.1:7001 redis-cli --cluster add-node 127.0.0.1:7008 127.0.0.1:7001 --cluster-slave --cluster-master-id dadafcsfvsvsdcsc redis-cli --cluster reshard 127.0.0.1:30001 ##分配哈希 redis-cli --cluster check 127.0.0.1:30001 ##检查该节点主从
脚本添加
cd /root/redis-6.2.4/utils/create-cluster ./create-cluster start ##启动脚本 ./create-cluster create ##创建集群 redis-cli --cluster check 127.0.0.1:30001 检查 redis-cli --cluster info 127.0.0.1:30001
五、redis+mysql
server1(nginx)
下载rpm cd /pub/docs/redis mirror rhel7 cd rehel7 yum install *.rpm -y cp test.php /usr/local/nginx/html/ vim /usr/local/nginx/html/test.php // <?php $redis = new Redis(); $redis->connect('172.25.22.2',6379) or die ("could net connect redis server"); # $query = "select * from test limit 9"; ##redis端 $query = "select * from test"; for ($key = 1; $key < 10; $key++) { if (!$redis->get($key)) { $connect = mysql_connect('172.25.22.3','redis','westos'); ##mysql端 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; // } nginx -s reload systemctl daemon-reload systemctl start php-fpm systemctl stop php-fpm systemctl restart php-fpm
server2(redis)
vim /etc/redis/redis.conf ##设定server2为master systemctl restart redis.service
server3 (mysql)
vim .bash_profile PATH=$PATH:$HOME/bin source .bash_profile yum install -y mariadb-server vim /etc/my.cnf [mysqld] datadir=/var/lib/mysql socket=/var/lib/mysql/mysql.sock # Disabling symbolic-links is recommended to prevent assorted security risks symbolic-links=0 # Settings user and group are ignored when systemd is used. # If you need to run mysqld under a different user or group, # customize your systemd unit file for mariadb according to the # instructions in http://fedoraproject.org/wiki/Systemd [mysqld_safe] log-error=/var/log/mariadb/mariadb.log pid-file=/var/run/mariadb/mariadb.pid # # include all files from the config directory !includedir /etc/my.cnf.d systemctl start mariadb.service mysql mysql> grant all on test.* to redis@'%' identified by 'westos'; vim 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'); #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 ; mysql < test.sql
##此配置只能同步复制,不能异步复制,之可在redis上改写和读取数据,mysql端改写和读取不生效
mysql端读取和写入数据
server3(mysql) yum install mariadb-devel -y yum install -y unzip unzip lib_mysqludf_json-master.zip cd lib_mysqludf_json-master/ yum install -y gcc gcc $(mysql_config --cflags) -shared -fPIC -o lib_mysqludf_json.so lib_mysqludf_json.c cp lib_mysqludf_json.so /usr/lib64/mysql/plugin/ mysql mysql> show global variables like 'plugin_dir';
mysql> CREATE FUNCTION json_object RETURNS STRING SONAME 'lib_mysqludf_json.so'; mysql> select * from mysql.func;
tar zxf gearman-mysql-udf-0.6.tar.gz cd gearman-mysql-udf-0.6/ ./configure --libdir=/usr/lib64/mysql/plugin/ yum install -y libgearman* libevent* libevent-devel-2.0.21-4.el7.x86_64.rpm libgearman-1.1.12-18.el7.x86_64.rpm libgearman-devel-1.1.12-18.el7.x86_64.rpm ./configure --libdir=/usr/lib64/mysql/plugin/ make make install cd /usr/local/lib (目录为空) mysql 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;
mysql> SELECT gman_servers_set(‘172.25.22.1:4730’);
vim test.sqluse 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'); 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 ; server1(nginx) systemctl start gearmand php -m | grep gearman php -m | grep redis vim worker.php
nohup php worker.php &` mysql> mysql use test update test set name='hush' where id=1; ##修改mysql数据
修改mysql端数据会异步更新