zoukankan      html  css  js  c++  java
  • 【spring boot】SpringBoot初学(8)– 简单整合redis

    前言

      到目前为止,把项目中需要用到的:properties读取、数据源配置、整合mybatis/JdbcTemplate、AOP、WebService、redis、filter、interceptor、定时器等,都简单的去用spring boot整合学习了一下。与学习之初对spring boot的理解并没有什么大的区别,只是大致知道怎么配置/注入想要的。

    一、准备

      1.1 redis服务端的下载及安装

        官网:https://redis.io/

      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是怎么实现的。

      (其实最近都是强迫自己写博客,但写完一看没任何东西,无奈...各种烦心事...)

  • 相关阅读:
    Codeforces 787D. Legacy 线段树优化建图+最短路
    Codeforces 1051E. Vasya and Big Integers
    BZOJ3261 最大异或和
    BZOJ3531 SDOI2014 旅行
    洛谷P2468 SDOI 2010 粟粟的书架
    2018 ICPC 焦作网络赛 E.Jiu Yuan Wants to Eat
    HDU6280 From Tree to Graph
    HDU5985 Lucky Coins 概率dp
    (HDU)1334 -- Perfect Cubes (完美立方)
    (HDU)1330 -- Deck (覆盖物)
  • 原文地址:https://www.cnblogs.com/VergiLyn/p/6629610.html
Copyright © 2011-2022 走看看