我常用的一个方法:
1、 建立一张 mysql 的内存表(优秀的读写性能以及快速增删)
CREATE TABLE `xx_session` (
`user_id` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`expire` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`ip` INT(10) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`user_id`),
KEY `ip` (`ip`),
KEY `expireIndex` (`expire`)
) ENGINE=MEMORY DEFAULT CHARSET=utf8
user_id:用户id
expire:用于告诉系统过期时间
ip:ip2long 转成的整型ip
附:内存表有一个问题,就是重启后所有数据会消失。这点在使用中请务必注意。
2、用户每次操作时 replace into 进内存表:
REPLACE INTO xx_session (user_id, expire, ip)VALUES(10, 1000000000, 102933800);
3、 用户退出时:
DELETE FROM xx_session WHERE user_id=10;
4、 在线用户过期,可以通过 Mysql 的 Event Scheduler 来定时删除过期用户:
CREATE DEFINER=`root`@`%` EVENT `30minute` ON SCHEDULE EVERY 30 MINUTE STARTS '2012-05-30 00:00:00' ON COMPLETION NOT PRESERVE ENABLE DO BEGIN
DELETE FROM xx_session WHERE expire<= UNIX_TIMESTAMP();
END;
注意:
mysql 要启用 Event Scheduler:
查看是否启动:
SELECT @@event_scheduler;
启动方法1(不重启,但重启失效):
SET GLOBAL event_scheduler = 1;
启动方法2(永久生效),在 mysql 启动时加上:
mysqld ... --event_scheduler=1
启动方法3(永久生效),在 my.cnf 中、[mysqld]里,加入:
event_scheduler=ON