zoukankan      html  css  js  c++  java
  • redis实现session共享,哨兵

    一、Redis介绍

    1、redis是key-value的存储系统,属于非关系型数据库

    2、特点:支持数据持久化,可以让数据在内存中保存到磁盘里(memcached:数据存在内存里,如果服务重启,数据会丢失)

    3、支持5种数据类型:string,hash,list,set,zset

    4、两种文件格式(即数据持久化)

    (1)RDB(全量数据):多长时间/频率,把内存中的数据刷到磁盘中,便于下次读取文件时进行加载

    (2)AOF(增量请求):类似mysql的二进制日志,不停地把对数据库的更改语句记录到日志中,下次重启服务,会根据二进制日志把数据重写一次,加载到内存里,实现数据持久化

    5、存储

    (1)内存存储 (2)磁盘存储(RDB)  (3)log文件(AOF)

    二、Redis安装

    1、下载 redis-2.8.21.tar.gz 

    2、解压:  tar zxvf redis-2.8.21.tar.gz

    3、cd redis-2.8.21

    4、编译:make

    5、安装: make PREFIX=/usr/local/redis install

    6、创建配置文件所在的目录:mkdir /usr/local/redis/etc

    7、网上下载配置文件 redis.conf,放到 6 创建的目录下

    8、创建启动脚本 /etc/init.d/redis 

    9、添加redis用户:useradd -s /sbin/nologin redis

    10、创建var目录,放置redis 的pid,rdb文件:  mkdir /usr/local/redis/var

    11、修改var目录和配置文件权限

    (1)chmod 777 /usr/local/redis/var

    (2)chmod 755 /etc/init.d/redis

    12、启动redis:  service redis start

    13、ps aux | grep redis      ——》 监听6379端口

    三、php应用redis

    前提:已经搭建了LAMP网站架构

    php不能直接连redis,需要redis模块的支持(redis是和开发语言结合使用的)

    1、Redis扩展模块安装
    (1)下载 phpredis.zip
    (2)解压:unzip phpredis.zip
    (3)cd phpredis-develop/
    (4)/usr/local/php/bin/phpize   ——》生成 configure文件
    (5)编译redis.so的模块
    ./configure --with-php-config=/usr/local/php/bin/php-config
    (6)make && make install
    (7)检查是否有redis.so文件
    ls /usr/local/php/lib/php/extensions/no-debug-non-zts-20100525/
    ——》 redis.so
    (8)编辑php.ini配置文件
    最后1行加上
    extension=redis.so
    (9)php检查是否加载了redis.so模块
    /usr/local/php/bin/php -m |grep redis
    ——》redis
     
     
     
    2、Redis 实现session共享
    (1)apache测试目录下创建info.php ——》 调用 phpinfo() 函数
    (2)apache虚拟主机配置文件(extra目录下)或者主配置文件httpd.conf 中定义
    session存储的处理方式和存储路径
    (a)php_value session.save_handler "redis"
    (b)php_value session.save_path "tcp://127.0.0.1:6379"
     
    ps: 还有另外两种方法
    1、php的全局配置文件php.ini添加上面2行
    2、如果是lnmp架构
    php-fpm.conf对应的pool中加入 
    php_value[session.save_handler] = redis
    php_value[session.save_path] = "tcp://127.0.0.1:6379"
     
     
    (3)重启apachectl
    /usr/local/apache2/bin/apachectl restart
    (4)浏览器访问:192.168.131.110/info.php

    说明配置已经生效

    3、Redis 存储session 测试

    (1)进入apache的htdoc下

    (2)创建session.php

     1 <?php 
     2     session_start(); 
     3     if (!isset($_SESSION['TEST'])) { 
     4         $_SESSION['TEST'] = time(); 
     5     } 
     6     $_SESSION['TEST3'] = time(); 
     7     print $_SESSION['TEST']; 
     8     print "<br><br>"; 
     9     print $_SESSION['TEST3']; 
    10     print "<br><br>"; 
    11     print session_id(); 
    12 ?>

    (3)测试  ——》 记得去掉redis配置文件中的密码设置,否则会返回500授权错误

    (a)curl localhost/session.php

    (b)redis-cli  ——》 在家目录的.bashrc加入了redis启动目录

    说明session已经存入到redis里了

    四、redis的一些题外话

     redis一些重点

    1、主从

    2、持久化

    3、哨兵实现主从切换

    4、sentinel原理 (2.8.0之后有这个功能 sentinel.conf)

    5、数据类型: hash,string 用得多

    着重讲下哨兵

    1、支持redis协议

    2、原理简单描述

    所有服务器都部署哨兵,哨兵去监控主从,要是redis或者哨兵死了,另外所有的机器会重新投票(就是下图6379后面的数字,比如2),投死那台挂掉的机器(2台机器投票确认机器死了),再在另外所有的机器上自成一个体系,重新生成主

    3、重点

    (1)哨兵的配置文件也就是sentinel.conf是时时发生变化的

    当主被投票死掉后,从起来于是产生一个新的主ip,新主会变成配置文件master的ip

    (2)redis的配置文件也会改变

    (3)当已死的主恢复后,就变成了从

    (4)哨兵一定要是单数,否则选举易出现问题,偶数可能会同票

    4、几个问题

    (1)什么时候用redis?

    所有的web第一次请求,先从db上取,取到的结果再返回给客户端的同时也写到redis去,
    当再次用到这个结果时就从redis取,不需要再从db上取(很慢)
     
    (2)什么时候用redis高可用,也就是哨兵?
    所有的研发程序需要连主(可写),从(只读)是写不进去东西的
    主redis有一个vip或者直连它的物理ip,研发程序直连redis写东西时,
    redis主挂了,哨兵就起到作用
     
    redis取不到数据,就从db上取——》程序做的,自动的降级
    如果程序没有做降级,redis主挂了,线上所有涉及到在redis写的业务都用不了 ——》 所以就要用哨兵
     
  • 相关阅读:
    OC实现个人中心页面
    3D Touch开发技巧的笔记
    APP快速搭建框架
    Swift10大开源项目记录
    iOS进阶学习笔记
    如何使启动界面图片全屏
    【DRF框架】restfull规范
    【DRF框架】版本控制组件
    【DRF框架】路由组件
    【DRF框架】视图组件
  • 原文地址:https://www.cnblogs.com/windysai/p/6226995.html
Copyright © 2011-2022 走看看