當前位置:首頁 » 文件管理 » 後端常用緩存

後端常用緩存

發布時間: 2022-08-25 02:22:53

『壹』 magento如何實施正確的緩存策略以達到最佳性能

本篇文章主要介紹一下在maegnto里cache(File System, APC, Memcached, Redis)的使用,及在不同的伺服器環境中改怎麼使用讓其性能達到最佳。

理解magento的Two-Level Caching
magento默認使用zend framework的二層緩存存儲方式。就是說它使用兩層結構對cache進行配合管理,一個快的,但大小有限制的結構是一層比如APC或者Memcached ,一個比較慢的結構作為第二層比如file system.每一種存儲結構各有利弊,要不同情況不同分析使用,APC 和 Memcached 是使用 key/value來存儲cache,他們都不支持tag。File system 和Redis 支持tag.
magento二級緩存結構工作流程圖示 (Thanks to Fabrizio Branca):

magento自帶的各種後端緩存介紹:
File system (var/cache)
默認情況下,Magento 將它的緩存條目存儲在file系統中,在var/cache/下可查看。這種情況很適合小型的,數據量不大的站點。但是對於大型的站點,隨著瀏覽量的不斷增多,對file的讀寫操作也將越來越多,站點也會越來越慢。magento是由tags來對cache進行組織管理的,這意味著可以對某一個cache組(相同的tag為一個group)進行操作。
優點:這是默認的,不需要裝額外的軟體
缺點:清除cache依賴於tag,通常修改某個proct或處理某個order完之後,對應的前台頁面都需要更新緩存。每次更新緩存時,都需要根據tag進行所有條目即file進行查找,試想如果站點有多於1000個proct,整個cache的大小將會大於50MB,大約有3500個file,你能想像到每次更新cache都要對3500個file進行查找有多慢嗎。
小提示
1:使用 SSD 替代普通硬碟
2:把var/cache接入 tmpfs

----------------------------------------------------------------------------------------------------------------------------------

APC – Alternative php Cache (Key/Value)
APC是一個免費,開源且強健的框架用來緩存和優化 PHP 的中間代碼。
優點:相對於file cache system是很快了
缺點:不支持tag,所以依然需要file system作為slow level cache。伺服器需要安裝PHP APC 模塊
小提示:確保有足夠的內存給APC ,可在 php.ini 中修改參數apc.shm_size
Configuration (app/etc/local.xml)
<global>
...
<cache>
<backend>apc</backend>
<prefix>mgt_</prefix>
</cache>
...
</global>
Settings for php.iniapc.enabled = 1
apc.optimization = 0
apc.shm_segments = 1
apc.shm_size = 768M
apc.ttl = 48000
apc.user_ttl = 48000
apc.num_files_hint = 8096
apc.user_entries_hint = 8096
apc.mmap_file_mask = /tmp/apc.XXXXXX
apc.enable_cli = 1
apc.cache_by_default = 1
apc.max_file_size = 10M
apc.include_once_override = 0
---------------------------------------------------------------------------------------------------------------------------
Memcached (Key/Value)
Memcache是一個高性能的分布式的內存對象緩存系統,通過在內存里維護一個統一的巨大的hash表,它能夠用來存儲各種格式的數據,包括圖像、視頻、文件以及資料庫檢索的結果等。簡單的說就是將數據調用到內存中,然後從內存中讀取,從而大大提高讀取速度。
優點:更快的存取速度
缺點:不支持tag,所以依然需要file system作為slow level cache
需求:1:Memcached server 2: PHP extension for memcached
Configuration (app/etc/local.xml)<global>
...
<cache>
<backend>memcached</backend><!-- apc / memcached / empty=file -->
<memcached><!-- memcached cache backend related config -->
<servers><!-- any number of server nodes can be included -->
<server>
<host><![CDATA[127.0.0.1]]></host>
<port><![CDATA[11211]]></port>
<persistent><![CDATA[1]]></persistent>
</server>
</servers>
<compression><![CDATA[0]]></compression>
<cache_dir><![CDATA[]]></cache_dir>
<hashed_directory_level><![CDATA[]]></hashed_directory_level>
<hashed_directory_umask><![CDATA[]]></hashed_directory_umask>
<file_name_prefix><![CDATA[]]></file_name_prefix>
</memcached>
</cache>
...
</global>

---------------------------------------------------------------------------------------------------------------------
Redis – Advanced key-value store with full cache tag support
magento允許我們使用redis server作為中央存儲倉庫,它支持tag的使用,所以不再需要file system作為slow level cache。在多伺服器多站點環境中,強烈推薦使用redis
,用一個中央緩存倉庫,對所有server cache進行管理。
優點:快;支持tag;已在一個日均ip為500000的站點做過測試,性能極好且穩定。
需求:1:伺服器上需要裝Redis 2:PHP 擴展 phpredis 需要安裝 3:Magento擴展「Cm_Cache_Backend_Redis」需要安裝

Installation
1. Install redis (2.4+ required)
2. Install phpredis
3. Install the magento extension 「Cm_Cache_Backend_Redis」
4. Edit your app/etc/local.xml
<global>
...
<cache>
<backend>Cm_Cache_Backend_Redis</backend>
<backend_options>
<server>127.0.0.1</server> <!-- or absolute path to unix socket -->
<port>6379</port>
<persistent></persistent>
<database>0</database>
<password></password>
<force_standalone>0</force_standalone>
<connect_retries>1</connect_retries>
<automatic_cleaning_factor>0</automatic_cleaning_factor>
<compress_data>1</compress_data>
<compress_tags>1</compress_tags>
<compress_threshold>20480</compress_threshold>
<compression_lib>gzip</compression_lib> <!-- Supports gzip, lzf and snappy -->
</backend_options>
</cache>
...
</global>

轉載僅供參考,版權屬於原作者。祝你愉快,滿意請採納哦

『貳』 如何利用Nginx的緩沖,緩存優化提升性能

反向代理的一個問題是代理大量用戶時會增加伺服器進程的性能沖擊影響。在大多數情況下,可以很大程度上能通過利用Nginx的緩沖和緩存功能減輕。
當代理到另一台伺服器,兩個不同的連接速度會影響客戶的體驗:
從客戶機到Nginx代理的連接。
從Nginx代理到後端伺服器的連接。
Nginx具有優化這些連接調整其行為的能力。
如果沒有緩沖,數據從代理的伺服器發送並立即開始被發送到客戶。如果假定客戶端很快,緩沖可以關閉而盡快使數據到客戶端,有了緩沖,Nginx 代理將暫時存儲後端的響應,然後按需供給數據給客戶端。如果客戶端是緩慢的,允許Nginx伺服器關閉到後端的連接。然後,它可以處理數據分配到客戶端, 以任何可能的速度。
Nginx默認有緩沖設計,因為客戶端往往有很大的不同的連接速度。我們可以用以下指令調節緩沖行為。可以在HTTP,server或 location位置來設置。重要的是要記住,大小size指令是針對每個請求配置的,所以增加超出你需求會影響你的性能,如果這時有許多客戶端請求:
proxy_buffering:該指令控制緩沖是否啟用。默認情況下,它的值是「on」。
proxy_buffers:該指令控制代理響應緩沖區的數量(第一個參數)和大小(第二個參數)。默認配置是8個緩沖區大小等於一個內存頁(4K或者8K)。增加緩沖區的數目可以讓你緩沖更多信息。
proxy_buffer_size:從後端伺服器的響應頭緩沖區大小,它包含headers,和其他部分響應是分開的。該指令設置響應部分的緩沖區大小。默認情況下,它和proxy_buffers是相同的尺寸,但因為這是用於頭信息,這通常可以設置為一個較低的值。
proxy_busy_buffers_size:此指令設置標注「client-ready」緩沖區的最大尺寸。而客戶端可以一次讀取來自一個緩沖區的數據,緩沖被放置在隊列中,批量發送到客戶端。此指令控制允許是在這種狀態下的緩沖空間的大小。
proxy_max_temp_file_size:這是每個請求能用磁碟上臨時文件最大大小。這些當上游響應太大不能裝配到緩沖區時被創建。
proxy_temp_file_write_size:這是當被代理伺服器的響應過大時Nginx一次性寫入臨時文件的數據量。
proxy_temp_path:當上游伺服器的響應過大不能存儲到配置的緩沖區域時,Nginx存儲臨時文件硬碟路徑。
正如你所看到的,Nginx提供了相當多的不同的指令來調整緩沖行為。大多數時候,你不必擔心太多,但它對於調整一些值可能是有用的。可能最有用的調整是proxy_buffers和proxy_buffer_size指令。

『叄』 nginx緩存和後端伺服器負載均衡

後端群集是為了平衡來自前端的請求。通常是為了減輕單獨後端處理的壓力(尤其各種動態網頁),但又不希望使用緩存,使得客戶端不能看到最新頁面。倘若前端做了緩存,那麼前端就不會對後端發送請求,取而代之,從緩存調用。所以請求不會去後端,也就看不到最新頁面。

所以說...緩存+群集後端要鬧哪樣啊?

『肆』 一般項目為了解決什麼問題而使用redis

redis是內存資料庫,訪問速度非常快,所以能夠解決的也都是這些緩存類型的問題,如下:
1、會話緩存(Session Cache)
最常用的一種使用Redis的情景是會話緩存(session cache)。用Redis緩存會話比其他存儲(如Memcached)的優勢在於:Redis提供持久化。當維護一個不是嚴格要求一致性的緩存時,如果用戶的購物車信息全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎?
幸運的是,隨著 Redis 這些年的改進,很容易找到怎麼恰當的使用Redis來緩存會話的文檔。甚至廣為人知的商業平台Magento也提供Redis的插件。
2、全頁緩存(FPC)
除基本的會話token之外,Redis還提供很簡便的FPC平台。回到一致性問題,即使重啟了Redis實例,因為有磁碟的持久化,用戶也不會看到頁面載入速度的下降,這是一個極大改進,類似PHP本地FPC。
再次以Magento為例,Magento提供一個插件來使用Redis作為全頁緩存後端。
此外,對WordPress的用戶來說,Pantheon有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度載入你曾瀏覽過的頁面。
3、隊列
Reids在內存存儲引擎領域的一大優點是提供 list 和 set 操作,這使得Redis能作為一個很好的消息隊列平台來使用。Redis作為隊列使用的操作,就類似於本地程序語言(如Python)對 list 的 push/pop 操作。

『伍』 如何緩存一個block

magento是基於zend framework的,所以cache的使用基本也繼承了他的一些特性。我們要知道緩存中有幾個重要的概念:
數據本身;數據的標識;緩存生命期;緩存操作介面;
Zend_Cache 的使用比較簡單, 它可以把數據保存到 File, Memcache, sqlite 等介質(稱為後端, Backend)中. 還有前端(Frontend), 主要用來對要緩存的數據進行轉換, 如序列化.
Zend Framework 後端主要有
apc (Zend_Cache_Backend_Apc),
files (Zend_Cache_Backend_File),
memcached (Zend_Cache_Backend_Memcached)
and some more..

Magento 增加了幾種:
database (Varien_Cache_Backend_Database)
eaccelarator (Varien_Cache_Backend_Eaccelarator).

為了更深入的理解magento cache,本文就以緩存某個block為例,分析下他的工作流程和原理。在magento中,所有的block都是繼承自Mage_Core_Block_Abstract,當輸出某個block到頁面時,會調用到這個類的toHtml方法,該方法中有如下code片段:

[php] view plain
$html = $this->_loadCache();//載入緩存,假設為第一次載入,還沒有被緩存過,進入if代碼段
if ($html === false) {
$translate = Mage::getSingleton('core/translate');
/** @var $translate Mage_Core_Model_Translate */
if ($this->hasData('translate_inline')) {
$translate->setTranslateInline($this->getData('translate_inline'));
}

$this->_beforeToHtml();
$html = $this->_toHtml();
$this->_saveCache($html);//這句代碼很簡單,但卻在內部完成了大量的工作,下面進入它內部深入分析

if ($this->hasData('translate_inline')) {
$translate->setTranslateInline(true);
}
}
繼續看本類中的function _saveCache($data)

[php] view plain
function _saveCache($data)
/**
* Save block content to cache storage
*
* @param string $data
* @return Mage_Core_Block_Abstract
*/
protected function _saveCache($data)
{
if (is_null($this->getCacheLifetime()) || !Mage::app()->useCache(self::CACHE_GROUP)) {
return false;
}
$cacheKey = $this->getCacheKey();
/** @var $session Mage_Core_Model_Session */
$session = Mage::getSingleton('core/session');
$data = str_replace(
$session->getSessionIdQueryParam() . '=' . $session->getEncryptedSessionId(),
$this->_getSidPlaceholder($cacheKey),
$data
);

//可以肯定進入了Mage_Core_Model_App 的function saveCache
Mage::app()->saveCache($data, $cacheKey, $this->getCacheTags(), $this->getCacheLifetime());
return $this;
}
打開Mage_Core_Model_App 的function saveCache

[php] view plain
/**
* Saving cache data
*
* @param mixed $data
* @param string $id
* @param array $tags
* @return Mage_Core_Model_App
*/
public function saveCache($data, $id, $tags=array(), $lifeTime=false)
{
$this->_cache->save($data, $id, $tags, $lifeTime);
return $this;
}
可以看到$this->_cache這個對象調用了save,繼續看$this->_cache到底屬於哪個類的實例,在本類中找到protected function _initCache(),code如下:

[php] view plain
/**
* Initialize application cache instance
*
* @return Mage_Core_Model_App
*/
protected function _initCache()
{
$this->_isCacheLocked = true;
$options = $this->_config->getNode('global/cache');
if ($options) {
$options = $options->asArray();
} else {
$options = array();
}

//實例化Mage_Core_Model_Cache,並傳入參數$options
$this->_cache = Mage::getModel('core/cache', $options);
$this->_isCacheLocked = false;
return $this;
}
上面Mage::getModel('core/cache', $options)的$options是app/etc/local.xml中節點global/cache下的配置,假設ocal.xml如下:

[html] view plain
<config>
<global>
<cache>
<backend>apc</backend>
<slow_backend>File</slow_backend>
<auto_refresh_fast_cache>1</auto_refresh_fast_cache>
<prefix>MYSHOP_</prefix>
<default_priority>10</default_priority>
</cache>
</global>
</config>
能看到$this->_cache是實例化了實例化Mage_Core_Model_Cache,所以Mage_Core_Model_App 中的$this->_cache->save($data, $id, $tags, $lifeTime)即調用的Mage_Core_Model_Cache的function save。進入Mage_Core_Model_Cache的save:

[php] view plain
/**
* Save data
*
* @param string $data
* @param string $id
* @param array $tags
* @param int $lifeTime
* @return bool
*/
public function save($data, $id, $tags=array(), $lifeTime=null)
{
/**
* Add global magento cache tag to all cached data exclude config cache
*/
if (!in_array(Mage_Core_Model_Config::CACHE_TAG, $tags)) {
$tags[] = Mage_Core_Model_App::CACHE_TAG;
}
return $this->_frontend->save((string)$data, $this->_id($id), $this->_tags($tags), $lifeTime);
}
可以看到$this->_frontend->save(...)這句,那麼這里的_frontend是什麼呢?繼續看此類的構造函數(只列出部分code):

[php] view plain
$backend = $this->_getBackendOptions($options);
$frontend = $this->_getFrontendOptions($options);

$this->_frontend =Zend_Cache::factory('Varien_Cache_Core', $backend['type'], $frontend, $backend['options'],true, true, true);
沒錯_frontend就是類Varien_Cache_Core的一個實例,因為Varien_Cache_Core是繼承自Zend_Cache_Core,所以這里_frontend實際上實例化的是Zend_Cache_Core,即調用的是Zend_Cache_Core的save,再繼續分析,打開Zend_Cache_Core,找到function save它裡麵包含了如下代碼片段:

[php] view plain
if (($this->_extendedBackend) && ($this->_backendCapabilities['priority'])) {
$result = $this->_backend->save($data, $id, $tags, $specificLifetime, $priority);
} else {
$result = $this->_backend->save($data, $id, $tags, $specificLifetime);
}
可以看到這里實際上又變成了_backend的來調用的save,(開頭我們已經說了backend是用來保存數據的),那麼這里_backend到底是哪個backend(file,db,apc...)呢?繼續分析,在這個類裡面有一個方法setBackend:

[php] view plain
/**
* Set the backend
*
* @param Zend_Cache_Backend $backendObject
* @throws Zend_Cache_Exception
* @return void
*/
public function setBackend(Zend_Cache_Backend $backendObject)
{
$this->_backend= $backendObject;
// some options (listed in $_directivesList) have to be given
// to the backend too (even if they are not "backend specific")
$directives = array();
foreach (Zend_Cache_Core::$_directivesList as $directive) {
$directives[$directive] = $this->_options[$directive];
}
$this->_backend->setDirectives($directives);
if (in_array('Zend_Cache_Backend_ExtendedInterface', class_implements($this->_backend))) {
$this->_extendedBackend = true;
$this->_backendCapabilities = $this->_backend->getCapabilities();
}

}
裡面有$this->_backend= $backendObject這句,$backendObject是傳入的參數,那麼是何時調用的setBackend呢?實際上,這個方法是在上邊Mage_Core_Model_Cache里的save方法中調用$this->_frontend = Zend_Cache::factory('Varien_Cache_Core', $backend['type'], $frontend, $backend['options'], true, true, true);這句的的時候,已經被調用了,可以打開Zend_Cache的factory 方法查看,會發現有一句$frontendObject->setBackend($backendObject);參數$backendObject是factory傳入的參數$backend['type'],$backend['type']到底是什麼呢,我們在Mage_Core_Model_Cache的構造函數中看到$backend=$this->_getBackendOptions($options)這句,所以$backend是在本類的_getBackendOptions中被設置的,找到_getBackendOptions,code如下:

[php] view plain
/**
* Get cache backend options. Result array contain backend type ('type' key) and backend options ('options')
*
* @param array $cacheOptions
* @return array
*/
protected function _getBackendOptions(array $cacheOptions)
{
$enable2levels = false;
$type = isset($cacheOptions['backend']) ? $cacheOptions['backend'] : $this->_defaultBackend;
if (isset($cacheOptions['backend_options']) && is_array($cacheOptions['backend_options'])) {
$options = $cacheOptions['backend_options'];
} else {
$options = array();
}

$backendType = false;
switch (strtolower($type)) {
case 'sqlite':
if (extension_loaded('sqlite') && isset($options['cache_db_complete_path'])) {
$backendType = 'Sqlite';
}
break;
case 'memcached':
if (extension_loaded('memcache')) {
if (isset($cacheOptions['memcached'])) {
$options = $cacheOptions['memcached'];
}
$enable2levels = true;
$backendType = 'Memcached';
}
break;
case 'apc':
if (extension_loaded('apc') && ini_get('apc.enabled')) {
$enable2levels = true;
$backendType = 'Apc';
}
break;
case 'xcache':
if (extension_loaded('xcache')) {
$enable2levels = true;
$backendType = 'Xcache';
}
break;
case 'eaccelerator':
case 'varien_cache_backend_eaccelerator':
if (extension_loaded('eaccelerator') && ini_get('eaccelerator.enable')) {
$enable2levels = true;
$backendType = 'Varien_Cache_Backend_Eaccelerator';
}
break;
case 'database':
$backendType = 'Varien_Cache_Backend_Database';
$options = $this->getDbAdapterOptions();
break;
default:
if ($type != $this->_defaultBackend) {
try {
if (class_exists($type, true)) {
$implements = class_implements($type, true);
if (in_array('Zend_Cache_Backend_Interface', $implements)) {
$backendType = $type;
}
}
} catch (Exception $e) {
}
}
}

if (!$backendType) {
$backendType = $this->_defaultBackend;
foreach ($this->_defaultBackendOptions as $option => $value) {
if (!array_key_exists($option, $options)) {
$options[$option] = $value;
}
}
}

$backendOptions = array('type' => $backendType, 'options' => $options);
if ($enable2levels) {
$backendOptions = $this->_getTwoLevelsBackendOptions($backendOptions, $cacheOptions);
}
return $backendOptions;
}
代碼有些長,但這個方法很重要,後端具體使用什麼類型存儲緩存都是在這里被設置和轉換的,有代碼分析可知,默認的Backend為file,其他有sqlite, apc, memcached, xcache, eaccelerator, database等幾種類型,當backend是memcached, apc,xcache時,magento就自動開啟two level cache,具體設置可以自行看function _getTwoLevelsBackendOptions。

『陸』 三分鍾讀懂redis資料庫

redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁碟或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。

1. 使用Redis有哪些好處?

(1) 速度快,因為數據存在內存中,類似於HashMap,HashMap的優勢就是查找和操作的時間復雜度都是O(1)

(2) 支持豐富數據類型,支持string,list,set,sorted set,hash

(3) 支持事務,操作都是原子性,所謂的原子性就是對數據的更改要麼全部執行,要麼全部不執行

(4) 豐富的特性:可用於緩存,消息,按key設置過期時間,過期後將會自動刪除

2. redis相比memcached有哪些優勢?

(1) memcached所有的值均是簡單的字元串,redis作為其替代者,支持更為豐富的數據類型

(2) redis的速度比memcached快很多

(3) redis可以持久化其數據

3. redis常見性能問題和解決方案:

(1) Master最好不要做任何持久化工作,如RDB內存快照和AOF日誌文件

(2) 如果數據比較重要,某個Slave開啟AOF備份數據,策略設置為每秒同步一次

(3) 為了主從復制的速度和連接的穩定性,Master和Slave最好在同一個區域網內

(4) 盡量避免在壓力很大的主庫上增加從庫

(5) 主從復制不要用圖狀結構,用單向鏈表結構更為穩定,即:Master <- Slave1 <- Slave2 <- Slave3...

這樣的結構方便解決單點故障問題,實現Slave對Master的替換。如果Master掛了,可以立刻啟用Slave1做Master,其他不變。

4. MySQL里有2000w數據,redis中只存20w的數據,如何保證redis中的數據都是熱點數據

相關知識:redis 內存數據集大小上升到一定大小的時候,就會施行數據淘汰策略。redis 提供 6種數據淘汰策略:

voltile-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(驅逐):禁止驅逐數據

相關推薦:《Python視頻教程》

5. Memcache與Redis的區別都有哪些?

1)、存儲方式

Memecache把數據全部存在內存之中,斷電後會掛掉,數據不能超過內存大小。

Redis有部份存在硬碟上,這樣能保證數據的持久性。

2)、數據支持類型

Memcache對數據類型支持相對簡單。

Redis有復雜的數據類型。

3),value大小

redis最大可以達到1GB,而memcache只有1MB

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. redis 最適合的場景

Redis最適合所有數據in-momory的場景,雖然Redis也提供持久化功能,但實際更多的是一個disk-backed的功能,跟傳統意義上的持久化有比較大的差別,那麼可能大家就會有疑問,似乎Redis更像一個加強版的Memcached,那麼何時使用Memcached,何時使用Redis呢?

如果簡單地比較Redis與Memcached的區別,大多數都會得到以下觀點:

1.Redis不僅僅支持簡單的k/v類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。

2.Redis支持數據的備份,即master-slave模式的數據備份。

3.Redis支持數據的持久化,可以將內存中的數據保持在磁碟中,重啟的時候可以再次載入進行使用。

(1)會話緩存(Session Cache)

最常用的一種使用Redis的情景是會話緩存(session cache)。用Redis緩存會話比其他存儲(如Memcached)的優勢在於:Redis提供持久化。當維護一個不是嚴格要求一致性的緩存時,如果用戶的購物車信息全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎?

幸運的是,隨著 Redis 這些年的改進,很容易找到怎麼恰當的使用Redis來緩存會話的文檔。甚至廣為人知的商業平台Magento也提供Redis的插件。

(2)全頁緩存(FPC)

除基本的會話token之外,Redis還提供很簡便的FPC平台。回到一致性問題,即使重啟了Redis實例,因為有磁碟的持久化,用戶也不會看到頁面載入速度的下降,這是一個極大改進,類似PHP本地FPC。

再次以Magento為例,Magento提供一個插件來使用Redis作為全頁緩存後端。

此外,對WordPress的用戶來說,Pantheon有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度載入你曾瀏覽過的頁面。

(3)隊列

Reids在內存存儲引擎領域的一大優點是提供 list 和 set 操作,這使得Redis能作為一個很好的消息隊列平台來使用。Redis作為隊列使用的操作,就類似於本地程序語言(如Python)對 list 的 push/pop 操作。

如果你快速的在Google中搜索「Redis queues」,你馬上就能找到大量的開源項目,這些項目的目的就是利用Redis創建非常好的後端工具,以滿足各種隊列需求。例如,Celery有一個後台就是使用Redis作為broker,你可以從這里去查看。

(4)排行榜/計數器

Redis在內存中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執行這些操作的時候變的非常簡單,Redis只是正好提供了這兩種數據結構。所以,我們要從排序集合中獲取到排名最靠前的10個用戶–我們稱之為「user_scores」,我們只需要像下面一樣執行即可:

當然,這是假定你是根據你用戶的分數做遞增的排序。如果你想返回用戶及用戶的分數,你需要這樣執行:

ZRANGE user_scores 0 10 WITHSCORES

Agora Games就是一個很好的例子,用Ruby實現的,它的排行榜就是使用Redis來存儲數據的,你可以在這里看到。

(5)發布/訂閱

最後(但肯定不是最不重要的)是Redis的發布/訂閱功能。發布/訂閱的使用場景確實非常多。我已看見人們在社交網路連接中使用,還可作為基於發布/訂閱的腳本觸發器,甚至用Redis的發布/訂閱功能來建立聊天系統!(不,這是真的,你可以去核實)。

『柒』 Django 4.0 正式發布,新的密碼哈希器和 Redis 緩存後端

Django 4.0 正式發布,4.0 版本支持 Python 3.8、3.9 和 3.10。隨著 Django 4.0 的發布,Django 3.2 的主流支持已經結束。此版本主要有如下亮點:

重要更新

zoneinfo 作為默認時區

Django 3.2 允許使用非 pytz 時區。Django 4.0 是 zoneinfo 作為默認時區:棄用 pytz 且將在 Django 5.0 中刪除它。zoneinfo 是 Python 3.9 標准庫的一部分,如果你在使用 Python 3.8 ,則會自動安裝 zoneinfo 包。

注意,如果你處於非 utc(世界標准時間) 時區,且在使用 pytz normalize() 和 localalize () api,那你可能設置了TIME_ZONE ,需要審查一下代碼。4.x 系列版本周期有一個過渡性的 use_depreccated_pytz 設置,允許從 pytz 慢慢過渡到 zoneinfo ,這個設置將在 Django 5.0 中刪除。

此外,zoneinfo 作者創建的 pytz_deprecation_shim 包用於幫助從 pytz 進行遷移,這個包提供 shims 來安全地移除 pytz ,還有一個詳細的遷移指南,展示如何移動到新的 zoneinfo api。漸進更新可以用 pytz_deprecation_shim和use_depreccated_pytz 這兩個過渡設置。

函數的唯一約束

UniqueConstraint() 的新 *expressions 位置參數可以在表達式和資料庫函數上創建函數式唯一約束。例如:

使用該 Meta.constraints 選項將函數唯一約束添加到模型中 。

增加 scrypt 密碼哈希器

新的 scrypt 密碼哈希器比 PBKDF2 更安全,建議使用。但它不是默認選項,因為它需要 OpenSSL 1.1 以上版本和更多的內存。

Redis 緩存後端

新的 django.core.cache.backends.redis.RedisCache 緩存後端為使用 Redis 緩存提供了內置支持。此功能 需要 redis-py 3.0.0 或更高版本。

基於模板的表單渲染

使用模板引擎渲染表單,如用於表單的 render() , get_context() template_name ,用於表單集的 五個渲染相關的屬性和方法 。

次要更新項:

django.contrib.admin

django.contrib.auth

django.contrib.gis

django.contrib.postgres

django.contrib.staticfiles

緩存

新的非同步 API: django.core.cache.backends.base.BaseCache 開始使緩存後端非同步兼容。新的非同步方法都有 a 前綴的名稱,例如 aadd() aget() aset() aget_or_set() ,或 adelete_many()

以後 a 前綴一般會用於方法的非同步變體。

CSRF

國際化

通用視圖

DeleteView 現在使用 FormMixin ,允許您提供一個 Form 子類,例如帶有確認刪除之類的復選框。

日誌

管理命令

模塊

請求和響應

信號

模板

測試 ¶

Django 4.0 是一個超大版本更新,除了上述更新以外還包含一些功能的棄用,以及不向後兼容的更新項,完整版更新內容可在 更新公告 中查看。

『捌』 我用java在後端集成了redis作為緩存,mysql資料庫記錄了經緯度的信息,

經緯度信息一般不怎麼變化,可以先放到redis中去建立索引,後面app端直接查詢緩存就可以了,比較快!

『玖』 redis主要解決什麼問題

redis是內存資料庫,訪問速度非常快,所以能夠解決的也都是這些緩存類型的問題,如下:
1、會話緩存(Session Cache)
最常用的一種使用Redis的情景是會話緩存(session cache)。用Redis緩存會話比其他存儲(如Memcached)的優勢在於:Redis提供持久化。當維護一個不是嚴格要求一致性的緩存時,如果用戶的購物車信息全部丟失,大部分人都會不高興的,現在,他們還會這樣嗎?
幸運的是,隨著 Redis 這些年的改進,很容易找到怎麼恰當的使用Redis來緩存會話的文檔。甚至廣為人知的商業平台Magento也提供Redis的插件。
2、全頁緩存(FPC)
除基本的會話token之外,Redis還提供很簡便的FPC平台。回到一致性問題,即使重啟了Redis實例,因為有磁碟的持久化,用戶也不會看到頁面載入速度的下降,這是一個極大改進,類似PHP本地FPC。
再次以Magento為例,Magento提供一個插件來使用Redis作為全頁緩存後端。
此外,對WordPress的用戶來說,Pantheon有一個非常好的插件 wp-redis,這個插件能幫助你以最快速度載入你曾瀏覽過的頁面。
3、隊列
Reids在內存存儲引擎領域的一大優點是提供 list 和 set 操作,這使得Redis能作為一個很好的消息隊列平台來使用。Redis作為隊列使用的操作,就類似於本地程序語言(如Python)對 list 的 push/pop 操作。
如果你快速的在Google中搜索「Redis queues」,你馬上就能找到大量的開源項目,這些項目的目的就是利用Redis創建非常好的後端工具,以滿足各種隊列需求。例如,Celery有一個後台就是使用Redis作為broker,你可以從這里去查看。
排行榜/計數器
Redis在內存中對數字進行遞增或遞減的操作實現的非常好。集合(Set)和有序集合(Sorted Set)也使得我們在執行這些操作的時候變的非常簡單,Redis只是正好提供了這兩種數據結構。所以,我們要從排序集合中獲取到排名最靠前的10個用戶–我們稱之為「user_scores」,我們只需要像下面一樣執行即可:
當然,這是假定你是根據你用戶的分數做遞增的排序。如果你想返回用戶及用戶的分數,你需要這樣執行:
ZRANGE user_scores 0 10 WITHSCORES
Agora Games就是一個很好的例子,用Ruby實現的,它的排行榜就是使用Redis來存儲數據的,你可以在這里看到。
5、發布/訂閱
最後(但肯定不是最不重要的)是Redis的發布/訂閱功能。發布/訂閱的使用場景確實非常多。我已看見人們在社交網路連接中使用,還可作為基於發布/訂閱的腳本觸發器,甚至用Redis的發布/訂閱功能來建立聊天系統!(不,這是真的,你可以去核實)。
Redis提供的所有特性中,我感覺這個是喜歡的人最少的一個,雖然它為用戶提供如果此多功能。
等等?

『拾』 一個網站從前端到後端有哪些可以緩存的地方

頁面、數據都可以緩存

熱點內容
商城首頁android 發布:2024-10-13 17:53:20 瀏覽:491
甲骨文雲伺服器如何申請 發布:2024-10-13 16:49:39 瀏覽:128
c語言中參數傳遞 發布:2024-10-13 16:30:15 瀏覽:77
cos伺服器搭建 發布:2024-10-13 16:17:41 瀏覽:334
象棋軟體演算法 發布:2024-10-13 15:32:35 瀏覽:899
平板怎麼看真正配置 發布:2024-10-13 14:53:32 瀏覽:33
微信存儲空間的其他 發布:2024-10-13 14:52:14 瀏覽:670
怎麼繞過系統密碼登錄密碼登錄密碼登錄 發布:2024-10-13 14:47:41 瀏覽:509
ios騰訊緩存視頻怎樣轉入本地視頻 發布:2024-10-13 14:33:12 瀏覽:829
python如何遍歷文件 發布:2024-10-13 14:28:57 瀏覽:936