redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。
一般用緩存對象時,通過序列化存儲,在實體類新加字段的時候,反序列化成對象是新加字段會為空,這個問題很容易被忽略,如果自己沒有做好處理,上線會有大量的空指針異常,為解決這個問題,我們對做了一些對redis的key做了處理。
eg.我們給一個活動配置加了緩存。
class Activity{
String name;//名稱
Boolean limit1;//參與活動限制1
Boolean limit2;//參與活動限制1
...
}
if(limit1){
//符合條件。。
}
redis key ;ACTIVITY_KEY expire time:1hour
如果我們現在已經在正式環境上運行一段時間表現良好,現在我們加了一個限制limit3;
獲取到緩存中Activity的limit3是null的,
if(limit3){//throw NullPointExecption
//符合條件。。
}
項目中可能類似的地方會比較多我的處理辦法是key+version(Activity.class);
private static int version(Class clazz){
return clazz.getDeclaredFields().length;
}
通過標記class中所有field的數量加入緩存,在添加實體類中的屬性時更新後會自動將redis的key替換掉,從而達到避免空指針的問題