本文展示了如何通过注释配置将Redis缓存集成到您的spring项目中。
我们将从Gradle配置开始。 我们将使用jedis驱动程序。
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()));
}
}
下一步是创建我们的缓存界面
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接口。 RedisOperations界面使我们能够指定密钥的生存时间。 在我们的情况下,它用作用户密钥。
接下来,我们创建一个注入了缓存服务的控制器。
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);
}
}
为了运行只是问题
gradle bootRun
翻译自: https://www.javacodegeeks.com/2015/08/integrate-redis-to-your-spring-project.html