179.redis 是什么?都有哪些使用場景棵帽?
Redis是一個開源的使用ANSI C語言編寫熄求、支持網(wǎng)絡、可基于內(nèi)存亦可持久化的日志型逗概、Key-Value數(shù)據(jù)庫弟晚,并提供多種語言的API。
Redis 使用場景:
- 數(shù)據(jù)高并發(fā)的讀寫
- 海量數(shù)據(jù)的讀寫
- 對擴展性要求高的數(shù)據(jù)
180. redis 有哪些功能?
- 數(shù)據(jù)緩存功能
- 分布式鎖的功能
- 支持數(shù)據(jù)持久化
- 支持事務
- 支持消息隊列
181. redis 和 memecache 有什么區(qū)別卿城?
- memcached所有的值均是簡單的字符串淑履,redis作為其替代者,支持更為豐富的數(shù)據(jù)類型
- redis的速度比memcached快很多
- redis可以持久化其數(shù)據(jù)
182. redis 為什么是單線程的藻雪?
因為 cpu 不是 Redis 的瓶頸秘噪,Redis 的瓶頸最有可能是機器內(nèi)存或者網(wǎng)絡帶寬。既然單線程容易實現(xiàn)勉耀,而且 cpu 又不會成為瓶頸指煎,那就順理成章地采用單線程的方案了。
關于 Redis 的性能便斥,官方網(wǎng)站也有至壤,普通筆記本輕松處理每秒幾十萬的請求。
而且單線程并不代表就慢 nginx 和 nodejs 也都是高性能單線程的代表枢纠。
183. 什么是緩存穿透像街?怎么解決?
緩存穿透:指查詢一個一定不存在的數(shù)據(jù)晋渺,由于緩存是不命中時需要從數(shù)據(jù)庫查詢镰绎,查不到數(shù)據(jù)則不寫入緩存,這將導致這個不存在的數(shù)據(jù)每次請求都要到數(shù)據(jù)庫去查詢木西,造成緩存穿透畴栖。
解決方案:最簡單粗暴的方法如果一個查詢返回的數(shù)據(jù)為空(不管是數(shù)據(jù)不存在,還是系統(tǒng)故障)八千,我們就把這個空結果進行緩存吗讶,但它的過期時間會很短,最長不超過五分鐘恋捆。
184. redis 支持的數(shù)據(jù)類型有哪些照皆?
string、list沸停、hash膜毁、set、zset星立。
185. redis 支持的 java 客戶端都有哪些爽茴?
Redisson葬凳、Jedis绰垂、lettuce等等,官方推薦使用Redisson火焰。
186. jedis 和 redisson 有哪些區(qū)別劲装?
- Jedis是Redis的Java實現(xiàn)的客戶端,其API提供了比較全面的Redis命令的支持。
- Redisson實現(xiàn)了分布式和可擴展的Java數(shù)據(jù)結構占业,和Jedis相比绒怨,功能較為簡單,不支持字符串操作谦疾,不支持排序南蹂、事務、管道念恍、分區(qū)等Redis特性六剥。Redisson的宗旨是促進使用者對Redis的關注分離,從而讓使用者能夠將精力更集中地放在處理業(yè)務邏輯上峰伙。
187. 怎么保證緩存和數(shù)據(jù)庫數(shù)據(jù)的一致性疗疟?
合理設置緩存的過期時間。
新增瞳氓、更改策彤、刪除數(shù)據(jù)庫操作時同步更新 Redis,可以使用事物機制來保證數(shù)據(jù)的一致性匣摘。
188. redis 持久化有幾種方式店诗?
Redis 的持久化有兩種方式,或者說有兩種策略:
- RDB(Redis Database):指定的時間間隔能對你的數(shù)據(jù)進行快照存儲音榜。
- AOF(Append Only File):每一個收到的寫命令都通過write函數(shù)追加到文件中必搞。
189. redis 怎么實現(xiàn)分布式鎖?
Redis 分布式鎖其實就是在系統(tǒng)里面占一個“坑”囊咏,其他程序也要占“坑”的時候恕洲,占用成功了就可以繼續(xù)執(zhí)行,失敗了就只能放棄或稍后重試梅割。
占坑一般使用 setnx(set if not exists)指令霜第,只允許被一個程序占有,使用完調用 del 釋放鎖户辞。
190. redis 分布式鎖有什么缺陷泌类?
Redis 分布式鎖不能解決超時的問題,分布式鎖有一個超時時間底燎,程序的執(zhí)行如果超出了鎖的超時時間就會出現(xiàn)問題刃榨。
191. redis 如何做內(nèi)存優(yōu)化?
盡可能使用散列表(hashes)双仍,散列表(是說散列表里面存儲的數(shù)少)使用的內(nèi)存非常小枢希,所以你應該盡可能的將你的數(shù)據(jù)模型抽象到一個散列表里面。
比如你的web系統(tǒng)中有一個用戶對象朱沃,不要為這個用戶的名稱苞轿,姓氏茅诱,郵箱,密碼設置單獨的key,而是應該把這個用戶的所有信息存儲到一張散列表里面搬卒。
192. redis 淘汰策略有哪些瑟俭?
volatile-lru:從已設置過期時間的數(shù)據(jù)集(server. db[i]. expires)中挑選最近最少使用的數(shù)據(jù)淘汰。
volatile-ttl:從已設置過期時間的數(shù)據(jù)集(server. db[i]. expires)中挑選將要過期的數(shù)據(jù)淘汰契邀。
volatile-random:從已設置過期時間的數(shù)據(jù)集(server. db[i]. expires)中任意選擇數(shù)據(jù)淘汰摆寄。
allkeys-lru:從數(shù)據(jù)集(server. db[i]. dict)中挑選最近最少使用的數(shù)據(jù)淘汰。
allkeys-random:從數(shù)據(jù)集(server. db[i]. dict)中任意選擇數(shù)據(jù)淘汰坯门。
no-enviction(驅逐):禁止驅逐數(shù)據(jù)椭迎。
193. redis 常見的性能問題有哪些?該如何解決田盈?
主服務器寫內(nèi)存快照畜号,會阻塞主線程的工作,當快照比較大時對性能影響是非常大的允瞧,會間斷性暫停服務简软,所以主服務器最好不要寫內(nèi)存快照。
Redis 主從復制的性能問題述暂,為了主從復制的速度和連接的穩(wěn)定性痹升,主從庫最好在同一個局域網(wǎng)內(nèi)。