`
hudeyong926
  • 浏览: 2032796 次
  • 来自: 武汉
社区版块
存档分类
最新评论

session共享之memcache Redis

    博客分类:
  • PHP
 
阅读更多
2.Redis的特点  

  Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。

  Redis的出色之处不仅仅是性能,Redis最大的魅力是支持保存多种数据结构,此外单个value的最大限制是1GB,不像 memcached只能保存1MB的数据,因此Redis可以用来实现很多有用的功能,比方说用他的List来做FIFO双向链表,实现一个轻量级的高性 能消息队列服务,用他的Set可以做高性能的tag系统等等。另外Redis也可以对存入的Key-Value设置expire时间,因此也可以被当作一 个功能加强版的memcached来用。

  Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。

3.使用redis有哪些好处?   
(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)
(2) 支持丰富数据类型,支持string,list,set,sorted set,hash
(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行
(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

4.redis相比memcached有哪些优势?   

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
(2) redis的速度比memcached快很多

(3) redis可以持久化其数据

5.Memcache与Redis的区别都有哪些?    

1)、存储方式 Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小 Redis有部份存在硬盘上,这样能保证数据的持久性
2)、数据支持类型 Memcache对数据类型支持相对简单。 Redis有复杂的数据类型。
3)、使用底层模型不同 它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。 Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

6.redis常见性能问题和解决方案:   

1).Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。

2).Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。

3).Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。

4). Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内

7. mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略(回收策略)。redis 提供 6种数据淘汰策略

  • volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
  • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
  • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
  • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
  • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
  • no-enviction(驱逐):禁止驱逐数据

 

在做了web集群后,你肯定会首先考虑session同步问题,因为通过负载均衡后,同一个IP访问同一个页面会被分配到不同的服务器上,如果 session不同步的话,一个登录用户,一会是登录状态,一会又不是登录状态。所以本文就根据这种情况给出三种不同的方法来解决这个问题:

一,利用数据库同步session

在做多服务器session同步时我没有用这种方法,如果非要用这种方法的话,我想过二种方法:

1,用一个低端电脑建个数据库专门存放web服务器的session,或者,把这个专门的数据库建在文件服务器上,用户访问web服务器时,会去这个专门的数据库check一下session的情况,以达到session同步的目的。

2,这种方法是把存放session的表和其他数据库表放在一起,如果mysql也做了集群了话,每个mysql节点都要有这张表,并且这张session表的数据表要实时同步。

说明:用数据库来同步session,会加大数据库的负担,数据库本来就是容易产生瓶颈的地方,如果把session还放到数据库里面,无疑是雪上加霜。上面的二种方法,第一点方法较好,把放session的表独立开来,减轻了真正数据库的负担

二,利用cookie同步session

session是文件的形势存放在服务器端的,cookie是文件的形势存在客户端的, 怎么实现同步呢?方法很简单,就是把用户访问页面产生的session放到cookie里面,就是以cookie为中转站。你访问web服务器A,产生了 session把它放到cookie里面了,你访问被分配到web服务器B,这个时候,web服务器B先判断服务器有没有这个session,如果没有, 在去看看客户端的cookie里面有没有这个session,如果也没有,说明session真的不存,如果cookie里面有,就把cookie里面的 sessoin同步到web服务器B,这样就可以实现session的同步了。

说明:这种方法实现起来简单,方便,也不会加大数据库的负担,但是如果客户端把cookie禁掉了的话,那么session就无从同步了,这样会给网站带来损失;cookie的安全性不高,虽然它已经加了密,但是还是可以伪造的。

三,利用memcache同步session

memcache可以做分布式,如果没有这功能,他也不能用来做session同步。他可以把web服务器中的内存组合起来,成为一个"内存池",不管是哪个服务器产生的sessoin都可以放到这个"内存池"中,其他的都可以使用。

优点:以这种方式来同步session,不会加大数据库的负担,并且安全性比用cookie大大的提高,把session放到内存里面,比从文件中读取要快很多。

缺点:memcache把内存分成很多种规格的存储块,有块就有大小,这种方式也就决定了,memcache不能完全利用内存,会产生内存碎片,如果存储块不足,还会产生内存溢出。

四,总结

上面三种方法都是可行的

第一种方法,最影响系统速度的那种,不推荐使用;

第二种方法,效果不错,不过安全隐患一样的存在;

第三种方法,个人觉得第三种方法是最好的,推荐大家使用

 

使用基于文件的Session存取瓶颈可能都是在磁盘IO操作上,所以对付小数据量的Session没有问题,但是如果碰到大数据量的Sesstion,那么可能无法胜任,现在利用Memcache来保存Session数据,直接通过内存的方式,效率自然能够提高不少,缺点宕机数据丢失

首先打开php.ini文件,找到session的部分:(分号后面的是注释)

[Session]
; Handler used to store/retrieve data.
session.save_handler = files ; 这个是session的方式,默认的files就可以了,代表用文件储存,

还有,user和memcache,redis。

user方式指的是你自己(也就是用户)定义session的句柄,用于session的存取等,user方式需要类文件见附件

session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"

用memcache来作PHP 的session.save_handler

ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211,tcp://192.168.1.12:11211");

用memcached 来作PHP 的session.save_handler

ini_set("session.save_handler","memcached");
ini_set("session.save_path","127.0.0.1:11211");

用 sessionid 去 memcached 里查询一下

<?php
//get_session.php
$mem = new Memcache;
$mem->connect("127.0.0.1", 11211);
var_dump($mem->get('0935216dbc0d721d629f89efb89affa6'));
?>

备注:memcache PECL 未来版本中,可以直接设置 php.ini 来这定自己的 session.save_handler,大致如下:

session.save_handler = memcache
session.save_path = "tcp://host:port?persistent=1&weight=2&timeout=2&retry_interval=15,tcp://host2:port2"
  • 大小: 42.2 KB
分享到:
评论
4 楼 coly 2013-01-04  
很详细。
3 楼 hudeyong926 2012-12-19  
你说的很对
2 楼 lipost 2012-12-19  
ini_set("session.save_handler", "memcache");
ini_set("session.save_path", "tcp://127.0.0.1:11211,tcp://192.168.1.12:11211");

这种以后就不用自己在写session类了吧

使用php内置的就好了 没啥区别
1 楼 any_luf 2012-02-08  

相关推荐

    PHP实现多服务器session共享之memcache共享.rar

    除了memcache,还有其他如Redis等分布式存储系统也可用于session共享,它们各有优缺点,选择哪种取决于具体项目的需求和资源。 总的来说,"PHP实现多服务器session共享之memcache共享"这个主题涵盖的知识点包括:...

    PHP实现多服务器session共享之memcache共享

    为了解决这个问题,开发者通常会利用外部存储服务,如memcached,来实现session共享。本文将深入探讨如何使用PHP和memcached实现多服务器session共享。 首先,memcached是一个高性能的分布式内存对象缓存系统,它...

    tomcat8-session-jars.zip

    总结一下,这个压缩包提供的jar文件是解决Tomcat8集群环境下的session共享问题的关键,它支持两种流行的分布式缓存解决方案——Memcache和Redis。开发者可以根据实际需求和环境,选择合适的方式实现session的高效、...

    6.4: Session与Cookie 、 部署memcached 、 Session共享 、 .docx

    - PHP中实现Session共享,需要在配置文件中设置`session.save_handler`为`memcached`或`redis`,并提供相应的服务器地址和端口。 5. **Nginx负载均衡**: - Nginx作为前端调度服务器,可以实现负载均衡,将用户...

    php session 多服务器的共享

    通过这种方式,无论用户请求哪个服务器,只要Session ID相同,服务器都能从Memcache中获取到相应的Session数据,从而实现跨服务器Session共享。 这种方案的优点在于,Memcache的分布式特性可以轻松地扩展到更多的...

    Apache+Tomcat实现负载均衡及集群(session同步)--五、session同步(3)使用memcache

    需要注意的是,虽然memcache提供了一种简单的方法来处理session同步,但在大型系统中,你可能还需要考虑其他解决方案,比如使用更强大的分布式存储系统(如Redis)或采用基于token的身份验证机制,以应对更大的负载...

    redis共享全jar包.rar

    包含tomcat7和8所有jar 。。。很多时候,生产环境,需要多个tomcat协作,那么session...session的统一管理有很多解决方案,比如存储至数据库、memcache、redis。那么我想给大家介绍的是将session存储至redis这个方案。

    memcache jar

    - 分布式环境下的session共享:在多服务器环境中,可以将用户的session存储在Memcache中,实现session的跨服务器共享。 - 数据预加载:在系统启动时,可以将大量数据预加载到Memcache,提高首次请求的响应速度。 ...

    thinkPHP多域名情况下使用memcache方式共享session数据的实现方法

    6. **优化session管理**:在高并发环境下,可以考虑使用分布式Memcache集群,如Redis,以提高session数据的存取速度和并发处理能力。 通过以上配置和调整,ThinkPHP项目就能在多域名环境下实现session数据的共享,...

    Redis面试知识点.pdf

    #### 41、如何实现集群中的session共享存储? - **使用Redis的集群功能**:将session数据存储在Redis集群中。 - **使用客户端路由**:根据session ID确定数据所在的节点。 #### 42、memcached与redis的区别? - *...

    linux下用memcache做tomcat集群session复制

    Memcached是一种分布式内存对象缓存系统,它可以存储包括session在内的临时数据,使得多个服务器实例间可以共享这些数据。下面将详细阐述如何在Linux上配置和使用Memcached以及如何在Tomcat集群中实现session复制。 ...

    php session阻塞页面分析及优化

    - 支持集群:可以实现跨服务器共享Session,提高系统的可用性和扩展性。 - **潜在问题**: - 连接数限制:虽然解决了文件锁定问题,但如果Web服务器上存在大量的长时间运行脚本,仍然会导致Memcache或Redis的连接...

    php 5.3/5.4/5.5 windows 32/64位memcache.dll扩展

    - Session共享:跨服务器共享用户Session,实现负载均衡。 - 缓存动态内容:对于计算密集型或数据库查询密集型的页面,可以预先计算并缓存结果。 8. **与其他缓存技术的比较** - Memcache相比Redis,更简单、轻...

    memcache缓存

    使用Memcached作为session存储,可以实现多台服务器间的session共享,这样当用户在集群中的任意一台服务器上登录后,其session信息可以在其他服务器上被识别,保证了用户会话的一致性,提升了应用的可扩展性和可用性...

    网站负载均衡解决专项方案.doc

    2. 使用独立的服务(如redis或memcache)存储session数据,这种方式更为推荐,因为它避免了转发规则的复杂性,并且支持跨服务器的数据共享。 在Nginx配置示例中,upstream块定义了服务器集群,其中每个服务器都有一...

    网站负载均衡解决方案.doc

    2. 使用独立的服务,如redis或memcache来存储session数据。这种方法更为推荐,因为它消除了对特定服务器的依赖,增强了系统的可扩展性。 配置Nginx时,示例配置文件展示了如何定义upstream块来分配服务器权重,并...

    ThinkPHP的模版中调用session数据的方法

    例如,当涉及到多域名共享Session时,可以利用Memcache或Redis等缓存工具实现Session共享;在分布式环境中,可能需要自定义Session处理方式,如使用MySQL存储Session数据;或者在遇到Session与Cookie冲突时,需要...

    Yii2下session跨域名共存的解决方案

    对于不同一级域名之间的session共享,比如`a.com`和`b.com`,一种可行的方法是利用P3P(Platform for Privacy Preferences Project)协议。P3P允许跨域设置cookie,通过在响应头中添加特定的P3P政策,浏览器会允许...

Global site tag (gtag.js) - Google Analytics