redis緩存大小
A. 常用的緩存技術
第一章 常用的緩存技術
1、常見的兩種緩存
本地緩存:不需要序列化,速度快,緩存的數量與大小受限於本機內存
分布式緩存:需要序列化,速度相較於本地緩存較慢,但是理論上緩存的數量與大小無限(因為緩存機器可以不斷擴展)
2、本地緩存
Google guava cache:當下最好用的本地緩存
Ehcache:spring默認集成的一個緩存,以spring cache的底層緩存實現類形式去操作緩存的話,非常方便,但是欠缺靈活,如果想要靈活使用,還是要單獨使用Ehcache
Oscache:最經典簡單的頁面緩存
3、分布式緩存
memcached:分布式緩存的標配
Redis:新一代的分布式緩存,有替代memcached的趨勢
3.1、memcached
經典的一致性hash演算法
基於slab的內存模型有效防止內存碎片的產生(但同時也需要估計好啟動參數,否則會浪費很多的內存)
集群中機器之間互不通信(相較於Jboss cache等集群中機器之間的相互通信的緩存,速度更快<--因為少了同步更新緩存的開銷,且更適合於大型分布式系統中使用)
使用方便(這一點是相較於Redis在構建客戶端的時候而言的,盡管redis的使用也不困難)
很專一(專做緩存,這一點也是相較於Redis而言的)
3.2、Redis
可以存儲復雜的數據結構(5種)
strings-->即簡單的key-value,就是memcached可以存儲的唯一的一種形式,接下來的四種是memcached不能直接存儲的四種格式(當然理論上可以先將下面的一些數據結構中的東西封裝成對象,然後存入memcached,但是不推薦將大對象存入memcached,因為memcached的單一value的最大存儲為1M,可能即使採用了壓縮演算法也不夠,即使夠,可能存取的效率也不高,而redis的value最大為1G)
hashs-->看做hashTable
lists-->看做LinkedList
sets-->看做hashSet,事實上底層是一個hashTable
sorted sets-->底層是一個skipList
有兩種方式可以對緩存數據進行持久化
RDB
AOF
事件調度
發布訂閱等
4、集成緩存
專指spring cache,spring cache自己繼承了ehcache作為了緩存的實現類,我們也可以使用guava cache、memcached、redis自己來實現spring cache的底層。當然,spring cache可以根據實現類來將緩存存在本地還是存在遠程機器上。
5、頁面緩存
在使用jsp的時候,我們會將一些復雜的頁面使用Oscache進行頁面緩存,使用非常簡單,就是幾個標簽的事兒;但是,現在一般的企業,前台都會使用velocity、freemaker這兩種模板引擎,本身速度就已經很快了,頁面緩存使用的也就很少了。
總結:
在實際生產中,我們通常會使用guava cache做本地緩存+redis做分布式緩存+spring cache就集成緩存(底層使用redis來實現)的形式
guava cache使用在更快的獲取緩存數據,同時緩存的數據量並不大的情況
spring cache集成緩存是為了簡單便捷的去使用緩存(以註解的方式即可),使用redis做其實現類是為了可以存更多的數據在機器上
redis緩存單獨使用是為了彌補spring cache集成緩存的不靈活
就我個人而言,如果需要使用分布式緩存,那麼首先redis是必選的,因為在實際開發中,我們會緩存各種各樣的數據類型,在使用了redis的同時,memcached就完全可以舍棄了,但是現在還有很多公司在同時使用memcached和redis兩種緩存。
B. window下配置redis 能夠緩存多少數據
Redis在分布式應用中占據著越來越重要的地位,短短的幾萬行代碼,實現了一個高性能的數據存儲服務。最近mp中心的cm8集群出現過幾次redis超時的情況,但是查看redis機器的相關內存都沒有發現內存不夠,或者內存發生交換的情況,查看redis源碼之後,發現在某些情況下redis會出現超時的狀況,相關細節如下。1. 網路。Redis的處理與網路息息相關,如果網路出現閃斷則容易發生redis超時的狀況。如果出現這種狀況首先應查看redis機器網路帶寬信息,判斷是否有閃斷情況發生。
2. 內存。redis所有的數據都放在內存里,當物理內存不夠時,linux os會使用swap內存,導致內存交換發生,這時如果有redis調用命令就會產生redis超時。這里可以通過調整/proc/sys/vm/swappiness參數,來設置物理內存使用超過多少就會進行swap。
C. 我用redis緩存了一些數據,我想查看redis緩存多KB的數據,占內存多少
1,增加內存; 2,數據分流,即分散到多個電腦上面。可以按一致性哈稀演算法分布。 3,設置緩存數據的有效期,對於不重要的數據盡量不要緩存。或緩存時間可以短一些。
D. 如何使用 Azure Redis 緩存
1.功能 Redis 是一種高級的鍵值存儲,其中,鍵可以包含數據結構,例如字元串、哈希、列表、集合和有序集合。Redis 支持針對這些數據類型的一組原子操作。 Redis 還支持設置簡單的主-從復制,具有非常快的非首先阻止同步、網路分割時自動重新連接等。 其他功能包括事務、發布/訂閱、Lua 腳本、具有有限生存時間的鍵和配置設置,使 Redis 在行為上與緩存類似。 您可以通過當今最常用編程語言使用 Redis。 Azure Redis 緩存利用 Redis 身份驗證並且還支持與 Redis 的 SSL 連接。 2.可復用黃色別墅 相比筆者之前寫的文檔: Windows Azure Cloud Service (44) 使用Azure In-Role Cache緩存(1)Co-located Role Windows Azure Cloud Service (45) 使用Azure In-Role Cache緩存(2)Dedicated Role 以上的In-Role Cache只會被部署的Cloud Service獨享的,如果新創建的其他Cloud Service Project想共享是無法實現的。 我們通過創建Azure Redis Cache以後,這個Redis Cache就是共享的,一個或者多個Azure Application就可以同時使用這個Azure Redis Cache 3.服務級別 Microsoft Azure Redis Cache分為兩個級別: (1)基本(Basic) - 單個節點。提供不同的大小。基本模式是沒有SLA的。 (2)標准(Standard) - 雙節點,主從模式。包括SLA和支持復制。提供多種大小。326電影網 (3)高級(Premium) - 企業級緩存服務。專為大規模並發設計。 Azure Redis Cache提供以下不同的服務級別: 基本(Basic,不包含SLA): 緩存名稱 緩存大小 網路性能 客戶端連接數 C0 250MB 低 256 C1 1GB 低 1000 C2 2.5GB 中等 2000 C3 6GB 中等性喜劇 5000 C4 13GB 中等 10000 C5 26GB 高 15000 C6 53GB 最高 20000 標准(Standard,支持SLA): 緩存名稱 緩存大小 網路性能 客戶端連接數 C0 250MB 低 256 C1 1GB 低 1000 C2 2.5GB 中等 2000 C3 6GB 中等 5000 C4 13GB 中等 10000 C5 26GB 高 15000 C6 53GB 最高 20000 高級(Premium): 緩存名稱 緩存大小 網路性能 客戶端連接數量 P1 6GB 中等 7500 P2 13GB 中等 15000 P3 26GB 高 30000 P4 53GB 最高 40000 326影視 4.高性能 Azure Redis 緩存幫助您的應用程序變得更具響應性(甚至在用戶負載增加時也如此),以及利用 Redis 引擎的低延遲、高吞吐量功能。此單獨的分布式緩存層允許數據層獨立擴展以便更高效地利用應用程序層中的計算資源。
E. 如何查看redis佔用內存大小
Redis常用數據類型
Redis最為常用的數據類型主要有以下五種:
String
Hash
List
Set
Sorted set
在具體描述這幾種數據類型之前,我們先通過一張圖了解下Redis內部內存管理中是如何描述這些不同數據類型的:
首先Redis內部使用一個redisObject對象來表示所有的key和value,redisObject最主要的信息如上圖所示:type代表一個value對象具體是何種數據類型,encoding是不同數據類型在redis內部的存儲方式,比如:type=string代表value存儲的是一個普通字元串,那麼對應的encoding可以是raw或者是int,如果是int則代表實際redis內部是按數值型類存儲和表示這個字元串的,當然前提是這個字元串本身可以用數值表示,比如:「123」 「456」這樣的字元串。
這里需要特殊說明一下vm欄位,只有打開了Redis的虛擬內存功能,此欄位才會真正的分配內存,該功能默認是關閉狀態的,該功能會在後面具體描述。通過上圖我們可以發現Redis使用redisObject來表示所有的key/value數據是比較浪費內存的,當然這些內存管理成本的付出主要也是為了給Redis不同數據類型提供一個統一的管理介面,實際作者也提供了多種方法幫助我們盡量節省內存使用,我們隨後會具體討論。
F. redis 一個資料庫能存多少數據
redis和mysql的區別非常大。具體如下:mysql中一個中小型的網路資料庫,比oracle和sqlserver小,
但是並發能力遠超過acess這樣的桌面資料庫。redis是一個支持網路、可基於內存亦可持久化的日誌型、key-value資料庫。可以認為redis比mysql簡化很多。mysql支持集群。現在大量的軟體使用redis作為mysql在本地的資料庫緩存,然後再適當的時候和mysql同步.
G. java怎樣配置redis佔用多大內存
Redis的配置
daemonize 如果需要在後台運行,把該項改為yes
pidfile 配置多個pid的地址,默認在/var/run/redis.pid
bind 綁定ip,設置後只接受自該ip的請求
port 監聽埠,默認為6379
timeout 設置客戶端連接時的超時時間,單位為秒
loglevel 分為4級,debug、verbose、notice、warning
logfile 配置log文件地址
databases 設置資料庫的個數,默認使用的資料庫為0
save 設置redis進行資料庫鏡像的頻率,保存快照的頻率,第一個*表示多長時間, 第三個*表示執行多少次寫操作。在一定時間內執行一定數量的寫操作時,自動保存快照。可設置多個條件。
rdbcompression 在進行鏡像備份時,是否進行壓縮
Dbfilename 鏡像備份文件的文件名
Dir 資料庫鏡像備份的文件放置路徑
Slaveof 設置資料庫為其他資料庫的從資料庫
Masterauth 主資料庫連接需要的密碼驗證
Requirepass 設置登錄時需要使用的密碼
Maxclients 限制同時連接的客戶數量
Maxmemory 設置redis能夠使用的最大內存
Appendonly 開啟append only模式
appendfsync 設置對appendonly.aof文件同步的頻率
vm-enabled 是否虛擬內存的支持
vm-swap-file 設置虛擬內存的交換文件路徑
vm-max-memory 設置redis使用的最大物理內存大小
vm-page-size 設置虛擬內存的頁大小
vm-pages 設置交換文件的總page數量
vm-max-threads 設置VMIO同時使用的線程數量
glueoutputbuf 把小的輸出緩存存放在一起
hash-max-zipmap-entries 設置hash的臨界值
activerehashing 重新has
H. redis存儲對象大小2m
Redis 存儲字元串和對象
1 測試類
import redis.clients.RedisClinet;
import redis.clients.SerializeUtil;
import redis.clients.jedis.Jedis;
public class Test {
/**
* Administrator
* @param args
*/
public static void main(String[] args) {
// 操作單獨的文本串
Jedis redis= new Jedis( "10.2.31.38", 6379);
redis.set( "key", "value");
System. out.println(redis.get( "key"));
System. out.println(redis.del( "key"));
// 操作實體類對象
Goods good= new Goods(); // 這個Goods實體我就不寫了啊
good.setName( "洗衣機" );
good.setNum(400);
good.setPrice(19l);
redis.set( "good".getBytes(), SerializeUtil. serialize(good));
byte[] value = redis.get( "good".getBytes());
Object object = SerializeUtil. unserialize(value);
if(object!= null){
Goods goods=(Goods) object;
System. out.println(goods.getName());
System. out.println(goods.getNum());
System. out.println(goods.getPrice());
}
System. out.println(redis.del( "good".getBytes()));
// 操作實體類對象2(實際上和上面是一樣的)
String key= "goods-key";
Goods g= new Goods();
g.setName( "電風扇--d" );
g.setNum(200);
String temp=RedisClinet. getInstance().set(g, key);
System. out.println(temp);
Object o=RedisClinet. getInstance().get(key);
if(o!= null)
{
Goods g1=(Goods)o;
System. out.println(g1.getName());
System. out.println(g1.getNum());
}
System. out.println(RedisClinet. getInstance().del(key));
}
}
2 RedisClinet 客戶端類
package redis.clients;
import redis.clients.jedis.Jedis;
/**
*
* @author ajun
*
*/
public class RedisClinet {
private static final String ip= "10.2.31.38";
private static final int port=6379;
protected static RedisClinet redis = new RedisClinet ();
protected static Jedis jedis = new Jedis( ip, port);;
static {
}
protected RedisClinet(){
System. out.println( " init Redis ");
}
public static RedisClinet getInstance()
{
return redis;
}
/**set Object*/
public String set(Object object,String key)
{
return jedis.set(key.getBytes(), SerializeUtil.serialize(object));
}
/**get Object*/
public Object get(String key)
{
byte[] value = jedis.get(key.getBytes());
return SerializeUtil. unserialize(value);
}
/**delete a key**/
public boolean del(String key)
{
return jedis.del(key.getBytes())>0;
}
}
3 序列化工具類
/**
*
*/
package redis.clients;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
/**
* @author Administrator
*
*/
public class SerializeUtil {
public static byte[] serialize(Object object) {
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
try {
// 序列化
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
byte[] bytes = baos.toByteArray();
return bytes;
} catch (Exception e) {
}
return null;
}
public static Object unserialize( byte[] bytes) {
ByteArrayInputStream s = null;
try {
// 反序列化
s = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(s);
return ois.readObject();
} catch (Exception e) {
}
return null;
}
}
I. redis 緩存的單個最大文件是多少
本地緩存可以減少網路io的開銷,如果對性能要求極高可以考慮使用。
如果redis本身就可以滿足要求了,那麼就沒必要使用。
使用就要考慮不同機器數據不一致的問題。