179. redis 是什麼?都有哪些使用場景? 180. redis 有哪些功能? 181. redis 和 memecache 有什麼區別? 182. redis 爲何是單線程的? 183. 什麼是緩存穿透?怎麼解決? 184. redis 支持的數據類型有哪些? 185. redis 支持的 java 客戶端都有哪些? 186. jedis 和 redisson 有哪些區別? 187. 怎麼保證緩存和數據庫數據的一致性? 188. redis 持久化有幾種方式? 189. redis 怎麼實現分佈式鎖? 190. redis 分佈式鎖有什麼缺陷? 191. redis 如何作內存優化? 192. redis 淘汰策略有哪些? 193. redis 常見的性能問題有哪些?該如何解決?
Redisjava
179. redis 是什麼?都有哪些使用場景?node
Redis是如今最受歡迎的NoSQL數據庫之一
Redis是一個使用ANSI C編寫的開源、包含多種數據結構、支持網絡、基於內存、可選持久性的鍵值對存儲數據庫,其具有以下特性:nginx
Redis 使用場景:web
Redis 的應用場景包括:緩存系統(「熱點」數據:高頻讀、低頻寫)、計數器、消息隊列系統、排行榜、社交網絡和實時系統。 redis
180. redis 有哪些功能?數據庫
181. redis 和 memecache 有什麼區別?緩存
182. redis 爲何是單線程的?安全
由於 cpu 不是 Redis 的瓶頸,Redis 的瓶頸最有多是機器內存或者網絡帶寬。既然單線程容易實現,並且 cpu 又不會成爲瓶頸,那就瓜熟蒂落地採用單線程的方案了。服務器
關於 Redis 的性能,官方網站也有,普通筆記本輕鬆處理每秒幾十萬的請求。網絡
並且單線程並不表明就慢 nginx 和 nodejs 也都是高性能單線程的表明。
183. 什麼是緩存穿透?怎麼解決?
緩存穿透:**指查詢一個必定不存在的數據
致使這個不存在的數據每次請求都要到數據庫去查詢,因爲緩存是不命中時須要從數據庫查詢,查不到數據則不寫入緩存,這將指查詢一個必定不存在的數據
致使這個不存在的數據每次請求都要到數據庫去查詢**,形成緩存穿透。
解決方案:最簡單粗暴的方法若是一個查詢返回的數據爲空(不論是數據不存在,仍是系統故障),咱們就把這個空結果進行緩存,但它的過時時間會很短,最長不超過五分鐘。
184. redis 支持的數據類型有哪些?
Redis提供的數據類型主要分爲5種自有類型和一種自定義類型,這5種自有類型包括:
String類型、Hash哈希類型、List列表類型、Set集合類型和ZSet順序集合類型。
String類型:
它是一個二進制安全的字符串,意味着它不只可以存儲字符串、還能存儲圖片、視頻等多種類型, 最大長度支持512M。
對每種數據類型,Redis都提供了豐富的操做命令,如:
哈希類型:
該類型是由field和關聯的value組成的map。其中,field和value都是字符串類型的。
Hash的操做命令以下:
列表類型:
該類型是一個插入順序排序的字符串元素集合, 基於雙鏈表實現。
List的操做命令以下:
集合類型:
Set類型是一種無順序集合, 它和List類型最大的區別是:集合中的元素沒有順序, 且元素是惟一的。
Set類型的底層是經過哈希表實現的,其操做命令爲:
Set類型主要應用於:在某些場景,如社交場景中,經過交集、並集和差集運算,經過Set類型能夠很是方便地查找共同好友、共同關注和共同偏好等社交關係。
順序集合類型:
ZSet是一種有序集合類型,每一個元素都會關聯一個double類型的分數權值,經過這個權值來爲集合中的成員進行從小到大的排序。與Set類型同樣,其底層也是經過哈希表實現的。
ZSet命令:
185. redis 支持的 java 客戶端都有哪些?
Redisson、Jedis、lettuce等等,官方推薦使用Redisson。
186. jedis 和 redisson 有哪些區別?
Jedis是Redis的Java實現的客戶端,其API提供了比較全面的Redis命令的支持。
Redisson實現了分佈式和可擴展的Java數據結構,和Jedis相比,功能較爲簡單,不支持字符串操做,不支持排序、事務、管道、分區等Redis特性。Redisson的宗旨是促進使用者對Redis的關注分離,從而讓使用者可以將精力更集中地放在處理業務邏輯上。
187. 怎麼保證緩存和數據庫數據的一致性?
188. redis 持久化有幾種方式?
Redis 的持久化有兩種方式,或者說有兩種策略:
189. redis 怎麼實現分佈式鎖?
Redis 分佈式鎖其實就是在系統裏面佔一個「坑」,其餘程序也要佔「坑」的時候,佔用成功了就能夠繼續執行,失敗了就只能放棄或稍後重試。
佔坑通常使用 setnx(set if not exists)指令,只容許被一個程序佔有,使用完調用 del 釋放鎖。
190. redis 分佈式鎖有什麼缺陷?
Redis 分佈式鎖不能解決超時的問題,分佈式鎖有一個超時時間,程序的執行若是超出了鎖的超時時間就會出現問題。
191. redis 如何作內存優化?
儘量使用散列表(hashes),散列表(是說散列表裏面存儲的數少)使用的內存很是小,因此你應該儘量的將你的數據模型抽象到一個散列表裏面。
好比你的web系統中有一個用戶對象,不要爲這個用戶的名稱,姓氏,郵箱,密碼設置單獨的key,而是應該把這個用戶的全部信息存儲到一張散列表裏面。
192. redis 淘汰策略有哪些?
193. redis 常見的性能問題有哪些?該如何解決?