问题导读:
1.如何使用注解的方式,将Redis缓存整合到Spring项目?
2.如何用Redis来继承实现CacheService接口?
本文介绍了如何使用注解的方式,将Redis缓存整合到你的Spring项目。
首先我们将使用jedis驱动,进而开始配置我们的Gradle。
[mw_shl_code=bash,true]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'
}[/mw_shl_code]
紧接着我们将使用Spring注解,继续执行Redis装载配置。
[mw_shl_code=bash,true]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()));
}
}[/mw_shl_code]
下一步将创建缓存接口CacheService
[mw_shl_code=bash,true]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);
}[/mw_shl_code]
当然用户既可以增加一条消息也能取回一条消息。因此,在实现过程中,用户相关信息的存在时间将默认设为一分钟。
我们用Redis来继承实现CacheService接口。
[mw_shl_code=bash,true]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);
}
}[/mw_shl_code]
我们的缓存机制将保留每个用户发送的消息列表。为了实现这个功能我们将调用ListOperations接口,同时将每个user作为一个key键值。通过RedisOperations接口,我们可以为key设置特定存在时长。在本例中,主要使用的是 user key。
下一步我们将创建一个controller注入缓存服务。
[mw_shl_code=bash,true]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";
}
}[/mw_shl_code]
最后完成类Application的创建。
[mw_shl_code=bash,true]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);
}
}[/mw_shl_code]
经过如上步骤,接下来直接运行Application即可。
原文链接:Integrate Redis into a Spring Project( 译者/丘志鹏 审校/朱正贵 责编/仲浩)
译者简介:邱志鹏,关注大数据、机器学习。
|
|