Skip to content

Commit c835b5a

Browse files
author
朱晔
committed
补充
1 parent 025aea7 commit c835b5a

File tree

3 files changed

+27
-9
lines changed

3 files changed

+27
-9
lines changed

src/main/java/org/geekbang/time/commonmistakes/cachedesign/redistransaction/RedisTemplateTransactionController.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,11 @@ public class RedisTemplateTransactionController {
1414
@Autowired
1515
private TestService testService;
1616

17+
@GetMapping("test0")
18+
public String test0() throws InterruptedException {
19+
return testService.redisTemplateNotInTransactional();
20+
}
21+
1722
@GetMapping("test1")
1823
public String test1() {
1924
return testService.multiTest();
@@ -31,6 +36,6 @@ public String test3() {
3136

3237
@GetMapping("test4")
3338
public String test4() {
34-
return testService.multiTestInTransactional();
39+
return testService.multiTestCallback();
3540
}
3641
}

src/main/java/org/geekbang/time/commonmistakes/cachedesign/redistransaction/TestService.java

Lines changed: 20 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,11 @@
33
import lombok.extern.slf4j.Slf4j;
44
import org.apache.commons.pool2.impl.GenericObjectPool;
55
import org.springframework.beans.factory.annotation.Autowired;
6+
import org.springframework.dao.DataAccessException;
67
import org.springframework.data.redis.connection.RedisConnectionFactory;
78
import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
9+
import org.springframework.data.redis.core.RedisOperations;
10+
import org.springframework.data.redis.core.SessionCallback;
811
import org.springframework.data.redis.core.StringRedisTemplate;
912
import org.springframework.stereotype.Component;
1013
import redis.clients.jedis.Jedis;
@@ -13,6 +16,7 @@
1316
import javax.annotation.PostConstruct;
1417
import javax.transaction.Transactional;
1518
import java.lang.reflect.Field;
19+
import java.util.List;
1620
import java.util.concurrent.Executors;
1721
import java.util.concurrent.TimeUnit;
1822
import java.util.stream.IntStream;
@@ -30,14 +34,14 @@ public class TestService {
3034
public String multiTest() {
3135
Long current = System.currentTimeMillis();
3236
stringRedisTemplateTran.multi();
33-
IntStream.rangeClosed(1, 1000).forEach(i -> stringRedisTemplateTran.opsForValue().increment("test", 1));
37+
IntStream.rangeClosed(1, 10000).forEach(i -> stringRedisTemplateTran.opsForValue().increment("test", 1));
3438
stringRedisTemplateTran.exec();
3539
return System.currentTimeMillis() - current + "ms " + stringRedisTemplateTran.opsForValue().get("test");
3640
}
3741

3842
public String noMultiTest() {
3943
Long current = System.currentTimeMillis();
40-
IntStream.rangeClosed(1, 1000).forEach(i -> stringRedisTemplate.opsForValue().increment("test", 1));
44+
IntStream.rangeClosed(1, 10000).forEach(i -> stringRedisTemplate.opsForValue().increment("test", 1));
4145
return System.currentTimeMillis() - current + "ms " + stringRedisTemplate.opsForValue().get("test");
4246
}
4347

@@ -46,12 +50,21 @@ public String redisTemplateInTransactional() {
4650
return "" + stringRedisTemplateTran.opsForValue().increment("test", 1);
4751
}
4852

49-
@Transactional
50-
public String multiTestInTransactional() {
53+
public String redisTemplateNotInTransactional() throws InterruptedException {
54+
TimeUnit.SECONDS.sleep(10);
55+
return "" + stringRedisTemplateTran.opsForValue().increment("test", 1);
56+
}
57+
58+
public String multiTestCallback() {
5159
Long current = System.currentTimeMillis();
52-
stringRedisTemplateTran.multi();
53-
IntStream.rangeClosed(1, 1000).forEach(i -> stringRedisTemplateTran.opsForValue().increment("test", 1));
54-
stringRedisTemplateTran.exec();
60+
List<Object> txResults = stringRedisTemplate.execute(new SessionCallback<List<Object>>() {
61+
public List<Object> execute(RedisOperations operations) throws DataAccessException {
62+
operations.multi();
63+
IntStream.rangeClosed(1, 10000).forEach(i -> stringRedisTemplate.opsForValue().increment("test", 1));
64+
return operations.exec();
65+
}
66+
});
67+
log.info("txResults = {}", txResults);
5568
return System.currentTimeMillis() - current + "ms " + stringRedisTemplate.opsForValue().get("test");
5669
}
5770

src/main/resources/application.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
server.port=45678
2-
#server.tomcat.min-spare-threads=15
2+
server.tomcat.min-spare-threads=2
33
server.tomcat.max-threads=30
44
spring.jpa.show-sql=false
55
spring.jpa.hibernate.ddl-auto=update

0 commit comments

Comments
 (0)