From b29c13a87c856b4c7d38fda2423d3ca280273ccd Mon Sep 17 00:00:00 2001 From: LuWenhui <1265400024@qq.com> Date: Fri, 28 Oct 2016 23:56:22 +0800 Subject: [PATCH] =?UTF-8?q?=EF=BC=88=E4=BA=94=EF=BC=89=E6=95=B4=E5=90=88Re?= =?UTF-8?q?dis?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 11 ++ .../core/controller/BaseRedisController.java | 50 ++++++++ .../core/dao/impl/RedisBaseDaoImpl.java | 107 ++++++++++++++++++ .../com/training/core/redis/RedisConfig.java | 50 ++++++++ .../core/redis/RedisObjectSerializer.java | 43 +++++++ .../service/impl/RedisBaseServiceImpl.java | 46 ++++++++ .../redis/controller/DemoRedisController.java | 19 ++++ .../com/training/redis/entity/DemoRedis.java | 9 ++ .../redis/service/DemoRedisService.java | 8 ++ .../service/impl/DemoRedisServiceImpl.java | 14 +++ src/main/resources/application.yml | 12 +- 11 files changed, 367 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/training/core/controller/BaseRedisController.java create mode 100644 src/main/java/com/training/core/dao/impl/RedisBaseDaoImpl.java create mode 100644 src/main/java/com/training/core/redis/RedisConfig.java create mode 100644 src/main/java/com/training/core/redis/RedisObjectSerializer.java create mode 100644 src/main/java/com/training/core/service/impl/RedisBaseServiceImpl.java create mode 100644 src/main/java/com/training/redis/controller/DemoRedisController.java create mode 100644 src/main/java/com/training/redis/entity/DemoRedis.java create mode 100644 src/main/java/com/training/redis/service/DemoRedisService.java create mode 100644 src/main/java/com/training/redis/service/impl/DemoRedisServiceImpl.java diff --git a/pom.xml b/pom.xml index 04e9cd6..c576c36 100644 --- a/pom.xml +++ b/pom.xml @@ -153,6 +153,17 @@ ${spring-security.version} + + + org.springframework.boot + spring-boot-starter-redis + + + + org.springframework.boot + spring-boot-starter-cache + + io.springfox diff --git a/src/main/java/com/training/core/controller/BaseRedisController.java b/src/main/java/com/training/core/controller/BaseRedisController.java new file mode 100644 index 0000000..f35dc89 --- /dev/null +++ b/src/main/java/com/training/core/controller/BaseRedisController.java @@ -0,0 +1,50 @@ +package com.training.core.controller; + +import io.swagger.annotations.ApiImplicitParam; +import io.swagger.annotations.ApiOperation; + +import javax.annotation.Resource; + +import org.springframework.web.bind.annotation.PathVariable; +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.ResponseBody; + +import com.training.core.dao.impl.RedisBaseDaoImpl; +import com.training.core.dto.ResultDataDto; +import com.training.core.entity.BaseEntity; +import com.training.core.util.GenericeClassUtils; + +public class BaseRedisController extends BaseController { + + @SuppressWarnings("unchecked") + protected Class entityClass = (Class) GenericeClassUtils.getSuperClassGenricType(this.getClass(), 0); + + @Resource(name = "redisBaseDao") + protected RedisBaseDaoImpl baseDao; + + /** + * 根据Id查询实体 + */ + @ApiOperation(value="根据Id查询实体", notes="getEntityById") + @ApiImplicitParam(name = "id", value = "用户ID", required = true, dataType = "Integer") + @RequestMapping(value = "/getEntityById/{id}", method = RequestMethod.GET) + public @ResponseBody ResultDataDto getEntityById(@PathVariable(value = "id") final Integer id) { + T entity = baseDao.getEntityById(entityClass, id); + return new ResultDataDto(entity); + } + + /** + * 新增实体 + */ + @ApiOperation(value="新增实体", notes="addEntity") + @ApiImplicitParam(name = "entity", value = "实体Json", required = true, dataType = "application/json") + @RequestMapping(value = "/addEntity", method = RequestMethod.POST, consumes = "application/json") + public @ResponseBody ResultDataDto addEntity(@RequestBody final T entity) { + baseDao.addEntity(entity); + return ResultDataDto.addAddSuccess(); + } + + +} diff --git a/src/main/java/com/training/core/dao/impl/RedisBaseDaoImpl.java b/src/main/java/com/training/core/dao/impl/RedisBaseDaoImpl.java new file mode 100644 index 0000000..ec97dc6 --- /dev/null +++ b/src/main/java/com/training/core/dao/impl/RedisBaseDaoImpl.java @@ -0,0 +1,107 @@ +package com.training.core.dao.impl; + +import java.io.Serializable; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +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 com.google.gson.Gson; +import com.training.core.dao.BaseDao; +import com.training.core.dto.FlexiPageDto; +import com.training.core.entity.BaseEntity; + +import org.springframework.stereotype.Repository; + +import tk.mybatis.mapper.entity.Example; + +@Repository("redisBaseDao") +public class RedisBaseDaoImpl implements BaseDao { + + @Autowired + protected RedisTemplate redisTemplate; + + @Override + public T getEntityById(final Class cls, final Integer id) { + return redisTemplate.execute(new RedisCallback() { + @Override + public T doInRedis(RedisConnection connection) throws DataAccessException { + byte[] key = redisTemplate.getStringSerializer().serialize(cls.getName() + "_" + id); + if (connection.exists(key)) { + byte[] value = connection.get(key); + String json = redisTemplate.getStringSerializer().deserialize(value); + return new Gson().fromJson(json, cls); + } + return null; + } + }); + } + + public void addEntity(final T entity) { + redisTemplate.execute(new RedisCallback() { + + @Override + public Object doInRedis(RedisConnection connection) throws DataAccessException { + connection.set(redisTemplate.getStringSerializer().serialize(entity.getClass().getName() + "_" + entity.getId()), + redisTemplate.getStringSerializer().serialize(new Gson().toJson(entity))); + return null; + } + }); + } + + @Override + public void updateEntity(final T entity) { + redisTemplate.execute(new RedisCallback() { + + @Override + public Object doInRedis(RedisConnection connection) throws DataAccessException { + connection.set(redisTemplate.getStringSerializer().serialize(entity.getClass().getName() + "_" + entity.getId()), + redisTemplate.getStringSerializer().serialize(new Gson().toJson(entity))); + return null; + } + }); + } + + @Override + public void deleteEntityById(final Class cls, final Integer id) { + redisTemplate.execute(new RedisCallback() { + + @Override + public Object doInRedis(RedisConnection connection) throws DataAccessException { + connection.del(redisTemplate.getStringSerializer().serialize(cls.getName() + "_" + id.toString())); + return null; + } + }); + } + + @Override + public List selectAll(Class cls) { + return null; + } + + public void setRedisTemplate(RedisTemplate redisTemplate) { + this.redisTemplate = redisTemplate; + } + + @Override + public List findByLike(Example example) { + // TODO Auto-generated method stub + return null; + } + + @Override + public List findByPage(Example example, FlexiPageDto flexiPageDto) { + // TODO Auto-generated method stub + return null; + } + + @Override + public int findRowCount(Example example) { + // TODO Auto-generated method stub + return 0; + } + +} diff --git a/src/main/java/com/training/core/redis/RedisConfig.java b/src/main/java/com/training/core/redis/RedisConfig.java new file mode 100644 index 0000000..afff3ef --- /dev/null +++ b/src/main/java/com/training/core/redis/RedisConfig.java @@ -0,0 +1,50 @@ +package com.training.core.redis; + +import java.io.Serializable; +import java.lang.reflect.Method; + +import org.springframework.cache.CacheManager; +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.interceptor.KeyGenerator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; + +@Configuration +@EnableCaching +public class RedisConfig extends CachingConfigurerSupport { + + @Bean + public KeyGenerator biliKeyGenerator(){ + return new KeyGenerator() { + + @Override + public Object generate(Object target, Method method, Object... params) { + StringBuilder sb = new StringBuilder(); + sb.append(target.getClass().getName()); + sb.append(method.getName()); + for (Object obj : params) { + sb.append(obj.toString()); + } + return sb.toString(); + } + }; + + } + + @Bean + public CacheManager cacheManager(@SuppressWarnings("rawtypes") RedisTemplate redisTemplate) { + return new RedisCacheManager(redisTemplate); + } + + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate redisTemplate = new RedisTemplate(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + return redisTemplate; + } + +} diff --git a/src/main/java/com/training/core/redis/RedisObjectSerializer.java b/src/main/java/com/training/core/redis/RedisObjectSerializer.java new file mode 100644 index 0000000..3718550 --- /dev/null +++ b/src/main/java/com/training/core/redis/RedisObjectSerializer.java @@ -0,0 +1,43 @@ +package com.training.core.redis; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.core.serializer.support.DeserializingConverter; +import org.springframework.core.serializer.support.SerializingConverter; +import org.springframework.data.redis.serializer.RedisSerializer; +import org.springframework.data.redis.serializer.SerializationException; + +public class RedisObjectSerializer implements RedisSerializer { + + private Converter serializer = new SerializingConverter(); + private Converter deserializer = new DeserializingConverter(); + + static final byte[] EMPTY_ARRAY = new byte[0]; + + public Object deserialize(byte[] bytes) { + if (isEmpty(bytes)) { + return null; + } + + try { + return deserializer.convert(bytes); + } catch (Exception ex) { + throw new SerializationException("Cannot deserialize", ex); + } + } + + public byte[] serialize(Object object) { + if (object == null) { + return EMPTY_ARRAY; + } + + try { + return serializer.convert(object); + } catch (Exception ex) { + return EMPTY_ARRAY; + } + } + + private boolean isEmpty(byte[] data) { + return (data == null || data.length == 0); + } +} \ No newline at end of file diff --git a/src/main/java/com/training/core/service/impl/RedisBaseServiceImpl.java b/src/main/java/com/training/core/service/impl/RedisBaseServiceImpl.java new file mode 100644 index 0000000..a346e44 --- /dev/null +++ b/src/main/java/com/training/core/service/impl/RedisBaseServiceImpl.java @@ -0,0 +1,46 @@ +package com.training.core.service.impl; + +import javax.annotation.Resource; + +import com.training.core.dao.BaseDao; +import com.training.core.entity.BaseEntity; +import com.training.core.service.BaseService; +import com.training.core.util.GenericeClassUtils; + +import java.util.List; + +public class RedisBaseServiceImpl implements BaseService { + + @SuppressWarnings("unchecked") + protected Class entityClass = (Class) GenericeClassUtils.getSuperClassGenricType(this.getClass(), 0); + + @Resource(name = "redisBaseDao") + private BaseDao baseDao; + + @Override + public T getEntityById(Integer id) { + return baseDao.getEntityById(entityClass, id); + } + + @Override + public void addEntity(T entity) { + baseDao.addEntity(entity); + } + + @Override + public void updateEntity(T entity) { + baseDao.updateEntity(entity); + } + + @Override + public void deleteEntityById(Integer id) { + baseDao.deleteEntityById(entityClass, id); + } + + @Override + public List selectAll() { + return baseDao.selectAll(entityClass); + } + + +} diff --git a/src/main/java/com/training/redis/controller/DemoRedisController.java b/src/main/java/com/training/redis/controller/DemoRedisController.java new file mode 100644 index 0000000..6ff0c39 --- /dev/null +++ b/src/main/java/com/training/redis/controller/DemoRedisController.java @@ -0,0 +1,19 @@ +package com.training.redis.controller; + +import javax.annotation.Resource; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.training.core.controller.BaseRedisController; +import com.training.redis.entity.DemoRedis; +import com.training.redis.service.DemoRedisService; + +@RestController +@RequestMapping(value="/demoRedis") +public class DemoRedisController extends BaseRedisController { + + @Resource + private DemoRedisService demoRedisService; + +} diff --git a/src/main/java/com/training/redis/entity/DemoRedis.java b/src/main/java/com/training/redis/entity/DemoRedis.java new file mode 100644 index 0000000..c8104a2 --- /dev/null +++ b/src/main/java/com/training/redis/entity/DemoRedis.java @@ -0,0 +1,9 @@ +package com.training.redis.entity; + +import com.training.core.entity.BaseEntity; + +@SuppressWarnings("serial") +public class DemoRedis extends BaseEntity { + + +} diff --git a/src/main/java/com/training/redis/service/DemoRedisService.java b/src/main/java/com/training/redis/service/DemoRedisService.java new file mode 100644 index 0000000..6c61e34 --- /dev/null +++ b/src/main/java/com/training/redis/service/DemoRedisService.java @@ -0,0 +1,8 @@ +package com.training.redis.service; + +import com.training.core.service.BaseService; +import com.training.redis.entity.DemoRedis; + +public interface DemoRedisService extends BaseService { + +} diff --git a/src/main/java/com/training/redis/service/impl/DemoRedisServiceImpl.java b/src/main/java/com/training/redis/service/impl/DemoRedisServiceImpl.java new file mode 100644 index 0000000..45f25b0 --- /dev/null +++ b/src/main/java/com/training/redis/service/impl/DemoRedisServiceImpl.java @@ -0,0 +1,14 @@ +package com.training.redis.service.impl; + + +import org.springframework.stereotype.Service; + +import com.training.core.service.impl.RedisBaseServiceImpl; +import com.training.redis.entity.DemoRedis; +import com.training.redis.service.DemoRedisService; + +@Service +public class DemoRedisServiceImpl extends RedisBaseServiceImpl implements DemoRedisService { + + +} diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 85fe68e..fa6337d 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -20,5 +20,13 @@ spring: # testOnReturn: false # poolPreparedStatements: true # maxOpenPreparedStatements: 20 - - + redis: + database: 0 + host: 192.168.2.66 + password: 123 + port: 6379 + pool: + max-idle: 8 + min-idle: 0 + max-active: 10 + max-wait: -1