负载均衡中使用Redis实现共享Session
文章目录
一、负载均衡
负载均衡:把众多的访问量分担到其他的服务器上,让每个服务器的压力减少。
通俗的解释就是:把一项任务交由一个开发人员处理总会有上限处理能力,这时可以考虑增加开发人员来共同处理这项任务,多人处理同一项任务时就会涉及到调度问题,即任务分配,这和多线程理念是一致的。nginx在这里的角色相当于任务分配者。
如我们第一次访问 www.baidu.com
这个域名,可能会对应这个IP 111.13.101.208
的服务器,然后第二次访问,IP可能会变为111.13.101.209
的服务器,这就是百度采用了负载均衡,一个域名对应多个服务器,将访问量分担到其他的服务器,这样很大程度的减轻了每个服务器上访问量。
但是,这里有一个问题,如果我们登录了百度的一个账号,如网页的百度网盘,但是每次有可能请求的是不同的服务器,我们知道每个服务器都会有自己的会话session,所以会导致用户每次刷新网页又要重新登录,这是非常糟糕的体验,因此,根据以上问题,希望session可以共享,这样就可以解决负载均衡中同一个域名不同服务器对应不同session的问题。
二、Redis介绍
目前多服务器的共享session,用的最多的是redis。
关于Redis的基础知识,可以看我之前的博文Redis开发学习。
再简单的梳理下:
- redis是key-value的存储系统,属于非关系型数据库
- 特点:支持数据持久化,可以让数据在内存中保存到磁盘里(memcached:数据存在内存里,如果服务重启,数据会丢失)
- 支持5种数据类型:string,hash,list,set,zset
- 两种文件格式(即数据持久化)
(1)RDB(全量数据):多长时间/频率,把内存中的数据刷到磁盘中,便于下次读取文件时进行加载。(2)AOF(增量请求):类似mysql的二进制日志,不停地把对数据库的更改语句记录到日志中,下次重启服务,会根据二进制日志把数据重写一次,加载到内存里,实现数据持久化 - 存储
(1)内存存储 (2)磁盘存储(RDB) (3)log文件(AOF)
三、实现的核心思想
首先要明确session和cookie的区别。浏览器端存的是cookie每次浏览器发请求到服务端是http 报文头是会自动加上你的cookie信息的。服务端拿着用户的cookie作为key去存储里找对应的value(session).
同一域名下的网站的cookie都是一样的。所以无论几台服务器,无论请求分配到哪一台服务器上同一用户的cookie是不变的。也就是说cookie对应的session也是唯一的。
所以,这里只要保证多台业务服务器访问同一个redis服务器(或集群)就行了。
四、PHP会话session配置改为Redis
我们可以看到PHP默认的的session配置使用文件形式保存在服务器临时目录中,我们需要Redis作为保存session的驱动,所以,这里需要对配置文件进行修改,PHP的自定义会话机制改为Redis。
这里有三种修改方式:
1.修改配置文件php.ini
找到配置文件 php.ini
,修改为下面内容,保存并重启服务
1 2 |
<span class="hljs-attr">session.save_handler</span> = redis <span class="hljs-attr">session.save_path</span> = <span class="hljs-string">"tcp://127.0.0.1:6379"</span> |
2.代码中动态配置修改
直接在代码中加入以下内容:
1 2 |
ini_set(<span class="hljs-string">"session.save_handler"</span>, <span class="hljs-string">"redis"</span>)<span class="hljs-comment">;</span> ini_set(<span class="hljs-string">"session.save_path"</span>, <span class="hljs-string">"tcp://127.0.0.1:6379"</span>)<span class="hljs-comment">;</span> |
注:如果配置文件redis.conf里设置了连接密码requirepass,save_path需要这样写tcp://127.0.0.1:6379?auth=authpwd ,否则保存session的时候会报错。
测试:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<span class="hljs-meta"><?php</span> <span class="hljs-comment">//ini_set("session.save_handler", "redis");</span> <span class="hljs-comment">//ini_set("session.save_path", "tcp://127.0.0.1:6379");</span> <span class="hljs-title function_ invoke__">session_start</span>(); <span class="hljs-comment">//存入session</span> <span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'class'</span>] = <span class="hljs-keyword">array</span>(<span class="hljs-string">'name'</span> => <span class="hljs-string">'toefl'</span>, <span class="hljs-string">'num'</span> => <span class="hljs-number">8</span>); <span class="hljs-comment">//连接redis</span> <span class="hljs-variable">$redis</span> = <span class="hljs-keyword">new</span> <span class="hljs-title class_">redis</span>(); <span class="hljs-variable">$redis</span>-><span class="hljs-title function_ invoke__">connect</span>(<span class="hljs-string">'127.0.0.1'</span>, <span class="hljs-number">6379</span>); <span class="hljs-comment">//检查session_id</span> <span class="hljs-keyword">echo</span> <span class="hljs-string">'session_id:'</span> . <span class="hljs-title function_ invoke__">session_id</span>() . <span class="hljs-string">'<br/>'</span>; <span class="hljs-comment">//redis存入的session(redis用session_id作为key,以string的形式存储)</span> <span class="hljs-keyword">echo</span> <span class="hljs-string">'redis_session:'</span> . <span class="hljs-variable">$redis</span>-><span class="hljs-title function_ invoke__">get</span>(<span class="hljs-string">'PHPREDIS_SESSION:'</span> . <span class="hljs-title function_ invoke__">session_id</span>()) . <span class="hljs-string">'<br/>'</span>; <span class="hljs-comment">//php获取session值</span> <span class="hljs-keyword">echo</span> <span class="hljs-string">'php_session:'</span> . <span class="hljs-title function_ invoke__">json_encode</span>(<span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'class'</span>]); |
3.自定义会话机制
使用 session_set_save_handle
方法自定义会话机制,网上发现了一个封装非常好的类,我们可以直接使用这个类来实现我们的共享session操作。
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
<span class="hljs-meta"><?php</span> <span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">redisSession</span></span>{ <span class="hljs-comment">/** * 保存session的数据库表的信息 */</span> <span class="hljs-keyword">private</span> <span class="hljs-variable">$_options</span> = <span class="hljs-keyword">array</span>( <span class="hljs-string">'handler'</span> => <span class="hljs-literal">null</span>, <span class="hljs-comment">//数据库连接句柄</span> <span class="hljs-string">'host'</span> => <span class="hljs-literal">null</span>, <span class="hljs-string">'port'</span> => <span class="hljs-literal">null</span>, <span class="hljs-string">'lifeTime'</span> => <span class="hljs-literal">null</span>, <span class="hljs-string">'prefix'</span> => <span class="hljs-string">'PHPREDIS_SESSION:'</span> ); <span class="hljs-comment">/** * 构造函数 * <span class="hljs-doctag">@param</span> $options 设置信息数组 */</span> <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">__construct</span>(<span class="hljs-params"><span class="hljs-variable">$options</span>=<span class="hljs-keyword">array</span>()</span>)</span>{ <span class="hljs-keyword">if</span>(!<span class="hljs-title function_ invoke__">class_exists</span>(<span class="hljs-string">"redis"</span>, <span class="hljs-literal">false</span>)){ <span class="hljs-keyword">die</span>(<span class="hljs-string">"必须安装redis扩展"</span>); } <span class="hljs-keyword">if</span>(!<span class="hljs-keyword">isset</span>(<span class="hljs-variable">$options</span>[<span class="hljs-string">'lifeTime'</span>]) || <span class="hljs-variable">$options</span>[<span class="hljs-string">'lifeTime'</span>] <= <span class="hljs-number">0</span>){ <span class="hljs-variable">$options</span>[<span class="hljs-string">'lifeTime'</span>] = <span class="hljs-title function_ invoke__">ini_get</span>(<span class="hljs-string">'session.gc_maxlifetime'</span>); } <span class="hljs-variable language_">$this</span>->_options = <span class="hljs-title function_ invoke__">array_merge</span>(<span class="hljs-variable language_">$this</span>->_options, <span class="hljs-variable">$options</span>); } <span class="hljs-comment">/** * 开始使用该驱动的session */</span> <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">begin</span>()</span>{ <span class="hljs-keyword">if</span>(<span class="hljs-variable language_">$this</span>->_options[<span class="hljs-string">'host'</span>] === <span class="hljs-literal">null</span> || <span class="hljs-variable language_">$this</span>->_options[<span class="hljs-string">'port'</span>] === <span class="hljs-literal">null</span> || <span class="hljs-variable language_">$this</span>->_options[<span class="hljs-string">'lifeTime'</span>] === <span class="hljs-literal">null</span> ){ <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>; } <span class="hljs-comment">//设置session处理函数</span> <span class="hljs-title function_ invoke__">session_set_save_handler</span>( <span class="hljs-keyword">array</span>(<span class="hljs-variable language_">$this</span>, <span class="hljs-string">'open'</span>), <span class="hljs-keyword">array</span>(<span class="hljs-variable language_">$this</span>, <span class="hljs-string">'close'</span>), <span class="hljs-keyword">array</span>(<span class="hljs-variable language_">$this</span>, <span class="hljs-string">'read'</span>), <span class="hljs-keyword">array</span>(<span class="hljs-variable language_">$this</span>, <span class="hljs-string">'write'</span>), <span class="hljs-keyword">array</span>(<span class="hljs-variable language_">$this</span>, <span class="hljs-string">'destory'</span>), <span class="hljs-keyword">array</span>(<span class="hljs-variable language_">$this</span>, <span class="hljs-string">'gc'</span>) ); } <span class="hljs-comment">/** * 自动开始回话或者session_start()开始回话后第一个调用的函数 * 类似于构造函数的作用 * <span class="hljs-doctag">@param</span> $savePath 默认的保存路径 * <span class="hljs-doctag">@param</span> $sessionName 默认的参数名,PHPSESSID */</span> <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">open</span>(<span class="hljs-params"><span class="hljs-variable">$savePath</span>, <span class="hljs-variable">$sessionName</span></span>)</span>{ <span class="hljs-keyword">if</span>(<span class="hljs-title function_ invoke__">is_resource</span>(<span class="hljs-variable language_">$this</span>->_options[<span class="hljs-string">'handler'</span>])) <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>; <span class="hljs-comment">//连接redis</span> <span class="hljs-variable">$redisHandle</span> = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Redis</span>(); <span class="hljs-variable">$redisHandle</span>-><span class="hljs-title function_ invoke__">connect</span>(<span class="hljs-variable language_">$this</span>->_options[<span class="hljs-string">'host'</span>], <span class="hljs-variable language_">$this</span>->_options[<span class="hljs-string">'port'</span>]); <span class="hljs-keyword">if</span>(!<span class="hljs-variable">$redisHandle</span>){ <span class="hljs-keyword">return</span> <span class="hljs-literal">false</span>; } <span class="hljs-variable language_">$this</span>->_options[<span class="hljs-string">'handler'</span>] = <span class="hljs-variable">$redisHandle</span>; <span class="hljs-comment">// $this->gc(null);</span> <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>; } <span class="hljs-comment">/** * 类似于析构函数,在write之后调用或者session_write_close()函数之后调用 */</span> <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">close</span>()</span>{ <span class="hljs-keyword">return</span> <span class="hljs-variable language_">$this</span>->_options[<span class="hljs-string">'handler'</span>]-><span class="hljs-title function_ invoke__">close</span>(); } <span class="hljs-comment">/** * 读取session信息 * <span class="hljs-doctag">@param</span> $sessionId 通过该Id唯一确定对应的session数据 * <span class="hljs-doctag">@return</span> session信息/空串 */</span> <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">read</span>(<span class="hljs-params"><span class="hljs-variable">$sessionId</span></span>)</span>{ <span class="hljs-variable">$sessionId</span> = <span class="hljs-variable language_">$this</span>->_options[<span class="hljs-string">'prefix'</span>].<span class="hljs-variable">$sessionId</span>; <span class="hljs-keyword">return</span> <span class="hljs-variable language_">$this</span>->_options[<span class="hljs-string">'handler'</span>]-><span class="hljs-title function_ invoke__">get</span>(<span class="hljs-variable">$sessionId</span>); } <span class="hljs-comment">/** * 写入或者修改session数据 * <span class="hljs-doctag">@param</span> $sessionId 要写入数据的session对应的id * <span class="hljs-doctag">@param</span> $sessionData 要写入的数据,已经序列化过了 */</span> <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">write</span>(<span class="hljs-params"><span class="hljs-variable">$sessionId</span>, <span class="hljs-variable">$sessionData</span></span>)</span>{ <span class="hljs-variable">$sessionId</span> = <span class="hljs-variable language_">$this</span>->_options[<span class="hljs-string">'prefix'</span>].<span class="hljs-variable">$sessionId</span>; <span class="hljs-keyword">return</span> <span class="hljs-variable language_">$this</span>->_options[<span class="hljs-string">'handler'</span>]-><span class="hljs-title function_ invoke__">setex</span>(<span class="hljs-variable">$sessionId</span>, <span class="hljs-variable language_">$this</span>->_options[<span class="hljs-string">'lifeTime'</span>], <span class="hljs-variable">$sessionData</span>); } <span class="hljs-comment">/** * 主动销毁session会话 * <span class="hljs-doctag">@param</span> $sessionId 要销毁的会话的唯一id */</span> <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">destory</span>(<span class="hljs-params"><span class="hljs-variable">$sessionId</span></span>)</span>{ <span class="hljs-variable">$sessionId</span> = <span class="hljs-variable language_">$this</span>->_options[<span class="hljs-string">'prefix'</span>].<span class="hljs-variable">$sessionId</span>; <span class="hljs-comment">// $array = $this->print_stack_trace();</span> <span class="hljs-comment">// log::write($array);</span> <span class="hljs-keyword">return</span> <span class="hljs-variable language_">$this</span>->_options[<span class="hljs-string">'handler'</span>]-><span class="hljs-title function_ invoke__">delete</span>(<span class="hljs-variable">$sessionId</span>) >= <span class="hljs-number">1</span> ? <span class="hljs-literal">true</span> : <span class="hljs-literal">false</span>; } <span class="hljs-comment">/** * 清理绘画中的过期数据 * <span class="hljs-doctag">@param</span> 有效期 */</span> <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">gc</span>(<span class="hljs-params"><span class="hljs-variable">$lifeTime</span></span>)</span>{ <span class="hljs-comment">//获取所有sessionid,让过期的释放掉</span> <span class="hljs-comment">//$this->_options['handler']->keys("*");</span> <span class="hljs-keyword">return</span> <span class="hljs-literal">true</span>; } <span class="hljs-comment">//打印堆栈信息</span> <span class="hljs-keyword">public</span> <span class="hljs-function"><span class="hljs-keyword">function</span> <span class="hljs-title">print_stack_trace</span>() </span>{ <span class="hljs-variable">$array</span> = <span class="hljs-title function_ invoke__">debug_backtrace</span> (); <span class="hljs-comment">//截取用户信息</span> <span class="hljs-variable">$var</span> = <span class="hljs-variable language_">$this</span>-><span class="hljs-title function_ invoke__">read</span>(<span class="hljs-title function_ invoke__">session_id</span>()); <span class="hljs-variable">$s</span> = <span class="hljs-title function_ invoke__">strpos</span>(<span class="hljs-variable">$var</span>, <span class="hljs-string">"index_dk_user|"</span>); <span class="hljs-variable">$e</span> = <span class="hljs-title function_ invoke__">strpos</span>(<span class="hljs-variable">$var</span>, <span class="hljs-string">"}authId|"</span>); <span class="hljs-variable">$user</span> = <span class="hljs-title function_ invoke__">substr</span>(<span class="hljs-variable">$var</span>,<span class="hljs-variable">$s</span>+<span class="hljs-number">14</span>,<span class="hljs-variable">$e</span>-<span class="hljs-number">13</span>); <span class="hljs-variable">$user</span> = <span class="hljs-title function_ invoke__">unserialize</span>(<span class="hljs-variable">$user</span>); <span class="hljs-comment">//print_r($array);//信息很齐全</span> <span class="hljs-keyword">unset</span> ( <span class="hljs-variable">$array</span> [<span class="hljs-number">0</span>] ); <span class="hljs-keyword">if</span>(!<span class="hljs-keyword">empty</span>(<span class="hljs-variable">$user</span>)){ <span class="hljs-variable">$traceInfo</span> = <span class="hljs-variable">$user</span>[<span class="hljs-string">'id'</span>].<span class="hljs-string">'|'</span>.<span class="hljs-variable">$user</span>[<span class="hljs-string">'user_name'</span>].<span class="hljs-string">'|'</span>.<span class="hljs-variable">$user</span>[<span class="hljs-string">'user_phone'</span>].<span class="hljs-string">'|'</span>.<span class="hljs-variable">$user</span>[<span class="hljs-string">'presona_name'</span>].<span class="hljs-string">'++++++++++++++++\n'</span>; }<span class="hljs-keyword">else</span>{ <span class="hljs-variable">$traceInfo</span> = <span class="hljs-string">'++++++++++++++++\n'</span>; } <span class="hljs-variable">$time</span> = <span class="hljs-title function_ invoke__">date</span> ( <span class="hljs-string">"y-m-d H:i:m"</span> ); <span class="hljs-keyword">foreach</span> ( <span class="hljs-variable">$array</span> <span class="hljs-keyword">as</span> <span class="hljs-variable">$t</span> ) { <span class="hljs-variable">$traceInfo</span> .= <span class="hljs-string">'['</span> . <span class="hljs-variable">$time</span> . <span class="hljs-string">'] '</span> . <span class="hljs-variable">$t</span> [<span class="hljs-string">'file'</span>] . <span class="hljs-string">' ('</span> . <span class="hljs-variable">$t</span> [<span class="hljs-string">'line'</span>] . <span class="hljs-string">') '</span>; <span class="hljs-variable">$traceInfo</span> .= <span class="hljs-variable">$t</span> [<span class="hljs-string">'class'</span>] . <span class="hljs-variable">$t</span> [<span class="hljs-string">'type'</span>] . <span class="hljs-variable">$t</span> [<span class="hljs-string">'function'</span>] . <span class="hljs-string">'('</span>; <span class="hljs-variable">$traceInfo</span> .= <span class="hljs-title function_ invoke__">implode</span> ( <span class="hljs-string">', '</span>, <span class="hljs-variable">$t</span> [<span class="hljs-string">'args'</span>] ); <span class="hljs-variable">$traceInfo</span> .= <span class="hljs-string">")\n"</span>; } <span class="hljs-variable">$traceInfo</span> .= <span class="hljs-string">'++++++++++++++++'</span>; <span class="hljs-keyword">return</span> <span class="hljs-variable">$traceInfo</span>; } } |
在你的项目入口处调用上边的类:
上边的方法等于是重写了session写入文件的方法,将数据写入到了Redis中。
初始化文件 init.php
1 2 3 4 5 6 7 8 9 10 |
<span class="hljs-meta"><?php</span> <span class="hljs-keyword">require_once</span>(<span class="hljs-string">"redisSession.php"</span>); <span class="hljs-variable">$handler</span> = <span class="hljs-keyword">new</span> <span class="hljs-title class_">redisSession</span>(<span class="hljs-keyword">array</span>( <span class="hljs-string">'host'</span> => <span class="hljs-string">"127.0.0.1"</span>, <span class="hljs-string">'port'</span> => <span class="hljs-string">"6379"</span> )); <span class="hljs-variable">$handler</span>-><span class="hljs-title function_ invoke__">begin</span>(); <span class="hljs-comment">// 这也是必须的,打开session,必须在session_set_save_handler后面执行</span> <span class="hljs-title function_ invoke__">session_start</span>(); |
测试 test.php
1 2 3 4 5 6 7 8 9 |
<span class="hljs-meta"><?php</span> <span class="hljs-comment">// 引入初始化文件</span> <span class="hljs-keyword">include</span>(<span class="hljs-string">"init.php"</span>); <span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'isex'</span>] = <span class="hljs-string">"Hello"</span>; <span class="hljs-variable">$_SESSION</span>[<span class="hljs-string">'sex'</span>] = <span class="hljs-string">"Corwien"</span>; <span class="hljs-comment">// 打印文件</span> <span class="hljs-title function_ invoke__">print_r</span>(<span class="hljs-variable">$_SESSION</span>); <span class="hljs-comment">// ( [sex] => Corwien [isex] => Hello )</span> |
在Redis客户端使用命令查看我们的这条数据是否存在:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
<span class="hljs-number">27.0</span>.<span class="hljs-number">0.1</span>:<span class="hljs-number">6379</span><span class="hljs-operator">></span> keys <span class="hljs-operator">*</span> <span class="hljs-number">1</span>) <span class="hljs-string">"first_key"</span> <span class="hljs-number">2</span>) <span class="hljs-string">"mylist"</span> <span class="hljs-number">3</span>) <span class="hljs-string">"language"</span> <span class="hljs-number">4</span>) <span class="hljs-string">"mytest"</span> <span class="hljs-number">5</span>) <span class="hljs-string">"pragmmer"</span> <span class="hljs-number">6</span>) <span class="hljs-string">"good"</span> <span class="hljs-number">7</span>) <span class="hljs-string">"PHPREDIS_SESSION:29a111bcs120sv48ibmmjqdag4"</span> <span class="hljs-number">8</span>) <span class="hljs-string">"user:1"</span> <span class="hljs-number">9</span>) <span class="hljs-string">"counter:__rand_int__"</span> <span class="hljs-number">10</span>) <span class="hljs-string">"key:__rand_int__"</span> <span class="hljs-number">11</span>) <span class="hljs-string">"tutorial-list"</span> <span class="hljs-number">12</span>) <span class="hljs-string">"id:1"</span> <span class="hljs-number">13</span>) <span class="hljs-string">"name"</span> <span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>:<span class="hljs-number">6379</span><span class="hljs-operator">></span> <span class="hljs-keyword">get</span> <span class="hljs-type">PHPREDIS_SESSION</span>:29a111bcs120sv48ibmmjqdag4 <span class="hljs-string">"sex|s:7:<span class="hljs-subst">\"</span>Corwien<span class="hljs-subst">\"</span>;isex|s:5:<span class="hljs-subst">\"</span>Hello<span class="hljs-subst">\"</span>;"</span> <span class="hljs-number">127.0</span>.<span class="hljs-number">0.1</span>:<span class="hljs-number">6379</span><span class="hljs-operator">></span> |
我们可以看到,我们的数据被保存在了Redis端了,键为:PHPREDIS_SESSION:29a111bcs120sv48ibmmjqdag4
.
1. 带 [亲测] 说明源码已经被站长亲测过!
2. 下载后的源码请在24小时内删除,仅供学习用途!
3. 分享目的仅供大家学习和交流,请不要用于商业用途!
4. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
5. 本站所有资源来源于站长上传和网络,如有侵权请邮件联系站长!
6. 没带 [亲测] 代表站长时间紧促,站长会保持每天更新 [亲测] 源码 !
7. 盗版ripro用户购买ripro美化无担保,若设置不成功/不生效我们不支持退款!
8. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
9. 如果你也有好源码或者教程,可以到审核区发布,分享有金币奖励和额外收入!
10.如果您购买了某个产品,而我们还没来得及更新,请联系站长或留言催更,谢谢理解 !
GG资源网 » 负载均衡中使用Redis实现共享Session