Redis is an open source (BSD licensed), in-memory data structure store, used as a database, cache and message broker. It supports data structures such as strings, hashes, lists, sets, sorted sets with range queries, bitmaps, hyperloglogs, geospatial indexes with radius queries and streams. Redis has built-in replication, Lua scripting, LRU eviction, transactions and different levels of on-disk persistence, and provides high availability via Redis Sentinel and automatic partitioning with Redis Cluster.redis
經過上面redis官網的說明能夠看出,redis是一個能夠對內存數據結構進行存儲的東西,它能夠用做數據庫、緩存和消息代理。它支持數據結構,如字符串,散列,列表,集合,帶有範圍查詢的排序集,位圖,超級日誌,具備半徑查詢和流的地理空間索引。Redis具備內置複製,Lua腳本,LRU驅逐,事務和不一樣級別的磁盤持久性,並經過Redis Sentinel提供高可用性並使用Redis Cluster自動分區。
在項目中主要用來用做數據的緩存,將數據緩存在redis中,減輕對底層數據庫的訪問壓力,得到更高的併發和更快的請求響應速度。sql
咱們知道,項目中的數據通常狀況下都是存在於數據庫當中的,並且數據庫的併發性能不是特別高,若是同時接收到大量的請求,數據庫可能就會崩掉,並且sql查詢會消耗必定的時間,增長請求的響應時間,因此不用緩存會出現系統沒法支撐大量的併發狀況,請求響應時間會變長等問題。
若是咱們在第一次訪問某個數據的時候,好比根據一個訂單id獲取訂單的詳細信息,將這條數據再返回的時候,也放到緩存裏面去,那麼下次就能夠直接在緩存裏面返回數據,沒必要去查詢數據庫,這樣就能夠減輕數據庫的訪問壓力,並且緩存在內存中,勢必要比直接訪問數據庫的速度要快不少,這樣也就減少了請求的響應時間,redis在項目中就主要使用來解決數據的緩存問題。數據庫
使用緩存的目的主要有兩個:
(1)高性能 好比說有一個很複雜的sql數據查詢,這個查詢要耗費大量的時間,若是每次都直接取數據查詢,那必然會對請求響應時間形成很大的影響,若是能在第一次查詢完畢以後,將其直接保存在緩存當中,下次查詢的時候,直接在緩存中拿走現成的數據,這樣就會大大縮短請求的響應時間。緩存
(2)高併發 咱們知道數據庫能承受的併發是有限的,那麼在流量高峯期(好比,搶購、打折、秒殺等等),會有大量的請求進入咱們的系統,好比查詢某個商品的詳情,若是咱們沒有緩衝,那麼給次查詢都要走數據庫,假如咱們的數據庫每秒只能接受2000個請求,結果一秒鐘進來了5000個請求,那麼數據庫就直接崩掉了,毫無高併發可言,而若是咱們中間具備緩存服務,那麼在第一個用戶查詢商品詳情時(或者提早將放好)咱們能夠直接將商品的詳情信息數據放到緩存裏面,這樣在後續用戶查詢時就能夠直接走緩存,不走數據庫,緩存是基於內存的,它的訪問速度快,併發高;所以就能夠提供一個高併發的支持。數據結構
主要常見的有下面三個問題
1)緩存與數據庫雙寫不一致
2)緩存雪崩
3)緩存穿透
4)緩存併發競爭併發