前言
到目前为止,把项目中需要用到的: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; } }
三、题外话
简单整合redis就这么点东西,没任何别的有深度的东西。所以spring boot的“约定优于配置”,简化了相当多的项目构建。
另外,不光redis包括其他的java开源jar。如果你只是写一个demo,写一个“Hello World”真的不要太简单。就像用excel一样,上手会用很简单,但真要精通灵活相当之复杂。
所以,如果有毅力、兴趣、时间,还是应该深入看一下,不要只在表面用、写业务逻辑代码。看看那些好的jar是怎么实现的。
(其实最近都是强迫自己写博客,但写完一看没任何东西,无奈...各种烦心事...)