導航:首頁 > 版本升級 > memcache存不了大文件

memcache存不了大文件

發布時間:2023-04-13 05:06:42

㈠ Memcache 連接超時 什麼原因

Memcached存儲單個item最大數據是在1MB內,如果數據超過1M,存取set和get是都是返回false,而且引起性能的問題。

我們之前對排行榜的數據進行緩存,由於排行榜在我們所有sql select查詢裡面佔了30%,而且我們排行榜每小時更新一次,所以必須對數據做緩存。為了清除緩存方便,把所有的用戶的數據放在同一key中,由於memcached:set的時候沒有壓縮數據。在測試服測試的時候,沒發現問題,當上線的時候,結果發現,在線人數剛剛490人的時候,伺服器load average飄到7.9。然後我們去掉緩存,一下子就下降到0.59。

所以Memcahce不適合緩存大數據,超過1MB的數據,可以考慮在客戶端壓縮或拆分到多個key中。大的數據在進行load和uppack到內存的時候需要花很長時間,從而降低伺服器的性能。

Memcached支持最大的存儲對象為1M。這個值由其內存分配機制決定的。

memcached默認情況下採用了名為Slab Allocator的機制分配、管理內存。在該機制出現以前,內存的分配是通過對所有記錄簡單地進行malloc和free來進行的。但是,這種方式會導致內存碎片,加重操作系統內存管理器的負擔,最壞的情況下,會導致操作系統比memcached進程本身還慢。Slab Allocator就是為解決該問題而誕生的。Slab Allocator的基本原理是按照預先規定的大小,將分配的內存分割成特定長度的塊,以完全解決內存碎片問題.

今天(2012-03-16)我們重新測試了memcached ::set的數據大小。可能是我們用php的memcached擴展是最新版,set數據的時候是默認壓縮的。set 數據:

$ac = new memcahed();
$data = str_repeat('a', 1024* 1024); //1M的數據
$r = $ac->set('key', $data, 9999);
//或者
$data = str_repeat('a', 1024* 1024*100);//100M的數據
$r = $ac->set('key', $data, 9999);
不論是1M的數據還是100M的數據,都能set成功。後來我發現,memcachedset數據的時候是默認壓縮的。由於這個這個是重復的字元串,壓縮率高達1000倍。因此100M的數據壓縮後實際也就100k而已。

當我設置:

$ac->setOption(memcahed::OPT_COMPRESSION,0); //不壓縮存儲數據。
$data = str_repeat('a', 1024* 1024); //1M數據
$r = $ac->set('key', $data, 9999);//1M的數據set不成功。
也就是說memcached server不能存儲超過1M的數據,但是經過客戶端壓縮數據後,只要小於1M的數據都能存儲成功。

memcached相關知識:

1、memcached的基本設置
1)啟動Memcache的伺服器端
# /usr/local/bin/memcached -d -m 10 -u root -l 192.168.0.200 -p 12000 -c 256 -P /tmp/memcached.pid

-d選項是啟動一個守護進程,
-m是分配給Memcache使用的內存數量,單位是MB,我這里是10MB,
-u是運行Memcache的用戶,我這里是root,
-l是監聽的伺服器IP地址,如果有多個地址的話,我這里指定了伺服器的IP地址192.168.0.200,
-p是設置Memcache監聽的埠,我這里設置了12000,最好是1024以上的埠,
-c選項是最大運行的並發連接數,默認是1024,我這里設置了256,按照你伺服器的負載量來設定,
-P是設置保存Memcache的pid文件,我這里是保存在 /tmp/memcached.pid,

2)如果要結束Memcache進程,執行:

# kill `cat /tmp/memcached.pid`

哈希演算法將任意長度的二進制值映射為固定長度的較小二進制值,這個小的二進制值稱為哈希值。哈希值是一段數據唯一且極其緊湊的數值表示形式。如果散列一段明文而且哪怕只更改該

段落的一個字母,隨後的哈希都將產生不同的值。要找到散列為同一個值的兩個不同的輸入,在計算上是不可能的。

2、適用memcached的業務場景?

1)如果網站包含了訪問量很大的動態網頁,因而資料庫的負載將會很高。由於大部分資料庫請求都是讀操作,那麼memcached可以顯著地減小資料庫負載。

2)如果資料庫服務

㈡ memcache如何緩存大的列表

memcache伺服器,要特殊配置,內存要爛昌大,其他硬體能用即可念歷迅
其他解決方案:可以配置分布式緩存
因為memcache一般是只供區域網使用的
工作原理是:web伺服器使用memcache緩存,然後把數據緩存在memcache伺服器上,memecache只用到內存仔此

數據量過大隻能增加伺服器,部署分布式緩存

㈢ memcache 內存沒有用完為什麼不能存數據呢

你的memcached申請了多大的空間?你存儲的單個對象是多大的?不可以大於1M

㈣ php中設置memcache內存沒滿,但是存不進去

因為mc是盒子模型儲存,你可以換個大一點或歲兄搜者小一塵鎮點的數據進去,看看行不行。乎歷
如果可以,證明你那個大小的數據盒子滿了

㈤ memcache 怎麼存儲的對象

1、將下載的memcached.exe文件放到磁碟固定的殲爛晌地方,不要刪除。打開開始菜單,在輸入框里輸入cmd按回車。2、在出現的彈出窗中輸入c:\memcached\memcached.exe -d install。3、再輸入: 'c:\memcached\memcached.exe -d start' 啟動。NOTE: 以後memcached將作為windows的一個服務每次開機時自動啟動。這樣伺服器端已經安裝完畢了。4、查看服務是否開啟,在開始菜單中輸入框中輸入services.msc。5、在彈出的窗口中查找memcached服務,如圖所示:6、下載php_memcache.dll,請自己查找對應的php版本的文件,找到php配置文件php.ini加入一行 'extension=php_memcache.dll'氏鋒。7、查看模塊是否安裝:新建一個.php文件,輸入以下代碼運行即可。<?phpphpinfo();?>註:有的應該會有phpinfo.php文件,直接運行即可。在出現的網頁裡面找memcache模歷笑塊。如圖所示。

㈥ memcached緩存錯誤

安裝以後,啟動服務,memcached開始運行,php中memcached的擴展是用來php連接memcached用的,就像是mysql擴展是php連接mysql用,memcached主要作用是緩存mysql資料庫的,擾虛轎需要在php中定義譽鋒訪問memcached,如果沒有數據,php去訪問mysql,然後通過php代碼告訴memcached你給我緩存數據。我理解的就是這樣,我不是開發緩肆,是運維。

㈦ 我的memcached為什麼不能存復雜對象

下文簡單介紹了memcached類的應用示例,具有一定的參考價值,感興趣的小夥伴們可以參考一下。 一、memcached 簡介 在很多場合,我們都會聽到 memcached 這個名字,但很多同學只是聽過,並沒有用過或實際了解過,只知道它是一個很不錯的東東。這里簡單介紹一下,memcached 是高效、快速的分布式內存對象緩存系統,主要用於加速 WEB 動態應用程序。 二、memcached 安裝 首先是下載 memcached 了,目前最新版本是 1.1.12,直接從官方網站即可下載到 memcached-1.1.12.tar.gz。除此之外,memcached 用到了 libevent,我下載的是 libevent-1.1a.tar.gz。 接下來是分別將 libevent-1.1a.tar.gz 和 memcached-1.1.12.tar.gz 解開包、編譯、安裝: # tar -xzf libevent-1.1a.tar.gz # cd libevent-1.1a # ./configure --prefix=/usr # make # make install # cd .. # tar -xzf memcached-1.1.12.tar.gz # cd memcached-1.1.12 # ./configure --prefix=/usr # make # make install 安裝完成之後,memcached 應該在 /usr/bin/memcached。 三、運行 memcached 守護程序 運行 memcached 守護程序很簡單,只需一個命令行即可,不需要修改任何配置文件(也沒有配置文件給你修改): /usr/bin/memcached -d -m 128 -l 192.168.1.1 -p 11211 -u httpd 參數解釋: -d 以守護程序(daemon)方式運行 memcached; -m 設置 memcached 可以使用的內存大小,單位為 M; -l 設置監聽的 IP 地址,如果是本機的話,通常可以不設置此參數; -p 設置監聽的埠,默認為 11211,所以也可以不設置此參數; -u 指定用戶,芹滲如果當前為 root 的話,需要使用此參數指定用戶。 當然,還有其它參數可以用,man memcached 一下就可以看到了。 四、memcached 的工作原理 首先 memcached 是以守護程序方式運行於一個或多個伺服器中,隨時接受喊芹客戶端的連接操作,客戶端可以由各種語言編寫,目前已知的客戶端 API 包括 Perl/PHP/Python/Ruby/Java/C#/C 等等。PHP 等客戶端在與 memcached 服務建立連接之後,接下來的事情就是存取對象了,每個被存取的對象都有一個唯一的標識符 key,存取操作均通過這個 key 進行,保存到 memcached 中的對象實際上是放置內存中的,嫌滲脊並不是保存在 cache 文件中的,這也是為什麼 memcached 能夠如此高效快速的原因。注意,這些對象並不是持久的,服務停止之後,里邊的數據就會丟失。 五、PHP 如何作為 memcached 客戶端 有兩種方法可以使 PHP 作為 memcached 客戶端,調用 memcached 的服務進行對象存取操作。 第一種,PHP 有一個叫做 memcache 的擴展,Linux 下編譯時需要帶上 –enable-memcache[=DIR] 選項,Window 下則在 php.ini 中去掉 php_memcache.dll 前邊的注釋符,使其可用。 除此之外,還有一種方法,可以避開擴展、重新編譯所帶來的麻煩,那就是直接使用 php-memcached-client。 本文選用第二種方式,雖然效率會比擴展庫稍差一些,但問題不大。 六、PHP memcached 應用示例 首先 下載 memcached-client.php,在下載了 memcached-client.php 之後,就可以通過這個文件中的類「memcached」對 memcached 服務進行操作了。其實代碼調用非常簡單,主要會用到的方法有 add()、get()、replace() 和 delete(),方法說明如下: add ($key, $val, $exp = 0) 往 memcached 中寫入對象,$key 是對象的唯一標識符,$val 是寫入的對象數據,$exp 為過期時間,單位為秒,默認為不限時間; get ($key) 從 memcached 中獲取對象數據,通過對象的唯一標識符 $key 獲取; replace ($key, $value, $exp=0) 使用 $value 替換 memcached 中標識符為 $key 的對象內容,參數與 add() 方法一樣,只有 $key 對象存在的情況下才會起作用; delete ($key, $time = 0) 刪除 memcached 中標識符為 $key 的對象,$time 為可選參數,表示刪除之前需要等待多長時間。 下面是一段簡單的測試代碼,代碼中對標識符為 'mykey' 的對象數據進行存取操作: <?php // 包含 memcached 類文件 require_once('memcached-client.php'); // 選項設置 $options = array( 'servers' => array('192.168.1.1:11211'), //memcached 服務的地址、埠,可用多個數組元素表示多個 memcached 服務 'debug' => true, //是否打開 debug 'compress_threshold' => 10240, //超過多少位元組的數據時進行壓縮 'persistant' => false //是否使用持久連接 ); // 創建 memcached 對象實例 $mc = new memcached($options); // 設置此腳本使用的唯一標識符 $key = 'mykey'; // 往 memcached 中寫入對象 $mc->add($key, 'some random strings'); $val = $mc->get($key); echo "n".str_pad('$mc->add() ', 60, '_')."n"; var_mp($val); // 替換已寫入的對象數據值 $mc->replace($key, array('some'=>'haha', 'array'=>'xxx')); $val = $mc->get($key); echo "n".str_pad('$mc->replace() ', 60, '_')."n"; var_mp($val); // 刪除 memcached 中的對象 $mc->delete($key); $val = $mc->get($key); echo "n".str_pad('$mc->delete() ', 60, '_')."n"; var_mp($val); ?> 是不是很簡單,在實際應用中,通常會把資料庫查詢的結果集保存到 memcached 中,下次訪問時直接從 memcached 中獲取,而不再做資料庫查詢操作,這樣可以在很大程度上減輕資料庫的負擔。通常會將 SQL 語句 md5() 之後的值作為唯一標識符 key。下邊是一個利用 memcached 來緩存資料庫查詢結果集的示例(此代碼片段緊接上邊的示例代碼): <?php $sql = 'SELECT * FROM users'; $key = md5($sql); //memcached 對象標識符 { // 在 memcached 中未獲取到緩存數據,則使用資料庫查詢獲取記錄集。 echo "n".str_pad('Read datas from MySQL.', 60, '_')."n"; $conn = mysql_connect('localhost', 'test', 'test'); mysql_select_db('test'); $result = mysql_query($sql); while ($row = mysql_fetch_object($result)) $datas[] = $row; // 將資料庫中獲取到的結果集數據保存到 memcached 中,以供下次訪問時使用。 $mc->add($key, $datas); { echo "n".str_pad('Read datas from memcached.', 60, '_')."n"; } var_mp($datas); ?> 可以看出,使用 memcached 之後,可以減少資料庫連接、查詢操作,資料庫負載下來了,腳本的運行速度也提高了。 之前我曾經寫過一篇名為《PHP 實現多伺服器共享 SESSION 數據》文章,文中的 SESSION 是使用資料庫保存的,在並發訪問量大的時候,伺服器的負載會很大,經常會超出 MySQL 最大連接數,利用 memcached,我們可以很好地解決這個問題,工作原理如下: 用戶訪問網頁時,查看 memcached 中是否有當前用戶的 SESSION 數據,使用 session_id() 作為唯一標識符;如果數據存在,則直接返回,如果不存在,再進行資料庫連接,獲取 SESSION 數據,並將此數據保存到 memcached 中,供下次使用; 當前的 PHP 運行結束(或使用了 session_write_close())時,會調用 My_Sess::write() 方法,將數據寫入資料庫,這樣的話,每次仍然會有資料庫操作,對於這個方法,也需要進行優化。使用一個全局變數,記錄用戶進入頁面時的 SESSION 數據,然後在 write() 方法內比較此數據與想要寫入的 SESSION 數據是否相同,不同才進行資料庫連接、寫入資料庫,同時將 memcached 中對應的對象刪除,如果相同的話,則表示 SESSION 數據未改變,那麼就可以不做任何操作,直接返回了; 那麼用戶 SESSION 過期時間怎麼解決呢?記得 memcached 的 add() 方法有個過期時間參數 $exp 嗎?把這個參數值設置成小於 SESSION 最大存活時間即可。另外別忘了給那些一直在線的用戶延續 SESSION 時長,這個可以在 write() 方法中解決,通過判斷時間,符合條件則更新資料庫數據。 以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

㈧ memcache默認只能緩存64M,怎麼改大

如果是使岩森敏用了腳本粗枝控制服務,可春孫以修改/etc/rc.d/init.d/memcached同時修改配置文件/etc/sysconfig/memcached

㈨ 如何修改memcache內存大小

將memcache伺服器安裝包解壓到C:\memcached文件夾後,使用cmd命令窗口安裝。

1>開始>運行:CMD(確定)

2>cd C:\memcached(回車)

3>memcached -d install(回車 這步執行安裝)

4>memcached -d start(回車 這步執行啟動memcache伺服器,默認分配64M內存,使用11211埠)

此時memcache伺服器已經可以正常使用了。

由於32位系統只能處理4G內存的定址,所以在大於4G內存使用PAE的32位伺服器上可以運行2-3個進程,並在不同埠進行監聽。

又如:memcached -d -m 10 -u root -l 192.168.105.73 -p 12000 -c 256 -P /tmp/memcached.pid

[plain] view plain
-d選項是啟動一個守護進程,
-m是分配給Memcache使用的內存數量,單位是MB,我這里是10MB,
-u是運行Memcache的用戶,我這里是root,
-l是監聽的伺服器IP地址,如果有多個地址的話,我這里指定了伺服器的IP地址192.168.105.73 ,
-p是設置Memcache監聽的埠,我這里設置了12000,最好是1024以上的埠,
-c選項是最大運行的並發連接數,默認是1024,我這里設置了256,按照你伺服器的負載量來設定,
-P是設置保存Memcache的pid文件,我這里是保存在 /tmp/memcached.pid

memcache伺服器安全:

Memcache伺服器端都是直接通過客戶端連接後直接操作,沒有任何的驗證過程,這樣如果伺服器是直接暴露在互聯網上的話是比較危險,輕則數據泄露被其他無關人員查看,重則伺服器被入侵,況且裡面可能存在一些我們未知的bug或者是緩沖區溢出的情況,這些都是我們未知的,所以危險性是可以預見的。為了安全起見,做兩點建議,能夠稍微的防止黑客的入侵或者數據的泄露。

現在就關於修改memcache伺服器配置的問題說明如下:

1>用內網ip的方式提供web應用伺服器調用,不允許直接通過外網調用,如將memcache伺服器放在192.168.1.55的伺服器上

2>修改埠,如改為11200

3>分配內存,如分配1024M(1G內存)

方法如下:
1>開始>運行:regedit(回車)

2>在注冊表中找到:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\memcached Server

3>默認的ImagePath鍵的值是:"c:\memcached\memcached.exe" -d runservice,改為:"c:\memcached\memcached.exe" -d runservice -m 512 -p 11200 -l 192.168.1.55(確定,關閉注冊表)

4>我的電腦(右鍵)>管理>服務 找到memcache的服務,重新啟動一次即可生效。
可以使用PHP寫的 MemAdmin 來監控memcahce運行狀態
原文地址:http://blog.csdn.NET/leiyonglin/article/details/694

㈩ memcache中怎麼緩存文件

首先明確,memcache是作為高速緩存使用的。

那麼,到底怎樣才能獲得高速的響應呢?當然如果是簡單處理的話,利用關系型資料庫的索引也能獲得高速響應。雖然memcached會更快一些,但如果合理地使用索引,關系型資料庫就足夠快了。
但是如果要對多個表的數據進行計算,情況又會怎樣呢?若使用關系型資料庫,我們需要從每個表中取出數據然後進行最後的組合處理,或者每次都要使用JOIN等處理。雖然我們可以通過事前用批處理製作數據來解決這個問題,但是這樣又會增加需要管理的表,花費我們更多的精力。

閱讀全文

與memcache存不了大文件相關的資料

熱點內容
在哪裡看電商銷售數據 瀏覽:135
win10覆蓋txt文件找回 瀏覽:556
哪個網站可以聽高中的課 瀏覽:381
iphone5s查看文件夾 瀏覽:844
類似創客貼的app工具有哪些 瀏覽:81
蘋果7手機型號怎麼看 瀏覽:135
高通手機升級找不到那個文件 瀏覽:593
工程造價工資和軟體編程哪個累 瀏覽:669
公考報名文件路徑 瀏覽:988
人臉識別系統招標文件 瀏覽:260
閱讀app20聽書怎麼設置 瀏覽:996
axure70教程視頻下載 瀏覽:446
linux如何開啟埠 瀏覽:474
盜版廣聯達能不能升級 瀏覽:368
qsb是什麼文件格式 瀏覽:268
遍歷ftp目錄文件內容 瀏覽:612
求生之路22001升級2121 瀏覽:646
按鍵精靈如何檢測沒有網路後休眠 瀏覽:915
招標文件的內容應當符合標准 瀏覽:465
外推內插法c語言程序 瀏覽:146

友情鏈接