缓存穿透的意义? 什么是缓存穿透?有哪些解决办法?

\u4ec0\u4e48\u662f\u7f13\u5b58\u7a7f\u900f\uff1f

\u7f13\u5b58\u7a7f\u900f\u7684\u6982\u5ff5\u5f88\u7b80\u5355\uff0c\u7528\u6237\u60f3\u8981\u67e5\u8be2\u4e00\u4e2a\u6570\u636e\uff0c\u53d1\u73b0redis\u5185\u5b58\u6570\u636e\u5e93\u6ca1\u6709\uff0c\u4e5f\u5c31\u662f\u7f13\u5b58\u6ca1\u6709\u547d\u4e2d\uff0c\u4e8e\u662f\u5411\u6301\u4e45\u5c42\u6570\u636e\u5e93\u67e5\u8be2\u3002

\u53d1\u73b0\u4e5f\u6ca1\u6709\uff0c\u4e8e\u662f\u672c\u6b21\u67e5\u8be2\u5931\u8d25\u3002\u5f53\u7528\u6237\u5f88\u591a\u7684\u65f6\u5019\uff0c\u7f13\u5b58\u90fd\u6ca1\u6709\u547d\u4e2d\uff0c\u4e8e\u662f\u90fd\u53bb\u8bf7\u6c42\u4e86\u6301\u4e45\u5c42\u6570\u636e\u5e93\u3002

\u8fd9\u4f1a\u7ed9\u6301\u4e45\u5c42\u6570\u636e\u5e93\u9020\u6210\u5f88\u5927\u7684\u538b\u529b\uff0c\u8fd9\u65f6\u5019\u5c31\u76f8\u5f53\u4e8e\u51fa\u73b0\u4e86\u7f13\u5b58\u7a7f\u900f\u3002


\u89e3\u51b3\u65b9\u6848
1\u3001\u5bf9\u8bf7\u6c42\u53c2\u6570\u505a\u6821\u9a8c\uff0c\u4f8b\u5982\u53ef\u4ee5\u7528\u6b63\u5219\uff1b

2\u3001\u7f13\u5b58\u7a7a\u5bf9\u8c61, \u5f53\u5b58\u50a8\u5c42\u4e0d\u547d\u4e2d\u540e\uff0c\u5373\u4f7f\u8fd4\u56de\u7684\u7a7a\u5bf9\u8c61\u4e5f\u5c06\u5176\u7f13\u5b58\u8d77\u6765\uff0c\u540c\u65f6\u4f1a\u8bbe\u7f6e\u4e00\u4e2a\u8fc7\u671f\u65f6\u95f4\uff0c\u4e4b\u540e\u518d\u8bbf\u95ee\u8fd9\u4e2a\u6570\u636e\u5c06\u4f1a\u4ece\u7f13\u5b58\u4e2d\u83b7\u53d6\uff0c\u4fdd\u62a4\u4e86\u540e\u7aef\u6570\u636e\u6e90\uff1b

\u4f46\u662f\u8fd9\u79cd\u65b9\u6cd5\u4f1a\u5b58\u5728\u4e24\u4e2a\u95ee\u9898\uff1a

2.1\u3001 \u5982\u679c\u7a7a\u503c\u80fd\u591f\u88ab\u7f13\u5b58\u8d77\u6765\uff0c\u8fd9\u5c31\u610f\u5473\u7740\u7f13\u5b58\u9700\u8981\u66f4\u591a\u7684\u7a7a\u95f4\u5b58\u50a8\u66f4\u591a\u7684\u952e\uff0c\u56e0\u4e3a\u8fd9\u5f53\u4e2d\u53ef\u80fd\u4f1a\u6709\u5f88\u591a\u7684\u7a7a\u503c\u7684\u952e\uff1b

2.2\u3001\u5373\u4f7f\u5bf9\u7a7a\u503c\u8bbe\u7f6e\u4e86\u8fc7\u671f\u65f6\u95f4\uff0c\u8fd8\u662f\u4f1a\u5b58\u5728\u7f13\u5b58\u5c42\u548c\u5b58\u50a8\u5c42\u7684\u6570\u636e\u4f1a\u6709\u4e00\u6bb5\u65f6\u95f4\u7a97\u53e3\u7684\u4e0d\u4e00\u81f4\uff0c\u8fd9\u5bf9\u4e8e\u9700\u8981\u4fdd\u6301\u4e00\u81f4\u6027\u7684\u4e1a\u52a1\u4f1a\u6709\u5f71\u54cd\u3002

\u7f13\u5b58\u7a7f\u900f\uff1a\u6307\u67e5\u8be2\u4e00\u4e2a\u4e0d\u5b58\u5728\u7684\u6570\u636e\uff0c\u7531\u4e8e\u7f13\u5b58\u662f\u4e0d\u547d\u4e2d\u65f6\u9700\u8981\u4ece\u6570\u636e\u5e93\u67e5\u8be2\uff0c\u67e5\u4e0d\u5230\u6570\u636e\u5219\u4e0d\u5199\u5165\u7f13\u5b58\uff0c\u8fd9\u5c06\u5bfc\u81f4\u8fd9\u4e2a\u4e0d\u5b58\u5728\u7684\u6570\u636e\u6bcf\u6b21\u8bf7\u6c42\u90fd\u8981\u5230\u6570\u636e\u5e93\u53bb\u67e5\u8be2\uff0c\u9020\u6210\u7f13\u5b58\u7a7f\u900f\u3002
\u89e3\u51b3\u65b9\u6848\uff1a\u6700\u7b80\u5355\u7684\u65b9\u6cd5\u662f\u5982\u679c\u4e00\u4e2a\u67e5\u8be2\u8fd4\u56de\u7684\u6570\u636e\u4e3a\u7a7a\uff08\u4e0d\u7ba1\u662f\u6570\u636e\u4e0d\u5b58\u5728\uff0c\u8fd8\u662f\u7cfb\u7edf\u6545\u969c\uff09\uff0c\u6211\u4eec\u5c31\u628a\u8fd9\u4e2a\u7a7a\u7ed3\u679c\u8fdb\u884c\u7f13\u5b58\uff0c\u4f46\u5b83\u7684\u8fc7\u671f\u65f6\u95f4\u4f1a\u5f88\u77ed\uff0c\u6700\u957f\u4e0d\u8d85\u8fc7\u4e94\u5206\u949f\u3002
\u4e00\u4e9b\u4e0d\u5408\u6cd5\u7684\u53c2\u6570\u8bf7\u6c42\u76f4\u63a5\u629b\u51fa\u5f02\u5e38\u4fe1\u606f\u8fd4\u56de\u7ed9\u5ba2\u6237\u7aef\u3002\u6bd4\u5982\u67e5\u8be2\u7684\u6570\u636e\u5e93 id \u4e0d\u80fd\u5c0f\u4e8e 0\u3001\u4f20\u5165\u7684\u90ae\u7bb1\u683c\u5f0f\u4e0d\u5bf9\u7684\u65f6\u5019\u76f4\u63a5\u8fd4\u56de\u9519\u8bef\u6d88\u606f\u7ed9\u5ba2\u6237\u7aef\u7b49

缓存穿透是指查询一个一定不存在的数据,由于缓存是不命中时被动写的,并且出于容错考虑,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到存储层去查询,失去了缓存的意义。在流量大时,可能DB就挂掉了,要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。

最基本的就是首先做好参数校验,一些不合法的参数请求直接抛出异常信息返回给客户端。比如查询的数据库 id 不能小于 0、传入的邮箱格式不对的时候直接返回错误消息给客户端等等。

1)缓存无效 key : 如果缓存和数据库都查不到某个 key 的数据就写一个到 redis 中去并设置过期时间,具体命令如下:SET key value EX 10086。这种方式可以解决请求的 key 变化不频繁的情况,如何黑客恶意攻击,每次构建的不同的请求key,会导致 redis 中缓存大量无效的 key 。很明显,这种方案并不能从根本上解决此问题。如果非要用这种方式来解决穿透问题的话,尽量将无效的 key 的过期时间设置短一点比如 1 分钟。另外,一般情况下我们是这样设计 key 的: 表名:列名:主键名:主键值。

2)布隆过滤器:布隆过滤器是一个非常神奇的数据结构,通过它我们可以非常方便地判断一个给定数据是否存在与海量数据中。我们需要的就是判断 key 是否合法,有没有感觉布隆过滤器就是我们想要找的那个“人”。具体是这样做的:把所有可能存在的请求的值都存放在布隆过滤器中,当用户请求过来,我会先判断用户发来的请求的值是否存在于布隆过滤器中。不存在的话,直接返回请求参数错误信息给客户端,存在的话才会走下面的流程。

一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去数据库查询。一些恶意的请求会故意大量查询不存在的key,就会对数据库造成很大的压力。这就叫做缓存穿透。

  • 缂撳瓨绌块忕殑鎰忎箟?
    绛旓細缂撳瓨绌块忔槸鎸囨煡璇竴涓竴瀹氫笉瀛樺湪鐨勬暟鎹锛岀敱浜庣紦瀛樻槸涓嶅懡涓椂琚姩鍐欑殑锛屽苟涓斿嚭浜庡閿欒冭檻锛屽鏋滀粠瀛樺偍灞傛煡涓嶅埌鏁版嵁鍒欎笉鍐欏叆缂撳瓨锛岃繖灏嗗鑷磋繖涓笉瀛樺湪鐨勬暟鎹瘡娆¤姹傞兘瑕佸埌瀛樺偍灞傚幓鏌ヨ锛屽け鍘讳簡缂撳瓨鐨勬剰涔夈傚湪娴侀噺澶ф椂锛屽彲鑳紻B灏辨寕鎺変簡锛岃鏄湁浜哄埄鐢ㄤ笉瀛樺湪鐨刱ey棰戠箒鏀诲嚮鎴戜滑鐨勫簲鐢紝杩欏氨鏄紡娲炪
  • 甯︿綘鎼炴槑鐧浠涔鏄缂撳瓨绌块銆佺紦瀛樺嚮绌裤佺紦瀛橀洩宕
    绛旓細缂撳瓨绌块: 褰撳ぇ閲忓苟鍙戣姹傛煡璇笉瀛樺湪鐨勬暟鎹椂锛屾暟鎹簱鎵垮彈宸ㄥぇ鍘嬪姏銆傛瘮濡傦紝鎭舵剰娴嬭瘯鑰呮煡璇笉瀛樺湪鐨勮鍗曪紝鍙兘瀵艰嚧鏁版嵁搴撳穿婧冦備负闃叉杩欑鎯呭喌锛屾垜浠渶瑕佽冭檻鍏ㄩ潰鐨勯槻鎶ょ瓥鐣ワ紝濡備娇鐢ㄥ竷闅嗚繃婊ゅ櫒锛圔loom Filter锛夛紝瀹冩槸涓绉嶆鐜囧瀷鏁版嵁缁撴瀯锛岃兘澶熷揩閫熷垽鏂厓绱犳槸鍚﹀瓨鍦紝鍚屾椂瀵圭┖闂存晥鐜囨湁杈冮珮瑕佹眰銆傝В鍐虫柟妗堬細鍦ㄥ鐞...
  • 濡備綍绠鍗曠悊瑙 Redis 鐨缂撳瓨绌块銆佸嚮绌垮拰闆穿?
    绛旓細3. 缂撳瓨绌块忥細鎭舵剰鏀诲嚮涓庢暟鎹獙璇佹伓鎰忚姹傚埄鐢ㄤ笉瀛樺湪鐨勬暟鎹紩鍙戞棤鐢ㄦ煡璇紝瀵规暟鎹簱閫犳垚鍘嬪姏銆傞闃叉帾鏂藉寘鎷弬鏁版牎楠屽拰甯冮殕杩囨护鍣紝鍓嶈呮嫤鎴潪娉曡姹傦紝鍚庤呴氳繃澶氫釜鍝堝笇鍑芥暟鍑忓皯鍐茬獊锛屽揩閫熷垽鏂暟鎹槸鍚﹀瓨鍦ㄣ4. 璋嬬瘒甯冨眬锛氫紭鍖栫瓥鐣ラ櫎浜嗗紓甯稿鐞嗭紝浼樺寲鏂规硶濡傜紦瀛橀鐑拰闄嶇骇涔熻嚦鍏抽噸瑕併傜紦瀛橀鐑‘淇濆叧閿暟鎹湪鐢ㄦ埛璁...
  • 缂撳瓨绌块鍜岀紦瀛樺嚮绌鏈変粈涔鍖哄埆
    绛旓細缂撳瓨绌块忔槸鎸囩紦瀛樺拰鏁版嵁搴撲腑閮芥病鏈夌殑鏁版嵁锛岃岀敤鎴蜂笉鏂彂璧疯姹傦紝濡傚彂璧风殑鏁版嵁鐗瑰埆澶ц屼笉瀛樺湪鐨勬暟鎹銆傜紦瀛樺嚮绌挎槸鎸囩紦瀛樹腑娌℃湁浣嗘暟鎹簱涓湁鐨勬暟鎹紝鐢变簬骞跺彂鐢ㄦ埛鐗瑰埆澶氾紝鍚屾椂璇荤紦瀛樻病璇诲埌鏁版嵁锛屽悓鏃舵暟鎹簱鍙栨暟鎹紩璧锋暟鎹簱鍘嬪姏鐬棿澧炲ぇ锛岄犳垚杩囧ぇ鍘嬪姏銆傛暟鎹紙data锛夋槸浜嬪疄鎴栬瀵熺殑缁撴灉锛屾槸瀵瑰瑙備簨鐗╃殑閫昏緫...
  • Redis 缂撳瓨闆穿銆缂撳瓨绌块鍜岀紦瀛樺嚮绌挎湁鍝簺鑱旂郴鍜屽尯鍒?
    绛旓細- 缂撳瓨绌块忥細鎸囨煡璇竴涓笉瀛樺湪鐨勬暟鎹紝鐢变簬缂撳瓨涓篃娌℃湁璇ユ暟鎹紝鎵浠ユ瘡娆¤姹傞兘浼氬埌鏁版嵁搴撲腑鍘绘煡璇紝瀵艰嚧鏁版嵁搴撳帇鍔涘澶銆傝В鍐虫柟妗堟槸瀵规煡璇㈢粨鏋滆繘琛岀紦瀛橈紝濡傛灉缂撳瓨涓病鏈夎鏁版嵁锛屽垯鐩存帴杩斿洖鏁版嵁搴撴煡璇㈢粨鏋 銆- 缂撳瓨鍑荤┛锛氭寚鏁版嵁搴撶紦瀛樺埌Redis鍐呯殑鐑偣鏁版嵁澶辨晥瀵艰嚧澶ч噺骞跺彂鏌ヨ绌胯繃redis鐩存帴鍑绘墦鍒板簳灞傛暟鎹簱...
  • 浠涔鏄缂撳瓨绌块?鏈夊摢浜涜В鍐冲姙娉?
    绛旓細缂撳瓨绌块忥細鎸囨煡璇竴涓笉瀛樺湪鐨勬暟鎹锛岀敱浜庣紦瀛樻槸涓嶅懡涓椂闇瑕佷粠鏁版嵁搴撴煡璇紝鏌ヤ笉鍒版暟鎹垯涓嶅啓鍏ョ紦瀛橈紝杩欏皢瀵艰嚧杩欎釜涓嶅瓨鍦ㄧ殑鏁版嵁姣忔璇锋眰閮借鍒版暟鎹簱鍘绘煡璇紝閫犳垚缂撳瓨绌块忋傝В鍐虫柟妗堬細鏈绠鍗曠殑鏂规硶鏄鏋滀竴涓煡璇㈣繑鍥炵殑鏁版嵁涓虹┖锛堜笉绠℃槸鏁版嵁涓嶅瓨鍦紝杩樻槸绯荤粺鏁呴殰锛夛紝鎴戜滑灏辨妸杩欎釜绌虹粨鏋滆繘琛岀紦瀛橈紝浣嗗畠鐨勮繃鏈...
  • redis缂撳瓨绌块,棰戠箒鏌ヨdb,鎬庝箞瑙e喅
    绛旓細缂撳瓨绌块鏄寚鏌ヨ鐨刱ey涓嶅瓨鍦紝浠庤岀紦瀛樻煡璇笉鍒拌屾煡璇簡鏁版嵁搴撱傝В鍐虫柟娉曪細鎶婃墍鏈夊瓨鍦ㄧ殑key閮藉瓨鍒板彟澶栦竴涓瓨鍌ㄧ殑Set闆嗗悎閲岋紝鏌ヨ鏃跺彲浠ュ厛鏌ヨkey鏄惁瀛樺湪銆傚共鑴嗙畝鍗曚竴浜涳紝缁欐煡璇笉鍒扮殑key涔熷姞涓涓爣璇嗙┖鍊肩殑Value锛岃繖鏍峰氨涓嶄細鍘绘煡璇㈡暟鎹簱浜嗭紝姣斿鍦烘櫙涓烘煡璇㈢渷甯傚尯琛楅亾瀵瑰簲鐨勭Щ鍔ㄨ惀涓氬巺锛岃嫢鏄煇琛楅亾纭疄娌...
  • 璇ユ庝箞瑙e喅 Redis 缂撳瓨绌块鍜岀紦瀛橀洩宕╅棶棰?
    绛旓細缂撳瓨绌块锛 缂撳瓨绌块忔槸鎸囨煡璇竴涓牴鏈笉瀛樺湪鐨勬暟鎹紝杩欐牱鐨勬暟鎹偗瀹氫笉鍦ㄧ紦瀛樹腑锛岃繖浼氬鑷磋姹傚叏閮ㄨ惤鍒版暟鎹簱涓婏紝鏈夊彲鑳藉嚭鐜版暟鎹簱瀹曟満鐨勬儏鍐点傞闃插拰瑙e喅缂撳瓨绌块忛棶棰橈紝鍙互鑰冭檻浠ヤ笅涓ょ鏂规硶锛1銆佺紦瀛樼┖瀵硅薄锛 灏嗙┖鍊肩紦瀛樿捣鏉ワ紝浣嗘槸杩欐牱灏辨湁涓涓棶棰橈紝澶ч噺鏃犳晥鐨勭┖鍊煎皢鍗犵敤绌洪棿锛岄潪甯告氮璐广2銆佸竷闅嗚繃婊ゅ櫒...
  • redis缂撳瓨绌块鎬庝箞瑙e喅
    绛旓細浣嗘槸濡傛灉鏈変汉鎭舵剰鏀诲嚮锛岄偅灏卞緢杞绘澗鐨勭┛閫忎綘鐨勭紦瀛橈紝灏嗘墍鏈夌殑鍘嬪姏閮界粰鏁版嵁搴撱傛瘮濡備笂鍥撅紝浣犵紦瀛樼殑key閮芥槸姝f暣鏁帮紝浣嗘槸鎴戝亸鍋忎娇鐢ㄨ礋鏁颁綔涓簁ey璁块棶浣犵殑缂撳瓨锛岃繖鏍峰氨浼氬鑷绌块忕紦瀛锛屽皢鍘嬪姏鐩存帴缁欐暟鎹簱銆備簩銆佸鑷缂撳瓨绌块忕殑鍘熷洜缂撳瓨绌块忕殑闂锛岃偗瀹氭槸鍐嶅ぇ骞跺彂鎯呭喌涓嬨備緷姝や负鍓嶆彁锛屾垜浠垎鏋愮紦瀛樼┛閫忕殑鍘熷洜濡備笅...
  • 缂撳瓨鍑荤┛銆绌块銆侀洩宕╁強Redis鍒嗗竷寮忛攣
    绛旓細缂撳瓨绌块:鎸囩紦瀛樺拰db涓潎鏃 鍘熷洜: 涓鑸槸鎭舵剰璇锋眰 鏂规: 鍔犲竷闅嗚繃婊,鎴栨煡db鏃犳椂,涔熻缃紦瀛,value涓烘煇浜涚壒娈婅〃绀烘垨"null"闆穿:鎸囩紦瀛樺悓鏃跺ぇ閲忓け鏁 鍘熷洜: 澶ч噺鐨刱ey鍚屾椂澶辨晥,db鍘嬪姏鍔犲ぇ 鏂规: 璁剧疆澶辨晥鏃堕棿鏄鍔犻殢鏈烘暟 闂鏂规鏂囩尞:https://www.jianshu.com/p/31ab9b020cd9 (鍥句緥鍒嗘瀽)https:...
  • 扩展阅读:六种征兆说明你抑郁了 ... 穿透击穿雪崩 ... 机械硬盘缓存128跟256 ... 布隆过滤器解决缓存穿透 ... 缓存能随便清理吗 ... 硬盘缓存128m和256m ... 缓存相当于下载吗 ... 缓存垃圾包括哪些 ... 缓存穿透解决方案 正则 ...

    本站交流只代表网友个人观点,与本站立场无关
    欢迎反馈与建议,请联系电邮
    2024© 车视网