# 知識點
Memcached是一個自由開源的、高性能、分布式內存對象存儲系統。本質上,它是一個簡潔的key-value存儲系統。
Libevent是一個用c語言編寫的輕量級的開源高性能事件通知庫。事件驅動。高性能輕量級。專注于網絡。
Memcached本身不提供分布式解決方案。分步式是由客戶端實現的。
Redis 與其他 key - value 緩存產品有以下三個特點:(持多備-吃多唄)
Redis支持數據的持久化,可以將內存中的數據保存在磁盤中,重啟的時候可以再次加載進行使用。
Redis不僅僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。(Zset就是有序集合,除了集合的特性外還對每一個集合元素添加了一個順序的屬性。)
Redis支持數據的備份,即master-slave模式的數據備份。
Redis 優勢(高多原富-搞多元富了)
性能極高 – Redis能讀的速度是110k次/s,寫的速度是81k次/s 。
豐富的數據類型 – Redis支持二進制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數據類型操作。
原子 – Redis的所有操作都是原子性的,意思就是要么成功執行要么失敗完全不執行。單個操作是原子性的。多個操作也支持事務,即原子性,通過MULTI和EXEC指令包起來。
豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。
Linux yum install ***
Ubuntu sudo apt-get install ***
Redis支持五種數據類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。string類型是二進制安全的。意思是redis的string可以包含任何數據。比如jpg圖片或者序列化的對象 。因為有了對字符串長度定義len, 所以在處理字符串時候不會以零值字節(\0)為字符串結尾標志。二進制安全就是輸入任何字節都能正確處理, 即使包含零值字節。Redis 在 2.8.9 版本添加了 HyperLogLog 結構。Redis HyperLogLog 是用來做基數統計的算法,HyperLogLog 的優點是,在輸入元素的數量或者體積非常非常大時,計算基數所需的空間總是固定的、并且是很小的。
減少上下文切換的方法,有無鎖并發編程,CAS算法,使用最少線程,使用協程。
volatile:java語言允許線程訪問共享變量,為了確保共享變量能夠被準確和一致的更新,線程應該確保通過排他鎖,單獨獲得這個變量。
java內存模型(JMM):JMM定義了線程和主內存之間的抽象關系,線程之間的共享變量存儲在主內存中,每個線程都有一個私有的本地內存,本地內存中存儲了該線程已讀/寫共享變量的副本。本地內存是JMM的一個抽象概念,并不真實存在,它涵蓋了緩存,寫緩沖區,寄存器以及其他的硬件和編譯器優化。
從java源代碼到最終實際執行的指令序列會經歷編譯器優化重排,指令級并行重排,內存系統重排。(編指內-編制內)
順序一致性內存模型是一個理論參考模型,JMM和處理器內存模型在設計時,通常會以順序一致性內存模型為參照。可以把常見處理器的內存模型劃分為以下幾種,TSO,PSO,RMO和Power PC。
java通過Executors提供四種線程池,分別是newCachedThreadPool創建一個可緩存線程池,如果線程池長度超過處理需要,可靈活回收空閑線程,若無可回收,則新建線程。newFixedThreadPool,創建一個定長線程池,可控制線程最大并發數,超出的線程會在隊列中等待。newScheduledThreadPool創建一個定長線程池,支持定時及周期性任務執行。newSingleThreadExecutor創建一個單線程化的線程池,他只會用唯一的工作線程來執行任務,保證所有任務按照指定順序優先級執行。(緩定調單)
ThreadLocal-線程局部變量,為每一個使用該變量的線程都提供一個變量的副本,是java中一種較為特殊的線程綁定機制,是每一個線程都可以獨立地改變自己的副本,而不會和其他線程的副本沖突。
Redis集群采用哈希槽進行數據的分配,默認分配了16384個哈希槽。當我們set的一個key,會使用crc16算法來取模得到所屬的哈希槽,然后將這個可以分配到對應的哈希槽節點上,具體算法就是csc16(key)%16384。
spring boot習慣優于配置。
map映射reduce歸約。MR是一種編程模型,用于大規模數據集的并行運算。
spring cloud為開發人員提供了快速構建分布式系統中的一些常見模式的工具,例如配置管理,服務發現,斷路器,智能路由,微代理,控制總線。云原生是一種應用開發風格,鼓勵在持續交付和價值驅動開發領域輕松采用最佳實踐。
Java虛擬機所管理的內存將會包含以下幾個運行時數據區:方法區,虛擬機棧,本地方法棧,堆,程序計數器。程序計數器是一塊較小的內存空間,是當前線程所執行的字節碼的行號指示器。java虛擬機棧描述的是java方法執行的內存模型,每個方法在執行的同時,都會創建一個棧幀,用于存儲局部變量表,操作數棧,動態鏈接,方法出入口等信息。本地方法棧為虛擬機使用的native方法服務。java堆是java虛擬機所管理的內存中最大的一塊,此區域唯一的目的就是存放對象實例。方法區與java堆一樣,是各個線程共享的內存區域,它用于存儲已被虛擬機加載的類信息,常量,靜態變量,即時編譯器編譯后的代碼等數據。運行時常量池是方法區的一部分。直接內存并不是虛擬機運行時數據區的一部分,也不是java虛擬機規范中定義的內存區域。