面試-Redis

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

  • 基於內存運行,性能高效
  • 支持分佈式,理論上能夠無限擴展
  • key-value存儲系統
  • 開源的使用ANSI C語言編寫、遵照BSD協議、支持網絡、可基於內存亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API

Redis 使用場景:web

  • 數據高併發的讀寫
  • 海量數據的讀寫
  • 對擴展性要求高的數據

Redis 的應用場景包括:緩存系統(「熱點」數據:高頻讀、低頻寫)、計數器、消息隊列系統、排行榜、社交網絡和實時系統。 redis

180. redis 有哪些功能?數據庫

  • 數據緩存功能
  • 分佈式鎖的功能
  • 支持數據持久化
  • 支持事務
  • 支持消息隊列

181. redis 和 memecache 有什麼區別?緩存

  • memcached全部的值均是簡單的字符串,redis做爲其替代者,支持更爲豐富的數據類型
  • redis的速度比memcached快不少
  • redis能夠持久化其數據

182. redis 爲何是單線程的?安全

由於 cpu 不是 Redis 的瓶頸,Redis 的瓶頸最有多是機器內存或者網絡帶寬。既然單線程容易實現,並且 cpu 又不會成爲瓶頸,那就瓜熟蒂落地採用單線程的方案了。服務器

關於 Redis 的性能,官方網站也有,普通筆記本輕鬆處理每秒幾十萬的請求。網絡

並且單線程並不表明就慢 nginx 和 nodejs 也都是高性能單線程的表明。

183. 什麼是緩存穿透?怎麼解決?

緩存穿透:**指查詢一個必定不存在的數據
致使這個不存在的數據每次請求都要到數據庫去查詢,因爲緩存是不命中時須要從數據庫查詢,查不到數據則不寫入緩存,這將指查詢一個必定不存在的數據
致使這個不存在的數據每次請求都要到數據庫去查詢**,形成緩存穿透。

解決方案:最簡單粗暴的方法若是一個查詢返回的數據爲空(不論是數據不存在,仍是系統故障),咱們就把這個空結果進行緩存,但它的過時時間會很短,最長不超過五分鐘。

184. redis 支持的數據類型有哪些?

Redis提供的數據類型主要分爲5種自有類型和一種自定義類型,這5種自有類型包括:
String類型、Hash哈希類型、List列表類型、Set集合類型和ZSet順序集合類型。

String類型:

它是一個二進制安全的字符串,意味着它不只可以存儲字符串、還能存儲圖片、視頻等多種類型, 最大長度支持512M。

對每種數據類型,Redis都提供了豐富的操做命令,如:

  • GET/MGET
  • SET/SETEX/MSET/MSETNX
  • INCR/DECR
  • GETSET
  • DEL

哈希類型:

該類型是由field和關聯的value組成的map。其中,field和value都是字符串類型的。

Hash的操做命令以下:

  • HGET/HMGET/HGETALL
  • HSET/HMSET/HSETNX
  • HEXISTS/HLEN
  • HKEYS/HDEL
  • HVALS

列表類型:

該類型是一個插入順序排序的字符串元素集合, 基於雙鏈表實現。

List的操做命令以下:

  • LPUSH/LPUSHX/LPOP/RPUSH/RPUSHX/RPOP/LINSERT/LSET
  • LINDEX/LRANGE
  • LLEN/LTRIM

集合類型:

Set類型是一種無順序集合, 它和List類型最大的區別是:集合中的元素沒有順序, 且元素是惟一的。

Set類型的底層是經過哈希表實現的,其操做命令爲:

  • SADD/SPOP/SMOVE/SCARD
  • SINTER/SDIFF/SDIFFSTORE/SUNION

Set類型主要應用於:在某些場景,如社交場景中,經過交集、並集和差集運算,經過Set類型能夠很是方便地查找共同好友、共同關注和共同偏好等社交關係。

順序集合類型:

ZSet是一種有序集合類型,每一個元素都會關聯一個double類型的分數權值,經過這個權值來爲集合中的成員進行從小到大的排序。與Set類型同樣,其底層也是經過哈希表實現的。

ZSet命令:

  • ZADD/ZPOP/ZMOVE/ZCARD/ZCOUNT
  • ZINTER/ZDIFF/ZDIFFSTORE/ZUNION

185. redis 支持的 java 客戶端都有哪些?

Redisson、Jedis、lettuce等等,官方推薦使用Redisson。

186. jedis 和 redisson 有哪些區別?

Jedis是Redis的Java實現的客戶端,其API提供了比較全面的Redis命令的支持。

Redisson實現了分佈式和可擴展的Java數據結構,和Jedis相比,功能較爲簡單,不支持字符串操做,不支持排序、事務、管道、分區等Redis特性。Redisson的宗旨是促進使用者對Redis的關注分離,從而讓使用者可以將精力更集中地放在處理業務邏輯上。

187. 怎麼保證緩存和數據庫數據的一致性?

  • 合理設置緩存的過時時間。
  • 新增、更改、刪除數據庫操做時同步更新 Redis,可使用事物機制來保證數據的一致性。

188. redis 持久化有幾種方式?

Redis 的持久化有兩種方式,或者說有兩種策略:

  • RDB(Redis Database):指定的時間間隔能對你的數據進行快照存儲。
  • AOF(Append Only File):每個收到的寫命令都經過write函數追加到文件中。

189. redis 怎麼實現分佈式鎖?

Redis 分佈式鎖其實就是在系統裏面佔一個「坑」,其餘程序也要佔「坑」的時候,佔用成功了就能夠繼續執行,失敗了就只能放棄或稍後重試。

佔坑通常使用 setnx(set if not exists)指令,只容許被一個程序佔有,使用完調用 del 釋放鎖。

190. redis 分佈式鎖有什麼缺陷?

Redis 分佈式鎖不能解決超時的問題,分佈式鎖有一個超時時間,程序的執行若是超出了鎖的超時時間就會出現問題。

191. redis 如何作內存優化?

儘量使用散列表(hashes),散列表(是說散列表裏面存儲的數少)使用的內存很是小,因此你應該儘量的將你的數據模型抽象到一個散列表裏面。

好比你的web系統中有一個用戶對象,不要爲這個用戶的名稱,姓氏,郵箱,密碼設置單獨的key,而是應該把這個用戶的全部信息存儲到一張散列表裏面。

192. redis 淘汰策略有哪些?

  • volatile-lru:從已設置過時時間的數據集(server. db[i]. expires)中挑選最近最少使用的數據淘汰。
  • volatile-ttl:從已設置過時時間的數據集(server. db[i]. expires)中挑選將要過時的數據淘汰。
  • volatile-random:從已設置過時時間的數據集(server. db[i]. expires)中任意選擇數據淘汰。
  • allkeys-lru:從數據集(server. db[i]. dict)中挑選最近最少使用的數據淘汰。
  • allkeys-random:從數據集(server. db[i]. dict)中任意選擇數據淘汰。
  • no-enviction(驅逐):禁止驅逐數據。

193. redis 常見的性能問題有哪些?該如何解決?

  • 主服務器寫內存快照,會阻塞主線程的工做,當快照比較大時對性能影響是很是大的,會間斷性暫停服務,因此主服務器最好不要寫內存快照。
  • Redis 主從複製的性能問題,爲了主從複製的速度和鏈接的穩定性,主從庫最好在同一個局域網內。
相關文章
相關標籤/搜索