转载

Redis整合Spring项目搭建实例

本文介绍了如何使用注解的方式,将Redis缓存整合到你的Spring项目。

首先我们将使用jedis驱动,进而开始配置我们的Gradle。

group 'com.gkatzioura.spring' version '1.0-SNAPSHOT' apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'idea' apply plugin: 'spring-boot' buildscript {  repositories {   mavenCentral()  }  dependencies {   classpath("org.springframework.boot:spring-boot-gradle-plugin:1.2.5.RELEASE")  } } jar {  baseName = 'gs-serving-web-content'  version =  '0.1.0' } sourceCompatibility = 1.8 repositories {  mavenCentral() } dependencies {  compile "org.springframework.boot:spring-boot-starter-thymeleaf"  compile 'org.slf4j:slf4j-api:1.6.6'  compile 'ch.qos.logback:logback-classic:1.0.13'  compile 'redis.clients:jedis:2.7.0'  compile 'org.springframework.data:spring-data-redis:1.5.0.RELEASE'  testCompile group: 'junit', name: 'junit', version: '4.11' } task wrapper(type: Wrapper) {  gradleVersion = '2.3' } 

紧接着我们将使用Spring注解,继续执行Redis装载配置。

package com.gkatzioura.spring.config; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; 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.connection.jedis.JedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport {  @Bean  public JedisConnectionFactory redisConnectionFactory() {   JedisConnectionFactory jedisConnectionFactory = new JedisConnectionFactory();   jedisConnectionFactory.setUsePool(true);   return jedisConnectionFactory;  }  @Bean  public RedisSerializer redisStringSerializer() {   StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();   return stringRedisSerializer;  }  @Bean(name="redisTemplate")  public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory cf,RedisSerializer redisSerializer) {   RedisTemplate<String, String> redisTemplate = new RedisTemplate<String, String>();   redisTemplate.setConnectionFactory(cf);   redisTemplate.setDefaultSerializer(redisSerializer);   return redisTemplate;  }  @Bean  public CacheManager cacheManager() {   return new RedisCacheManager(redisTemplate(redisConnectionFactory(),redisStringSerializer()));  } } 

下一步将创建缓存接口CacheService。

package com.gkatzioura.spring.cache; import java.util.Date; import java.util.List; public interface CacheService {     public void addMessage(String user,String message);     public List<String> listMessages(String user); }

当然用户既可以增加一条消息也能取回一条消息。因此,在实现过程中,用户相关信息的存在时间将默认设为一分钟。

我们用Redis来继承实现CacheService接口。

package com.gkatzioura.spring.cache.impl; import com.gkatzioura.spring.cache.CacheService; import org.springframework.data.redis.core.ListOperations; import org.springframework.data.redis.core.RedisOperations; import org.springframework.data.redis.core.SetOperations; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.time.ZonedDateTime; import java.time.temporal.ChronoUnit; import java.util.Date; import java.util.List; @Service("cacheService") public class RedisService implements CacheService {  @Resource(name = "redisTemplate")  private ListOperations<String, String> messageList;  @Resource(name = "redisTemplate")  private RedisOperations<String,String> latestMessageExpiration;  @Override  public void addMessage(String user,String message) {   messageList.leftPush(user,message);   ZonedDateTime zonedDateTime = ZonedDateTime.now();   Date date = Date.from(zonedDateTime.plus(1, ChronoUnit.MINUTES).toInstant());   latestMessageExpiration.expireAt(user,date);  }  @Override  public List<String> listMessages(String user) {   return messageList.range(user,0,-1);  } } 

我们的缓存机制将保留每个用户发送的消息列表。为了实现这个功能我们将调用ListOperations接口,同时将每个user作为一个key键值。通过RedisOperations接口,我们可以为key设置特定存在时长。在本例中,主要使用的是 user key。

下一步我们将创建一个controller注入缓存服务。

package com.gkatzioura.spring.controller; import com.gkatzioura.spring.cache.CacheService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.List; @RestController public class MessageController {  @Autowired  private CacheService cacheService;  @RequestMapping(value = "/message",method = RequestMethod.GET)  @ResponseBody  public List<String> greeting(String user) {   List<String> messages = cacheService.listMessages(user);   return messages;  }  @RequestMapping(value = "/message",method = RequestMethod.POST)  @ResponseBody  public String saveGreeting(String user,String message) {   cacheService.addMessage(user,message);   return "OK";  } } 

最后完成类Application的创建。

package com.gkatzioura.spring; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application {     public static void main(String[] args) {         SpringApplication.run(Application.class, args);     } }

经过如上步骤,接下来直接运行Application即可。

原文链接: Integrate Redis into a Spring Project ( 译者/丘志鹏 审校/朱正贵 责编/仲浩)

译者简介: 邱志鹏,关注大数据、机器学习。

正文到此结束
Loading...