±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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());
}
} |
Êä³ö½á¹ûÈçÏÂ
Èç¹ûÉÏÊö´úÂëËùʾ£¬ÎÒÃǹÊÒâÈ¡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.²¼Â¡¹ýÂËÆ÷²»Ö§³Öɾֵ²Ù×÷
×ܽá
ÔÚ×ܽᲿ·Ö£¬À´¸öÂþ»°Ñ¡£Ï£Íû¶Ô´ó¼ÒÕÒ¹¤×÷ÓаïÖú 
|