解決hash沖突的方法
- 線性探測法
- 平方探測法
- 偽隨機(jī)列法
- 拉鏈法
Redis和mysql數(shù)據(jù)怎么保持?jǐn)?shù)據(jù)一致的
主要是解決讀數(shù)據(jù)從Redis緩存呵俏,一旦涉及到數(shù)據(jù)更新:數(shù)據(jù)庫和緩存更新,就容易出現(xiàn)緩存(Redis)和數(shù)據(jù)庫(MySQL)間的數(shù)據(jù)一致性問題。
不管先刪數(shù)據(jù)庫還是先刪redis都會出現(xiàn)問題:
解決方案:1.采用延時雙刪策略
在寫庫前后都進(jìn)行redis.del(key)操作倦始,并且設(shè)定合理的超時時間良风。
先刪除緩存,再寫數(shù)據(jù)庫,休眠500毫秒,再次刪除緩存
- 異步更新緩存
MySQL binlog增量訂閱消費+消息隊列+增量數(shù)據(jù)更新到redis
這里說的是增量,指的是mysql的update、insert窑多、delate變更數(shù)據(jù)。(2)讀取binlog后分析 洼滚,利用消息隊列,推送更新各臺的redis緩存數(shù)據(jù)埂息。這樣一旦MySQL中產(chǎn)生了新的寫入、更新遥巴、刪除等操作千康,就可以把binlog相關(guān)的消息推送至Redis,Redis再根據(jù)binlog中的記錄铲掐,對Redis進(jìn)行更新拾弃。
kafka、rabbitMQ等來實現(xiàn)推送更新Redis!
一張自增表里面總共有 7 條數(shù)據(jù)摆霉,刪除了最后 2 條數(shù)據(jù)豪椿,重啟 MySQL 數(shù)據(jù)庫,又插入了一條數(shù)據(jù)携栋,此時 id 是幾?
一般情況下搭盾,我們創(chuàng)建的表的類型是InnoDB,如果新增一條記錄(不重啟mysql的情況下)婉支,這條記錄的id是8鸯隅;但是如果重啟(文中提到的)MySQL的話,這條記錄的ID是6向挖。因為InnoDB表只把自增主鍵的最大ID記錄到內(nèi)存中蝌以,所以重啟數(shù)據(jù)庫或者對表OPTIMIZE操作霎奢,都會使最大ID丟失。
但是饼灿,如果我們使用表的類型是MylSAM幕侠,那么這條記錄的ID就是8。因為MylSAM表會把自增主鍵的最大ID記錄到數(shù)據(jù)文件里面碍彭,重啟MYSQL后晤硕,自增主鍵的最大ID也不會丟失。
怎么確保一個集合不能被修改庇忌?
可以使用Collections.unmodifiableMap(map)定義舞箍;
或者使用 ImmutableList<Integer> guava定義
Iterator 和 ListIterator 的區(qū)別?
一.相同點
都是迭代器皆疹,當(dāng)需要對集合中元素進(jìn)行遍歷不需要干涉其遍歷過程時疏橄,這兩種迭代器都可以使用。
二.不同點
1.使用范圍不同略就,Iterator可以應(yīng)用于所有的集合捎迫,Set、List和Map和這些集合的子類型表牢。而ListIterator只能用于List及其子類型窄绒。
2.ListIterator有add方法,可以向List中添加對象崔兴,而Iterator不能彰导。
3.ListIterator和Iterator都有hasNext()和next()方法,可以實現(xiàn)順序向后遍歷敲茄,但是ListIterator有hasPrevious()和previous()方法位谋,可以實現(xiàn)逆向(順序向前)遍歷。Iterator不可以堰燎。
4.ListIterator可以定位當(dāng)前索引的位置掏父,nextIndex()和previousIndex()可以實現(xiàn)。Iterator沒有此功能爽待。
5.都可實現(xiàn)刪除操作损同,但是ListIterator可以實現(xiàn)對象的修改,set()方法可以實現(xiàn)鸟款。Iterator僅能遍歷膏燃,不能修改。
Queue 的 poll() 和 remove()
共同點:他們都是刪除一個元素何什;
不同點:如果隊列為空组哩,poll() 返回 null, 但是remove() 報 NoSuchElementException();
MySQL 執(zhí)行慢排查都有哪些手段?
- 使用 show processlist 命令查看當(dāng)前所有連接信息。
- 使用 explain 命令查詢 SQL 語句執(zhí)行計劃伶贰。
- 開啟慢查詢?nèi)罩局肱椋榭绰樵兊?SQL。
開啟慢查詢的方法有:
- 修改配置文件
[mysqld]
long_query_time=2
#5.5以前版本配置如下選項
log-slow-queries="mysql_slow_query.log"
#5.5及以上版本配置如下選項
slow-query-log=On
slow_query_log_file="mysql_slow_query.log"
log-query-not-using-indexes
第一句:定義超過多少秒的查詢算是慢查詢黍衙,這里定義的是2秒
第二句:定義慢查詢?nèi)罩镜穆窂剑ㄗ⒁馊绻?Linux 或 Mac 系統(tǒng)要考慮權(quán)限問題)
第三句:記錄下沒有使用索引的query
- 通過命令開啟慢查詢
mysql>set global slow_query_log=ON
mysql>set global long_query_time = 3600;
mysql>set global log_querise_not_using_indexes = ON;
// 寫一條慢查詢
SELECT SLEEP(10);
分析慢查詢:
MySQL 自帶了 mysqldumpslow 工具用來分析 slow query 日志
-s泥畅,表示按照何種方式排序,c琅翻、t位仁、l、r分別是按照記錄次數(shù)方椎、時間聂抢、查詢時間、返回的記錄數(shù)來排序(從大到刑闹凇)琳疏,ac、at闸拿、al空盼、ar表示相應(yīng)的倒序。
-t胸墙,是top n的意思我注,即為返回前面多少條數(shù)據(jù)。
-g迟隅,后邊可以寫一個正則匹配模式,大小寫不敏感励七。
mysqldumpslow -s c -t 10 host-slow.log
按照時間返回前10條里面含有左連接的sql語句
mysqldumpslow -s t -t 10 -g "left join" host-slow.log
jedis 和 redission 區(qū)別智袭?
- Jedis 和 Redisson 都是Java中對Redis操作的封裝。Jedis 只是簡單的封裝了 Redis 的API庫掠抬,可以看作是Redis客戶端吼野,它的方法和Redis 的命令很類似。
- Redisson 不僅封裝了 redis 两波,還封裝了對更多數(shù)據(jù)結(jié)構(gòu)的支持瞳步,以及鎖等功能,相比于Jedis 更加大腰奋。但Jedis相比于Redisson 更原生一些单起,更靈活。
redis 實現(xiàn)分布式鎖的原理和缺點
在超時時間內(nèi)獲取鎖劣坊,執(zhí)行setnx , 并設(shè)置超時時間嘀倒,否則休眠一段時間繼續(xù)請求拿鎖;
redis 實現(xiàn)分布式鎖的缺點:
- 單點故障,主從切換可能丟失鎖信息测蘑;
- 緩存易失性假如第一個線程設(shè)置了鎖灌危,但是之后觸發(fā)內(nèi)存淘汰機(jī)制很不幸淘汰了設(shè)置的鎖字段,接下來的線程在第一個線程沒有釋放鎖的情況下碳胳,也是重新設(shè)置鎖字段的勇蝙,這樣并不能保證鎖的安全性。
redis 如何進(jìn)行內(nèi)存優(yōu)化挨约?
- 優(yōu)化的key大小
- 盡可能使用Hash浅蚪,hash占用空間少;
- 選擇內(nèi)存占用和效率更好的數(shù)據(jù)結(jié)構(gòu)zipList
kafka 有幾種數(shù)據(jù)保存策略
Kafka Broker默認(rèn)的消息保留策略是:要么保留一定時間烫罩,要么保留到消息達(dá)到一定大小的字節(jié)數(shù)惜傲。
http://www.reibang.com/p/7008d2a1e320
時間和大小不論那個滿足條件,都會清空數(shù)據(jù)贝攒。