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

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

  • 相关阅读:
    LeetCode-Number of Islands
    LeetCode-Minimum Height Trees
    百度地图采集
    三层自动生成 完整源代码(for oracle)
    在Oracle中更新数据时,抛出:ORA-01008: not all variables bound
    MD5加密 及获得密码盐
    验证:非空、手机号、邮箱
    向Oracle数据库中插入数据出错:ORA-01036 无效的变量名或数据
    反射ORM
    委托事件
  • 原文地址:https://www.cnblogs.com/VergiLyn/p/6629610.html
Copyright © 2011-2022 走看看