java实现缓存中间件,Redis,分布式系统中不可少的缓存中间件
1.為什么要用緩存
內存在整個計算機系統來說也就是一個緩存,CPU操作內存速度很快;因為操作數據的時候,先從硬盤中取出數據放到內存中,然后CPU操作數據
緩存:提升訪問效率,將一些頻繁訪問地放在緩存里面
image.png
常見的緩存:
Ehcache:繼承在應用服務器里面內,很好集成,方便簡易;容量小
Mem cache:存儲類型很單一,就是字符串
Redis:存儲類型豐富,性能非常高,可靠性高
下面重點介紹Redis
1.Redis是一種nosql (not only sql)
有以下特性:
key value 雙列集合 map
value 支持多種多樣 :
string
hash(相當于對象)
list
set
sorttedSet
key 有過期特性,唯一的;
2.Redis具有發布訂閱功能
3.Redis具有一定的持久化的特性
2.數據類型String,分布式鎖
2.1 String的基本操作
image.png
默認是-1,即永久存儲的
設置過期時間:
image.png
如果我們這時候再set同一個key,里面的值會被覆蓋掉
2.2 setnx
setnx:只有當key不存在的時候才能設置成功,否則設置失敗
image.png
設置成功會返回1,否則為0
可以起到分布式鎖的作用
鎖的意思是,拿著鎖去操作資源,我有了這把鎖就可以把資源給鎖上,只有我才可以用,其他人只能選擇等待。
image.png
如圖:
當我們處于分布式環境下想要操作同一個資源的時候,我們可以用同一個key然后setnx。誰set成功了,誰就獲得該鎖,然后可以獲取到資源,然后進行操作。
3.Hash,list,set操作
3.1 Hash操作
如下圖所示:
hmset:可以設置一個對象,屬性:值形式
hgetall key 可以獲取key 的所有值
hget key field :獲得單個屬性的值
hset key field :設置單個屬性的值
下面是演示:
image.png
image.png
3.2 List
list的基本指令:
lpush:把一個元素壓棧;
lrange:顯示指定范圍內的所有元素;如果上限大于List長度 ,則返回所有元素
lindex:返回某一個索引的值
lpop:從棧頂移除一個元素
rpop:從棧底移除一個元素
下面是演示:
image.png
3.3 Set
sadd:添加元素;
smembers:獲取set的元素
spop:移除元素;
srem:刪除一個元素;
sinter:找出兩個集合的交集
sdiff:找出兩個集合的差集
下面是演示:
image.png
3.4 SortedSet
sortedSet可以用來做排行榜,因為每個key后面都會一定的分數,根據分數來排序
zdd:添加元素
zrange:返回所有元素,已經按分數排序
有一個可以倒序輸出的指令,因此我們如果做排行榜的話,可以將銷量作為分數,商品的名字作為member
image.png
4.Java代碼操作Redis
1.首先引入jedis的包;
2.然后根據api去操作就好了。非常簡單,和我們操作命令行差不多。詳情參考一下網上的DEMO
5.Redis發布訂閱
要有訂閱者和發布者的存在
可以起到異步解耦的作用。比如:異步發短信這些和主要邏輯功能沒關系的,可以考慮用發布訂閱這些。
讓多個系統進行通信。
這里知道有這個概念就好了。因此我們平時在開發中,Redis這個發布訂閱功能用的不多,我們有專業的各種MQ幫我們處理。
6.Redis事務
6.1Redis事務的演示
multi:開啟事務
exec:執行事務
演示:
image.png
上面演示的是成功的情況。而失敗的情況一般包含兩種
語法失敗,不會執行操作
第二種情況,語法沒有出錯,兩個的key相同,會入隊列。執行事務的時候,會把臟數據放進去;如圖:
image.png
注意:Redis不是關系型數據庫,Redis沒有回滾的概念
6.2 watch的演示
watch:監控的key,在事務無法改變key
unwatch:撤銷監控
image.png
總結:
Redis事務非常雞肋,生產上幾乎不會用,面試會問問
7.Redis持久化
有兩種方式:一種是快照,一種是AOF
7.1快照(一般不會用):持久化到磁盤
我們在redis.conf文件中可以找到對應的配置
image.png
900 1:900s以內,有一個key改變就把一個Key放磁盤里面
300 10:300s以內,有10個key發生改變,會持久化到磁盤
以此類推
優點:
會把所有的數據持久化到磁盤
缺點:
效率低,影響性能和數據的浪費
如果要禁用的話直接把save禁止掉
7.2AOF(append only file)
只是把改變的添加到某一個磁盤里面,當下次Redis啟動的時候就加載這些改動的部分
image.png
把No改為Yes就可以啟用AOF模式
AOF也有三種模式,一般我們會用第二種模式
appendfsync always:只要添加一條就放到磁盤里面,效率低(一般不用)
appendfsync everysec:每秒中有多少改變都寫到磁盤(就算Redis掛了,有些數據丟失,影響不會那么大)
appendfsync no:多久同步一次,不是我們控制的,完全依賴于操作系統,Redis(一般不用)
AOF和快照模式的比較
存儲結構:
內容是redis通訊協議(RESP )格式的命令文本存儲。
比較:
1、aof文件比rdb更新頻率高,優先使用aof還原數據。
2、aof比rdb更安全也更大
3、快照性能比aof好
4、如果兩個都配了優先加載AOF。
7.3Redis內存
Redis是一個內存數據庫
Redis的容量依賴于內存的大小
Redis可以自己設定內存大小
如果我們自己設了內存大小的話,同時要設置內存策略;
Redis默認使用的是LRU算法
LRU算法:
長時間不用的數據(key),會從Redis中刪除
8.Redis面試理論
Redis集群出現之前如果實現高可用:
主從復制,主服務器要什么改變都復制到從服務器
缺點:
數據量會非常大,每一個從服務器數據量和主服務器一樣
3.0以后Redis有了集群的解決方案。
8.1Redis Cluster分區實現原理
槽(slot)概念
Redis Cluster中有一個16384長度的槽的概念,他們的編號為0、1、2、3……16382、16383。這個槽是一個虛擬的槽,并不是真正存在的。正常工作的時候,Redis Cluster中的每個Master節點都會負責一部分的槽,當有某個key被映射到某個Master負責的槽,那么這個Master負責為這個key提供服務,至于哪個Master節點負責哪個槽,這是可以由用戶指定的,也可以在初始化的時候自動生成(redis-trib.rb腳本)。這里值得一提的是,在Redis Cluster中,只有Master才擁有槽的所有權,如果是某個Master的slave,這個slave只負責槽的使用,但是沒有所有權。
image.png
這張圖的意思是:比如我們有一個客戶端請求了某個key發現不在某個節點上,該節點會找到這個key所在的節點,然后返回給客戶端,讓客戶端重新發起請求。
8.2Redis的線程模型
image.png
image.png
Redis是單線程,單進程的程序。一個指令來了,先放進隊列里面,先進先出;為什么單線程還這么快,因為是運行在內存里面,CPU操作內存速度是非常快的
總結
以上是生活随笔為你收集整理的java实现缓存中间件,Redis,分布式系统中不可少的缓存中间件的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言求树上节点的双亲,用非递归算法求二
- 下一篇: php js下拉框与文本联动,php m