Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
·Ö²¼Ê½Ö®»º´æ»÷´©
 
  1723  次浏览      41
 2018-8-27
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚcnblogs£¬Ö÷Òª½éÉÜÁËʲôÊÇ»º´æ»÷´©£¬½â¾ö·½°¸£ºÊ¹Óû¥³âËø£¬Òì²½¹¹½¨»º´æ£¬²¼Â¡¹ýÂËÆ÷µÈ¡£

ʲôÊÇ»º´æ»÷´©

ÔÚ̸ÂÛ»º´æ»÷´©Ö®Ç°£¬ÎÒÃÇÏÈÀ´»ØÒäÏ´ӻº´æÖмÓÔØÊý¾ÝµÄÂß¼­£¬ÈçÏÂͼËùʾ

Òò´Ë£¬Èç¹ûºÚ¿Íÿ´Î¹ÊÒâ²éѯһ¸öÔÚ»º´æÄÚ±ØÈ»²»´æÔÚµÄÊý¾Ý£¬µ¼ÖÂÿ´ÎÇëÇó¶¼ÒªÈ¥´æ´¢²ãÈ¥²éѯ£¬ÕâÑù»º´æ¾ÍʧȥÁËÒâÒå¡£Èç¹ûÔÚ´óÁ÷Á¿ÏÂÊý¾Ý¿â¿ÉÄܹҵô¡£Õâ¾ÍÊÇ»º´æ»÷´©¡£

³¡¾°ÈçÏÂͼËùʾ:

ÎÒÃÇÕý³£ÈËÔڵǼÊ×Ò³µÄʱºò£¬¶¼ÊǸù¾ÝuserIDÀ´ÃüÖÐÊý¾Ý£¬È»¶øºÚ¿ÍµÄÄ¿µÄÊÇÆÆ»µÄãµÄϵͳ£¬ºÚ¿Í¿ÉÒÔËæ»úÉú³ÉÒ»¶ÑuserID,È»ºó½«ÕâЩÇëÇóí¡µ½ÄãµÄ·þÎñÆ÷ÉÏ£¬ÕâЩÇëÇóÔÚ»º´æÖв»´æÔÚ£¬¾Í»á´©¹ý»º´æ£¬Ö±½Óí¡µ½Êý¾Ý¿âÉÏ,´Ó¶øÔì³ÉÊý¾Ý¿âÁ¬½ÓÒì³£¡£

½â¾ö·½°¸

ÔÚÕâÀïÎÒÃǸø³öÈýÌ×½â¾ö·½°¸£¬´ó¼Ò¸ù¾ÝÏîÄ¿ÖеÄʵ¼ÊÇé¿ö£¬Ñ¡ÔñʹÓÃ.

½²ÏÂÊöÈýÖÖ·½°¸Ç°£¬ÎÒÃÇÏÈ»ØÒäÏÂredisµÄsetnx·½·¨

SETNX key value

½« key µÄÖµÉèΪ value £¬µ±ÇÒ½öµ± key ²»´æÔÚ¡£

Èô¸ø¶¨µÄ key ÒѾ­´æÔÚ£¬Ôò SETNX ²»×öÈκζ¯×÷¡£

SETNX ÊÇ¡ºSET if Not eXists¡»(Èç¹û²»´æÔÚ£¬Ôò SET)µÄ¼òд¡£

¿ÉÓð汾£º>= 1.0.0

ʱ¼ä¸´ÔÓ¶È£º O(1)

·µ»ØÖµ£º ÉèÖóɹ¦£¬·µ»Ø 1¡£ÉèÖÃʧ°Ü£¬·µ»Ø 0 ¡£

Ч¹ûÈçÏÂ

redis> EXISTS job # job ²»´æÔÚ
(integer) 0
redis> SETNX job "programmer" # job ÉèÖóɹ¦
(integer) 1
redis> SETNX job "code-farmer" # ³¢ÊÔ¸²¸Ç job £¬Ê§°Ü
(integer) 0
redis> GET job # ûÓб»¸²¸Ç
"programmer"

1¡¢Ê¹Óû¥³âËø

¸Ã·½·¨ÊÇ±È½ÏÆÕ±éµÄ×ö·¨£¬¼´£¬ÔÚ¸ù¾Ýkey»ñµÃµÄvalueֵΪ¿Õʱ£¬ÏÈËøÉÏ£¬ÔÙ´ÓÊý¾Ý¿â¼ÓÔØ£¬¼ÓÔØÍê±Ï£¬ÊÍ·ÅËø¡£ÈôÆäËûÏ̷߳¢ÏÖ»ñÈ¡ËøÊ§°Ü£¬Ôò˯Ãß50msºóÖØÊÔ¡£

ÖÁÓÚËøµÄÀàÐÍ£¬µ¥»ú»·¾³Óò¢·¢°üµÄLockÀàÐ;ÍÐУ¬¼¯Èº»·¾³ÔòʹÓ÷ֲ¼Ê½Ëø( redisµÄsetnx)

¼¯Èº»·¾³µÄredisµÄ´úÂëÈçÏÂËùʾ:

String get(String key) {
String value = redis.get(key);
if (value == null) {
if (redis.setnx(key_mutex, "1")) {
// 3 min timeout to avoid mutex holder crash
redis.expire(key_mutex, 3 * 60)
value = db.get(key);
redis.set(key, value);
redis.delete(key_mutex);
} else {
//ÆäËûÏß³ÌÐÝÏ¢50ºÁÃëºóÖØÊÔ
Thread.sleep(50);
get(key);
}
}
}

Óŵã:

1.˼·¼òµ¥

2.±£Ö¤Ò»ÖÂÐÔ

ȱµã

1.´úÂ븴ÔÓ¶ÈÔö´ó

2.´æÔÚËÀËøµÄ·çÏÕ

2¡¢Òì²½¹¹½¨»º´æ

ÔÚÕâÖÖ·½°¸Ï£¬¹¹½¨»º´æ²ÉÈ¡Òì²½²ßÂÔ£¬»á´ÓÏ̳߳ØÖÐÈ¡Ïß³ÌÀ´Òì²½¹¹½¨»º´æ£¬´Ó¶ø²»»áÈÃËùÓеÄÇëÇóÖ±½Óí¡µ½Êý¾Ý¿âÉÏ¡£¸Ã·½°¸redis×Ô¼ºÎ¬»¤Ò»¸ötimeout£¬µ±timeoutСÓÚSystem.currentTimeMillis()ʱ£¬Ôò½øÐлº´æ¸üУ¬·ñÔòÖ±½Ó·µ»ØvalueÖµ¡£

¼¯Èº»·¾³µÄredis´úÂëÈçÏÂËùʾ:

String get(final String key) {
V v = redis.get(key);
String value = v.getValue();
long timeout = v.getTimeout();
if (v.timeout < = System.currentTimeMillis()) {
// Òì²½¸üкǫ́Òì³£Ö´ÐÐ
threadPool.execute (new Runnable() {
public void run() {
String keyMutex = "mutex:" + key;
if (redis.setnx(keyMutex, "1")) {
// 3 min timeout to avoid mutex holder crash
redis. expire (keyMutex, 3 * 60);
String dbValue = db.get(key);
redis.set(key, dbValue);
redis.delete(keyMutex);
}
}
});
}
return value;
}

Óŵã:

ÐÔ¼Û×î¼Ñ£¬Óû§ÎÞÐèµÈ´ý

ȱµã

ÎÞ·¨±£Ö¤»º´æÒ»ÖÂÐÔ

3¡¢²¼Â¡¹ýÂËÆ÷

1¡¢Ô­Àí

²¼Â¡¹ýÂËÆ÷µÄ¾Þ´óÓô¦¾ÍÊÇ£¬Äܹ»Ñ¸ËÙÅжÏÒ»¸öÔªËØÊÇ·ñÔÚÒ»¸ö¼¯ºÏÖС£Òò´ËËûÓÐÈçÏÂÈý¸öʹÓó¡¾°:

1.ÍøÒ³ÅÀ³æ¶ÔURLµÄÈ¥ÖØ£¬±ÜÃâÅÀÈ¡ÏàͬµÄURLµØÖ·

2.·´À¬»øÓʼþ£¬´ÓÊýÊ®ÒÚ¸öÀ¬»øÓʼþÁбíÖÐÅжÏijÓÊÏäÊÇ·ñÀ¬»øÓÊÏ䣨ͬÀí£¬À¬»ø¶ÌÐÅ£©

3.»º´æ»÷´©£¬½«ÒÑ´æÔڵĻº´æ·Åµ½²¼Â¡¹ýÂËÆ÷ÖУ¬µ±ºÚ¿Í·ÃÎʲ»´æÔڵĻº´æÊ±Ñ¸ËÙ·µ»Ø±ÜÃ⻺´æ¼°DB¹Òµô¡£

OK£¬½ÓÏÂÀ´ÎÒÃÇÀ´Ì¸Ì¸²¼Â¡¹ýÂËÆ÷µÄÔ­Àí

ÆäÄÚ²¿Î¬»¤Ò»¸öȫΪ0µÄbitÊý×飬ÐèҪ˵Ã÷µÄÊÇ£¬²¼Â¡¹ýÂËÆ÷ÓÐÒ»¸öÎóÅÐÂʵĸÅÄÎóÅÐÂÊÔ½µÍ£¬ÔòÊý×éÔ½³¤£¬ËùÕ¼¿Õ¼äÔ½´ó¡£ÎóÅÐÂÊÔ½¸ßÔòÊý×éԽС£¬ËùÕ¼µÄ¿Õ¼äԽС¡£

¼ÙÉ裬¸ù¾ÝÎóÅÐÂÊ£¬ÎÒÃÇÉú³ÉÒ»¸ö10λµÄbitÊý×飬ÒÔ¼°2¸öhashº¯Êý£¨f1,f2 £©£¬ÈçÏÂͼËùʾ(Éú³ÉµÄÊý×éµÄλÊýºÍhashº¯ÊýµÄÊýÁ¿£¬ÎÒÃDz»ÓÃÈ¥¹ØÐÄÊÇÈçºÎÉú³ÉµÄ£¬ÓÐÊýѧÂÛÎĽøÐйýרҵµÄÖ¤Ã÷)¡£

¼ÙÉèÊäÈ뼯ºÏΪ(N1,N2 ),¾­¹ý¼ÆËãf1(N1)µÃµ½µÄÊýÖµµÃΪ2£¬f2(N1) µÃµ½µÄÊýֵΪ5£¬Ôò½«Êý×éϱêΪ2ºÍϱíΪ5µÄλÖÃÖÃΪ1£¬ÈçÏÂͼËùʾ

ͬÀí£¬¾­¹ý¼ÆËãf1(N2) µÃµ½µÄÊýÖµµÃΪ3£¬f2(N2) µÃµ½µÄÊýֵΪ6£¬Ôò½«Êý×éϱêΪ3ºÍϱíΪ6µÄλÖÃÖÃΪ1£¬ÈçÏÂͼËùʾ

Õâ¸öʱºò£¬ÎÒÃÇÓеÚÈý¸öÊýN3 £¬ÎÒÃÇÅжÏN3ÔÚ²»ÔÚ¼¯ºÏ(N1,N2)ÖУ¬¾Í½øÐÐf1(N3)£¬f2(N3) µÄ¼ÆËã

1.ÈôֵǡÇɶ¼Î»ÓÚÉÏͼµÄºìɫλÖÃÖУ¬ÎÒÃÇÔòÈÏΪ£¬N3 ÔÚ¼¯ºÏ(N1,N2 )ÖÐ

2.ÈôÖµÓÐÒ»¸ö²»Î»ÓÚÉÏͼµÄºìɫλÖÃÖУ¬ÎÒÃÇÔòÈÏΪ£¬N3 ²»ÔÚ¼¯ºÏ(N1,N2)ÖÐ

ÒÔÉϾÍÊDz¼Â¡¹ýÂËÆ÷µÄ¼ÆËãÔ­Àí£¬ÏÂÃæÎÒÃǽøÐÐÐÔÄܲâÊÔ£¬

2¡¢ÐÔÄܲâÊÔ

´úÂëÈçÏÂ:

(1)н¨Ò»¸ömaven¹¤³Ì£¬ÒýÈëguava°ü

<dependencies>
<dependency>
<groupId> com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>22.0</version>
</dependency>
</dependencies>

(2)²âÊÔÒ»¸öÔªËØÊÇ·ñÊôÓÚÒ»¸ö°ÙÍòÔªËØ¼¯ºÏËùÐèºÄʱ

package bloomfilter;
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;
import java.nio.charset.Charset;
public class Test {
private static int size = 1000000;


private static BloomFilter <Integer> bloomFilter = BloomFilter .create(Funnels.integerFunnel(), size);
public static void main(String[] args) {
for (int i = 0; i < size; i++) {
bloomFilter.put(i);
}
long startTime = System.nanoTime(); // »ñÈ¡¿ªÊ¼Ê±¼ä
//ÅжÏÕâÒ»°ÙÍò¸öÊýÖÐÊÇ·ñ°üº¬29999Õâ¸öÊý
if (bloomFilter.mightContain(29999)) {
System.out.println("ÃüÖÐÁË");
}
long endTime = System.nanoTime(); // »ñÈ¡½áÊøÊ±¼ä
System.out.println("³ÌÐòÔËÐÐʱ¼ä£º " + (endTime - startTime) + "ÄÉÃë");
}
}

Êä³öÈçÏÂËùʾ

ÃüÖÐÁË
³ÌÐòÔËÐÐʱ¼ä£º 219386ÄÉÃë

Ò²¾ÍÊÇ˵£¬ÅжÏÒ»¸öÊýÊÇ·ñÊôÓÚÒ»¸ö°ÙÍò¼¶±ðµÄ¼¯ºÏ£¬Ö»Òª0.219ms¾Í¿ÉÒÔÍê³É£¬ÐÔÄܼ«¼Ñ¡£

(3)ÎóÅÐÂʵÄһЩ¸ÅÄî

Ê×ÏÈ£¬ÎÒÃÇÏȲ»¶ÔÎóÅÐÂÊ×öÏÔʾµÄÉèÖ㬽øÐÐÒ»¸ö²âÊÔ£¬´úÂëÈçÏÂËùʾ

package bloomfilter;
import java.util.ArrayList;
import java.util.List;
import com.google.common.hash.BloomFilter;
import com.google.common.hash.Funnels;


public class Test {
private static int size = 1000000;
private static BloomFilter <Integer> bloomFilter = BloomFilter .create(Funnels.integerFunnel(), size);


public static void main(String[] args) {
for (int i = 0; i < size; i++) {
bloomFilter.put(i);
}
List<Integer> list = new ArrayList<Integer>(1000);
//¹ÊÒâÈ¡10000¸ö²»ÔÚ¹ýÂËÆ÷ÀïµÄÖµ£¬¿´¿´ÓжàÉÙ¸ö»á±»ÈÏΪÔÚ¹ýÂËÆ÷Àï
for (int i = size + 10000; i < size + 20000; i++) {
if (bloomFilter.mightContain(i)) {
list.add(i);
}
}
System.out.println("ÎóÅеÄÊýÁ¿£º" + list.size());
}
}

Êä³ö½á¹ûÈçÏÂ

ÎóÅжÔÊýÁ¿£º330

Èç¹ûÉÏÊö´úÂëËùʾ£¬ÎÒÃǹÊÒâÈ¡10000¸ö²»ÔÚ¹ýÂËÆ÷ÀïµÄÖµ£¬È´»¹ÓÐ330¸ö±»ÈÏΪÔÚ¹ýÂËÆ÷ÀÕâ˵Ã÷ÁËÎóÅÐÂÊΪ0.03.¼´£¬ÔÚ²»×öÈκÎÉèÖõÄÇé¿öÏ£¬Ä¬ÈϵÄÎóÅÐÂÊΪ0.03¡£

ÏÂÃæÉÏÔ´ÂëÀ´Ö¤Ã÷£º

½ÓÏÂÀ´ÎÒÃÇÀ´¿´Ò»Ï£¬ÎóÅÐÂÊΪ0.03ʱ£¬µ×²ãά»¤µÄbitÊý×éµÄ³¤¶ÈÈçÏÂͼËùʾ

½«bloomfilterµÄ¹¹Ôì·½·¨¸ÄΪ

private static BloomFilter<Integer> bloomFilter = BloomFilter .create (Funnels.integerFunnel(), size, 0. 01);

¼´£¬´ËʱÎóÅÐÂÊΪ0.01¡£ÔÚÕâÖÖÇé¿öÏ£¬µ×²ãά»¤µÄbitÊý×éµÄ³¤¶ÈÈçÏÂͼËùʾ

Óɴ˿ɼû£¬ÎóÅÐÂÊÔ½µÍ£¬Ôòµ×²ãά»¤µÄÊý×éÔ½³¤£¬Õ¼ÓÿռäÔ½´ó¡£Òò´Ë£¬ÎóÅÐÂÊʵ¼Êȡֵ£¬¸ù¾Ý·þÎñÆ÷ËùÄܹ»³ÐÊܵĸºÔØÀ´¾ö¶¨£¬²»ÊÇÅÄÄÔ´üϹÏëµÄ¡£

3¡¢Êµ¼ÊʹÓÃ

redisα´úÂëÈçÏÂËùʾ

String get(String key) {
String value = redis.get(key);
if (value == null) {
if(!bloomfilter.mightContain(key)){
return null;
}else{
value = db.get(key);
redis.set(key, value);
}
}
return value£»
}

Óŵã:

1.˼·¼òµ¥

2.±£Ö¤Ò»ÖÂÐÔ

3.ÐÔÄÜÇ¿

ȱµã

1.´úÂ븴ÔÓ¶ÈÔö´ó

2.ÐèÒªÁíÍâά»¤Ò»¸ö¼¯ºÏÀ´´æ·Å»º´æµÄKey

3.²¼Â¡¹ýÂËÆ÷²»Ö§³Öɾֵ²Ù×÷

×ܽá

ÔÚ×ܽᲿ·Ö£¬À´¸öÂþ»­°Ñ¡£Ï£Íû¶Ô´ó¼ÒÕÒ¹¤×÷ÓаïÖú

   
1723 ´Îä¯ÀÀ       41
Ïà¹ØÎÄÕÂ

»ùÓÚEAµÄÊý¾Ý¿â½¨Ä£
Êý¾ÝÁ÷½¨Ä££¨EAÖ¸ÄÏ£©
¡°Êý¾Ýºþ¡±£º¸ÅÄî¡¢ÌØÕ÷¡¢¼Ü¹¹Óë°¸Àý
ÔÚÏßÉ̳ÇÊý¾Ý¿âϵͳÉè¼Æ ˼·+Ч¹û
 
Ïà¹ØÎĵµ

GreenplumÊý¾Ý¿â»ù´¡Åàѵ
MySQL5.1ÐÔÄÜÓÅ»¯·½°¸
ijµçÉÌÊý¾ÝÖÐ̨¼Ü¹¹Êµ¼ù
MySQL¸ßÀ©Õ¹¼Ü¹¹Éè¼Æ
Ïà¹Ø¿Î³Ì

Êý¾ÝÖÎÀí¡¢Êý¾Ý¼Ü¹¹¼°Êý¾Ý±ê×¼
MongoDBʵս¿Î³Ì
²¢·¢¡¢´óÈÝÁ¿¡¢¸ßÐÔÄÜÊý¾Ý¿âÉè¼ÆÓëÓÅ»¯
PostgreSQLÊý¾Ý¿âʵսÅàѵ