redis key 的長度主要會影響空間占用,時間上,差距可以忽略
成都創(chuàng)新互聯(lián)專注于浮山企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站開發(fā),商城網(wǎng)站定制開發(fā)。浮山網(wǎng)站建設(shè)公司,為浮山等地區(qū)提供建站服務(wù)。全流程按需定制開發(fā),專業(yè)設(shè)計,全程項目跟蹤,成都創(chuàng)新互聯(lián)專業(yè)和態(tài)度為您提供的服務(wù)
所以這個不用擔(dān)心了
?php
/**
* Redis緩存操作
* @author hxm
* @version 1.0
* @since 2015.05.04
*/
class RCache extends Object implements CacheFace
{
private $redis = null; //redis對象
private $sId = 1; //servier服務(wù)ID
private $con = null;//鏈接資源
/**
* 初始化Redis
*
* @return Object
*/
public function __construct()
{
if ( !class_exists('Redis') )
{
throw new QException('PHP extension does not exist: Redis');
}
$this-redis = new Redis();
}
/**
* 鏈接memcahce服務(wù)
*
* @access private
* @param string $key 關(guān)鍵字
* @param string $value 緩存內(nèi)容
* @return array
*/
private function connect( $sid )
{
$file = $this-CacheFile();
require $file;
if(! isset($cache) )
{
throw new QException('緩存配置文件不存在'.$file);
}
$server = $cache[$this-cacheId];
$sid = isset($sid) == 0 ? $this-sId : $sid;//memcache服務(wù)選擇
if ( ! $server[$sid])
{
throw new QException('當(dāng)前操作的緩存服務(wù)器配置文件不存在');
}希望能幫到你,我還在后盾網(wǎng)學(xué)習(xí)呢,有不會的可以問我,一會有空回答你。( ^ω^)
對于大訪問量的站點(diǎn)使用默認(rèn)的Session 并不合適,我們可以將其存入數(shù)據(jù)庫、或者使用Redis KEY-VALUE數(shù)據(jù)存儲方案
首先新建一個session表
CREATE TABLE `sessions` (
`sid` char(40) NOT NULL,
`updatetime` int(20) NOT NULL,
`data` varchar(200) NOT NULL,
UNIQUE KEY `sid` (`sid`) USING HASH
) ENGINE=MEMORY DEFAULT CHARSET=utf8;
Mysql 的memory引擎采用內(nèi)存表,所有數(shù)據(jù)存儲在內(nèi)存,操作速度快
復(fù)制代碼
?php
//引入數(shù)據(jù)庫文件
include "db.php";
class MySessionHandler implements SessionHandlerInterface
{
private $savePath;
private $sessData;
public $expiretime; //設(shè)置過期時間
public $db; //數(shù)據(jù)庫
public function __construct($hanlder =''){
$this-db = Database::getInstance();
//獲取數(shù)據(jù)庫實力
///var_dump($this-db);
}
public function open($savePath, $sessionName)
{
return true;
}
public function close()
{
return true;
}
public function read($id)
{
$sql ="select * from sessions where sid ='$id'";
$result = $this-db-execute($sql);
if(!empty($result)){
return $this-sessData = $result;
}
}
//函數(shù)的參數(shù) $id - 當(dāng)前會話ID
//數(shù)據(jù)DATA - 序列化之后的字符串
public function write($id, $data)
{
// echo $id;
// echo $data;
$now = time();
$newExp = $now+$this-expiretime; //總時間=當(dāng)前時間 + 期限時間
$sql = "select * from sessions where sid ='$id'";
$result = $this-db-getOne($sql);
//var_dump($result);
if($data==''||isset($data)){
$data = $this-sessData;
}
if($result){
//如果存在則更新
$sql ="update sessions set updatetime = '$newExp',data ='$data' where sid = '$id'";
//echo $sql;
$update_data =$this-db-execute($sql);
if($update_data){
return true;
}
}else{
//不存在則生成生成
$sql = "insert into sessions(sid,updatetime,data) values('$id','$now','$data')";
$insert_data = $this-db-execute($sql);
if($insert_data){
return true;
}
}
return false;
}
public function destroy($id)
{ //銷毀
$sql = "delete from sessions where sid="."$id";
$destory = $this-db-execute($sql);
if($destory){
return true;
}else{
return false;
}
}
public function gc($sessMaxLifeTime)
{
$t = time();
$sql ="delete from sessions where $t - 'updatetime'${sessMaxLifeTime}";
$data = $this-db-execute($this-tosql);
if($data){
return true;
}else{
return false;
}
return true;
}
}
復(fù)制代碼
實例化
此處 PHP 手冊可以有兩種方法
1,實現(xiàn)了SessionHandlerInterface借口的對象,自PHP5.4可以使用
2 ,直接使用 session_set_save_handler
復(fù)制代碼
//判斷PHP版本
if(version_compare(PHP_VERSION,5.4)==1){
session_set_save_handler($handler, true);
session_start();
}else{
ini_set('session.use_trans_sid',0);
ini_set('session.use_cookies',1);
ini_set('session.cookie_path','/');
ini_set('session.save_handler','user');
session_module_name('user');
session_set_save_handler(array($session,"open"),array($session,"close"),array($session,"read"),array($session,"write"),array($session,"destory"),array($session,"gc"));
session_start();
}
$_SESSION['QQ']="QQ";
echo $_SESSION['QQ'];
復(fù)制代碼
數(shù)據(jù)庫代碼 db.php
復(fù)制代碼
?php
class Database{
static $instance;
static $db;
static function getInstance(){
if(self::$instance){
return self::$instance;
}else{
return new Database();
}
}
public function __construct(){
self::$db = new PDO('mysql:host=localhost;dbname=session', 'root','');
}
public function getOne($sql){
$rs =self::$db-query($sql);
@$rs-setFetchMode(PDO::FETCH_ASSOC);//返回關(guān)聯(lián)數(shù)組
$result = $rs - fetch();
return $result;
}
public function execute($sql){
$rs = self::$db-exec($sql);
return $rs;
}
}
//$data = Database::getInstance();
//var_dump($data);
復(fù)制代碼
使用REDIS 存儲SESSION
復(fù)制代碼
?php
class SessionManager{
private $redis;
private $sessionSavePath;
private $sessionName;
private $sessionExpireTime = 30;
public function __construct(){
$this-redis = new Redis();
$this-redis-connect('127.0.0.1',6379); //連接redis
$retval = session_set_save_handler(
array($this,"open"),
array($this,"close"),
array($this,"read"),
array($this,"write"),
array($this,"destory"),
array($this,"gc")
);
session_start();
}
public function open($path,$name){
return true;
}
public function close(){
return true;
}
public function read($id){
$value = $this-redis-get($id);
if($value){
return $value;
}else{
return "";
}
}
public function write($id,$data){
if($this-redis-set($id,$data)){
$this-redis-expire($id,$this-sessionExpireTime);
//設(shè)置過期時間
return true;
}
return false;
}
public function destory($id){
if($this-redis-delete($id)){
return true;
}
return false;
}
public function gc($maxlifetime){
return true;
}
//析構(gòu)函數(shù)
public function __destruct(){
session_write_close();
}
}
$re = new SessionManager();
$_SESSION['name'] = "qq";
echo $_SESSION['name'];
select 查詢的時候始終先查 redis 有沒有,沒有去查數(shù)據(jù)庫,再把結(jié)果緩存起來;
update 修改完數(shù)據(jù)庫內(nèi)容后,同時對 redis 中緩存的數(shù)據(jù)做一下 update 更新操作,這樣 select 查詢 redis 的時候就是查詢的最新數(shù)據(jù);
同理,delete、insert 操作數(shù)據(jù)庫后也要同時對 redis 中緩存的數(shù)據(jù)做 update 更新操作,這樣 select 查詢 redis 的時候就是查詢的最新數(shù)據(jù);
這樣,所有的查詢操作就都是對 redis 做緩存讀取,可以緩解數(shù)據(jù)庫的壓力;
?php
$redis?=?new?Redis();
//*********無序集合**********//
//添加set
$redis-
sadd('set1' , 'ab');
$redis-sadd('set1' , 'cd');
$redis-sadd('set1' , 'ef');
//返回集合所有成員
var_dump($redis-smembers('set1'));
//返回集合隨機(jī)元素
var_dump($redis-srandmember('set1'));
//*********有序集合**********//
//添加zset
$redis-zadd('zset1' , 1 , 'ab');
$redis-zadd('zset1' , 2 , 'cd');
$redis-zadd('zset1' , 3 , 'ef');
//返回指定區(qū)間的而元素
$redis-zrange('zset1' , 0 ,1); //0和1之間的元素
//更多請查手冊
當(dāng)前名稱:php讀取redis數(shù)據(jù) php redis lua
網(wǎng)頁網(wǎng)址:http://www.muchs.cn/article48/docsgep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供商城網(wǎng)站、Google、自適應(yīng)網(wǎng)站、ChatGPT、外貿(mào)網(wǎng)站建設(shè)、
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)