zoukankan      html  css  js  c++  java
  • SpringBoot集成Redis做缓存处理

    (1)首先,在springboot项目pom.xml中引入redis依赖

    <dependency>
      <groupId>redis.clients</groupId>
      <artifactId>jedis</artifactId>
      <version>2.9.0</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

    (2)将redis需要的配置写入application.properties中方便修改时不改动代码

    # Redis数据库索引(默认为0)
    spring.redis.database=0
    # Redis服务器地址
    spring.redis.host=127.0.0.1
    # Redis服务器连接端口
    spring.redis.port=6379
    # Redis服务器连接密码(默认为空)
    spring.redis.password=
    # 连接池最大连接数(使用负值表示没有限制)
    spring.redis.pool.max-active=8
    # 连接池最大阻塞等待时间(使用负值表示没有限制)
    spring.redis.pool.max-wait=-1
    # 连接池中的最大空闲连接
    spring.redis.pool.max-idle=8
    # 连接池中的最小空闲连接
    spring.redis.pool.min-idle=0
    # 连接超时时间(毫秒)
    spring.redis.timeout=0
    # 设置key失效时间(秒)
    spring.redis.expire=600

    (3)在springboot中注册Redis配置,在启动时执行该配置

    RedisConfig.java(放在springboot能扫描到的包下)

    package com.zxyp.redis;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.core.StringRedisTemplate;
    
    import redis.clients.jedis.JedisPoolConfig;
    
    @Configuration
    public class RedisConfig {
    	@Value("${spring.redis.host}")
    	private String hostname;
    	@Value("${spring.redis.password}")
    	private String password;
    	@Value("${spring.redis.port}")
    	private Integer port;
    	@Value("${spring.redis.database}")
    	private Integer database;
    	@Bean
    	@ConfigurationProperties(prefix = "spring.redis")
    	public JedisPoolConfig getRedisConfig() {
    		JedisPoolConfig config = new JedisPoolConfig();
    		return config;
    	}
    
    	@Bean
    	@ConfigurationProperties(prefix = "spring.redis")
    	public JedisConnectionFactory getConnectionFactory(){
    		JedisConnectionFactory factory = new JedisConnectionFactory();
    		JedisPoolConfig config = getRedisConfig();
    		factory.setPoolConfig(config);
    		factory.setHostName(hostname);
    		factory.setPassword(password);
    		factory.setPort(port);
    		factory.setDatabase(database);
    		System.out.println("JedisConnectionFactory bean init success.");
    		return factory;
    	}
    
    	@Bean
    	public RedisTemplate<?, ?> getRedisTemplate() {
    		RedisTemplate<?, ?> template = new StringRedisTemplate(getConnectionFactory());
    		return template;
    	}
    }
    

    (4)根据需求写对应的redis缓存服务接口,我这里写了get取缓存,set存缓存,expire给缓存设置对应的失效时间,flushall清空所有缓存,delete清空对应key的缓存

    RedisDao.java (service层接口)

    package com.zxyp.redis;
    
    public interface RedisDao {
    	public void set(String key,String value);
    	
    	public String get(String key);
    	
    	public void delete(String key);
    
    	public void expire(String key, Long value);
    
    	void flushall();
    }
    

    (5)实现Service层RedisDao接口

    RedisDaoImpl.java

    package com.zxyp.redis.impl;
    
    import javax.annotation.Resource;
    
    import org.springframework.dao.DataAccessException;
    import org.springframework.data.redis.connection.RedisConnection;
    import org.springframework.data.redis.core.RedisCallback;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.data.redis.serializer.RedisSerializer;
    import org.springframework.stereotype.Repository;
    
    import com.zxyp.redis.RedisDao;
    
    
    @Repository("springdatadao")
    public class SpringDataRedisDaoImpl implements RedisDao {
    
    	@Resource
    	private RedisTemplate<String, String> redisTemplate;
    
    	@Override
    	public void set(String key, String value) {
    		redisTemplate.execute(new RedisCallback<Boolean>() {
    			@Override
    			public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
    				RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
    				connection.set(serializer.serialize(key), serializer.serialize(value));
    				return true;
    			}
    		});
    
    	}
    
    	@Override
    	public String get(String key) {
    		try {
    			String result = redisTemplate.execute(new RedisCallback<String>() {
    				@Override
    				public String doInRedis(RedisConnection connection) throws DataAccessException {
    					RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
    					byte[] value = connection.get(serializer.serialize(key));
    					return serializer.deserialize(value);
    				}
    			});
    			return result;
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		return "destory";
    	}
    
    	@Override
    	public void delete(String key) {
    		redisTemplate.execute(new RedisCallback<Object>() {
    			@Override
    			public Object doInRedis(RedisConnection connection) throws DataAccessException {
    				connection.del(key.getBytes());
    				return null;
    			}
    		});
    	}
    	
    	@Override
    	public void expire(String key, Long value) {
    		redisTemplate.execute(new RedisCallback<Boolean>() {
    			@Override
    			public Boolean doInRedis(RedisConnection connection) throws DataAccessException {
    				RedisSerializer<String> serializer = redisTemplate.getStringSerializer();
    				connection.expire(serializer.serialize(key), value);
    				return true;
    			}
    		});
    
    	}
    	
    	@Override
    	public void flushall() {
    		redisTemplate.execute(new RedisCallback<Object>() {
    			@Override
    			public Object doInRedis(RedisConnection connection) throws DataAccessException {
    				connection.flushAll();
    				return null;
    			}
    		});
    	}
    
    }

    说明:get之所以要检测异常,是因为redis服务可能会挂掉,如果服务挂掉可以通过返回值判断,并作出处理,不会影响业务

    (6)Redis服务的使用,在对应需要调用服务的Controller中注入该Service层接口,调用对应的方法即可,这里是我使用的示例,仅供参考

    ContenController.java (此Controller引用了自己项目封装的pager,不能直接使用,只是作为使用redis的参考)

    package com.zxyp.controller;
    
    import java.util.List;
    import java.util.Map;
    
    import javax.annotation.Resource;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.alibaba.fastjson.JSON;
    import com.zxyp.ContentService;
    import com.zxyp.UserService;
    import com.zxyp.base.web.BaseController;
    import com.zxyp.base.web.ResultEntity;
    import com.zxyp.dao.entity.Pager;
    import com.zxyp.domain.Govtheme;
    import com.zxyp.redis.RedisDao;
    
    @RestController
    @SuppressWarnings("rawtypes") 
    @RequestMapping("/shareContent")
    public class ContenController {
    
    	@Autowired
    	private ContentService contentService;
    	@Autowired
    	private UserService userService;
    	
    	@Resource
    	@Qualifier("springdatadao")
    	private RedisDao redisDao;
    	
    	@Value("${spring.redis.expire}")
    	private Long expiretime;
        /**
         * 查询部门列表内容
         * @return
         */
        @RequestMapping(value = "/shareDepartPager",method= RequestMethod.POST)
        public ResultEntity queryDepartContentPager(@RequestBody Map map){
        	
        	int pageSize = Integer.parseInt(map.get("pageSize")+"");
        	int currentPage = Integer.parseInt(map.get("currentPage")+"");
        	String type = map.get("type")+"";
        	String userid = map.get("userid")+"";
        	String fileid = (String)map.get("fileid");
        	String id = String.valueOf(map.get("id"));
        	String redisKey = String.valueOf(currentPage)+String.valueOf(pageSize)+type+userid+fileid+id;
        	Pager pager = null;
        	String pageStr = redisDao.get(redisKey);
        	if(!"destory".equals(pageStr)) {
        		if(pageStr != null) {
        			pager = JSON.parseObject(pageStr,Pager.class);
        		} else {
        			pager = new Pager();
        	    	pager.setPageSize(pageSize);
        	    	pager.setCurrentPage(currentPage);
        			pager = contentService.querySharePager(map, pager);
        			redisDao.set(redisKey, JSON.toJSONString(pager));
        			redisDao.expire(redisKey, expiretime);
        		}
    		} else {
    			pager = new Pager();
    	    	pager.setPageSize(pageSize);
    	    	pager.setCurrentPage(currentPage);
    			pager = contentService.querySharePager(map, pager);
    		}
    		
        	return ResultEntity.createSuccessInstance(pager);
        }
    }
    

      

  • 相关阅读:
    9月23日JavaScript作业----用DIV做下拉列表
    9月23日JavaScript作业----日期时间选择
    9月23日JavaScript作业----两个列表之间移动数据
    9月22日下午JavaScript----Document对象
    9月22日上午JavaScript----window对象
    9月20日下午JavaScript函数--递归
    9月20日上午JavaScript函数
    9月19日下午JavaScript数组冒泡排列和二分法
    9月19日上午JavaScript数组
    9月6日表格标签(table、行、列、表头)(补)
  • 原文地址:https://www.cnblogs.com/mituxiaogaoyang/p/8393471.html
Copyright © 2011-2022 走看看