前言
到目前为止,把项目中需要用到的:properties读取、数据源配置、整合mybatis/JdbcTemplate、AOP、WebService、redis、filter、interceptor、定时器等,都简单的去用spring boot整合学习了一下。与学习之初对spring boot的理解并没有什么大的区别,只是大致知道怎么配置/注入想要的。
一、准备
1.1 redis服务端的下载及安装
1.2 redis需要的jar
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
</dependency>
1.3 redis的应用场景
自己知道理解的就2个场景:1、缓存; 2、构建消息队列。 (参考:Redis作者谈Redis应用场景)
二、demo
2.1 redis的可用配置
# REDIS (RedisProperties)
spring.redis.cluster.max-redirects= # Maximum number of redirects to follow when executing commands across the cluster.
spring.redis.cluster.nodes= # Comma-separated list of "host:port" pairs to bootstrap from.
spring.redis.database=0 # Database index used by the connection factory.
spring.redis.url= # Connection URL, will override host, port and password (user will be ignored), e.g. redis://user:password@example.com:6379
spring.redis.host=localhost # Redis server host.
spring.redis.password= # Login password of the redis server.
spring.redis.ssl=false # Enable SSL support.
spring.redis.pool.max-active=8 # Max number of connections that can be allocated by the pool at a given time. Use a negative value for no limit.
spring.redis.pool.max-idle=8 # Max number of "idle" connections in the pool. Use a negative value to indicate an unlimited number of idle connections.
spring.redis.pool.max-wait=-1 # Maximum amount of time (in milliseconds) a connection allocation should block before throwing an exception when the pool is exhausted. Use a negative value to block indefinitely.
spring.redis.pool.min-idle=0 # Target for the minimum number of idle connections to maintain in the pool. This setting only has an effect if it is positive.
spring.redis.port=6379 # Redis server port.
spring.redis.sentinel.master= # Name of Redis server.
spring.redis.sentinel.nodes= # Comma-separated list of host:port pairs.
spring.redis.timeout=0 # Connection timeout in milliseconds.
2.2 StringRedisTemplate的注入
与JdbcTemplate一样,在spring boot中注入StringRedisTemplate是相当简单的事。这也是使用redis的核心之一。
如果,不指定配置RedisConnectionFactory,默认情况下将尝试使用localhost:6379连接Redis服务器。
@SpringBootApplication
@EnableCaching //允许缓存 (此demo允许redis缓存)
public class RedisApplication {
@Bean
StringRedisTemplate template(RedisConnectionFactory connectionFactory) {
return new StringRedisTemplate(connectionFactory);
} public static void main(String[] args) {
SpringApplication.run(RedisApplication.class, args);
}
}
2,3 controller模拟
@Controller
public class RedisController {
private static final String STR_REDIS_KEY = "vergil"; @Autowired
private StringRedisTemplate redisTemplate;
@Autowired
private RedisCacheDao cacheDao; @GetMapping("/redis")
public String index() {
return "redis/redis_index";
} @PostMapping("/setString")
@ResponseBody
public Map<String, Object> setString(String value) {
redisTemplate.opsForValue().set(STR_REDIS_KEY, value);
Map<String, Object> map = new HashMap<String, Object>();
map.put("msg", "ok");
return map;
} @PostMapping("/getString")
@ResponseBody
public Map<String, Object> getString() {
String value = redisTemplate.opsForValue().get(STR_REDIS_KEY);
Map<String, Object> map = new HashMap<String, Object>();
map.put("value", value);
map.put("msg", "ok");
return map;
} @PostMapping("/getCache")
@ResponseBody
public RedisCacheBean get(@RequestParam String id) {
return cacheDao.get(id);
}
}
2.4 view页面效果
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<script type="text/javascript" src="./static/common/jquery-2.1.4.js"></script>
<title>spring boot redis</title>
<script type="text/javascript"> /*<![CDATA[*/
function setString() {
$.ajax({
type : 'POST',
url : '/setString',
data : {"value":$("#value").val()},
success : function(r) {
alert(r.msg);
},
error : function() {
alert('error!')
}
});
} function getString() {
$.ajax({
type : 'POST',
contentType : 'application/json',
url : '/getString',
success : function(r) {
alert(r.msg);
$("#result").text(JSON.stringify(r));
},
error : function() {
alert('error!')
}
});
}
function getCache() {
$.ajax({
type : 'POST',
contentType : 'application/json',
url : '/getCache?id='+$("#cacheId").val(),
success : function(r) {
$("#cacheResult").text(JSON.stringify(r));
},
error : function() {
alert('error!')
}
});
}
/*]]>*/
</script>
</head>
<body>
<h4>base redis</h4>
<input type="text" id="value" />
<input type="button" value="设置" onclick="setString()" /><br/>
<input type="button" value="获取" onclick="getString()" /><br/>
<h5>结果:</h5>
<p id="result"></p>
<br /> <h4>redis cache</h4>
<input type="text" id="cacheId" /><br/>
<input type="button" value="获取缓存" onclick="getCache()" /><br/>
<h5>缓存结果:</h5>
<p id="cacheResult"></p>
</body>
</html>
效果:
1、当点击"设置",把输入值保存到redis缓存。
2、当点击"获取",从redis中获取到1中设置的值。
(简单理解就是java中的map)
2.5 redis开启缓存模式
1、如果是缓存模式,那么必须在*Application中加入注解:@EnableCaching。
2、@Cacheable注解可以用在方法或者类级别。当他应用于方法级别的时候,就是如上所说的缓存返回值。当应用在类级别的时候,这个类的所有方法的返回值都将被缓存。
(注:@Cacheable是spring提供的,并不是redis。详细用处及细节可另看。)
@Repository
public class RedisCacheDao { /**
* 模拟从数据库获取的数据
*/
@Cacheable(value = "redisCacheBean", key = "'.id.'+#id")
public RedisCacheBean get(String id) {
RedisCacheBean redisCacheBean = new RedisCacheBean(id, "name_"+id, new Date(), id.length() * 10);
return redisCacheBean;
}
}

public class RedisCacheBean implements Serializable{
private static final long serialVersionUID = 1L;
public String id;
public String name;
public String date;
public int quantity; public RedisCacheBean(String id, String name, Date date, int quantity) {
super();
this.id = id;
this.name = name;
this.date = new SimpleDateFormat("yyyy-MM-dd HH:mm:sss").format(date);
this.quantity = quantity;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public int getQuantity() {
return quantity;
}
public void setQuantity(int quantity) {
this.quantity = quantity;
} }
RedisCacheBean.java
三、题外话
简单整合redis就这么点东西,没任何别的有深度的东西。所以spring boot的“约定优于配置”,简化了相当多的项目构建。
另外,不光redis包括其他的java开源jar。如果你只是写一个demo,写一个“Hello World”真的不要太简单。就像用excel一样,上手会用很简单,但真要精通灵活相当之复杂。
所以,如果有毅力、兴趣、时间,还是应该深入看一下,不要只在表面用、写业务逻辑代码。看看那些好的jar是怎么实现的。
(其实最近都是强迫自己写博客,但写完一看没任何东西,无奈...各种烦心事...)