大家都知道redis的强大之处,在目前应用上也是大显神威。
先说说他的优点:
1 读写性能优异
2 支持数据持久化,支持AOF日志和RDB快照两种持久化方式
3 支持主从复制,主机会自动将数据同步到从机,可以进行读写分离。
4 数据结构丰富:除了支持string类型的value外还支持string、hash、set、sortedset、list等数据结构。
那么现在我们在 StringBoot+mysql的基础上引入Redis缓存中间件。
(关于SpringBoot+mysql的Demo可查看SpringBoot+Mysql )
1.先看下完成后的代码结构
2. 操作如下
a.在pom.xml引入如下依赖
org.springframework.boot
spring-boot-starter-data-redis
com.google.code.gson
gson
2.8.
b.添加 RedisConfiguration.java
package com.example.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
/**
* @ClassName: RedisConfiguration
* @Description: Redis Config
* @author mengfanzhu
* @date 2017年2月21日 下午2:03:26
*/
@Configuration
public class RedisConfiguration {
@Bean
@SuppressWarnings({ "rawtypes", "unchecked" })
public RedisTemplate redisTemplate(RedisConnectionFactory redisFactory){
StringRedisTemplate template = new StringRedisTemplate(redisFactory);
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new
Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
}
c.添加 UserRedis.java
package com.example.service;
import java.util.List;
import java.util.concurrent.TimeUnit;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Repository;
import com.example.entity.User;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
/**
* @ClassName: UserRedis
* @Description: redis 提供5种数据类型的操作
* String ,hash ,list , set , zset
* @author mengfanzhu
* @date 2017年2月21日 下午2:01:43
*/
@Repository
public class UserRedis {
@Autowired
private RedisTemplate redisTemplate;
public void addUser(String key,Long time,User user){
Gson gson = new Gson();
redisTemplate.opsForValue().set(key, gson.toJson(user),time,TimeUnit.MINUTES);
}
public void addUserList(String key,Long time,List userList){
Gson gson = new Gson();
redisTemplate.opsForValue().set(key, gson.toJson(userList),time,TimeUnit.MINUTES);
}
public User getUserByKey(String key){
Gson gson = new Gson();
User user = null;
String userJson = redisTemplate.opsForValue().get(key);
if(StringUtils.isNotEmpty(userJson)){
user = gson.fromJson(userJson, User.class);
}
return user;
}
public List getUserListByKey(String key){
Gson gson = new Gson();
List userList = null;
String userJson = redisTemplate.opsForValue().get(key);
if(StringUtils.isNotEmpty(userJson)){
userList = gson.fromJson(userJson, new TypeToken>(){}.getType() );
}
return userList;
}
public void deleteByKey(String key){
redisTemplate.opsForValue().getOperations().delete(key);
}
}
d.添加 UserRedisService.java
package com.example.service;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.util.Assert;
import com.example.config.RedisConfiguration;
import com.example.entity.Department;
import com.example.entity.Role;
import com.example.entity.User;
/**
* @ClassName: UserRedisService
* @Description: user redis
* @author mengfanzhu
* @date 2017年2月21日 下午2:25:39
*/
@Service
@ContextConfiguration(classes = {RedisConfiguration.class,UserRedis.class} )
public class UserRedisService {
private Logger logger = LoggerFactory.getLogger(UserRedisService.class);
@Autowired
private UserRedis userRedis;
public void redisInitData(){
Department department = new Department();
department.setName("科技部REDIS");
Role role = new Role();
role.setName("管理员REDIS");
List roleList = new ArrayList();
roleList.add(role);
User user =new User();
user.setName("管理员REDIS");
user.setLoginName("adminRedis");
user.setCreatedate(new Date());
user.setRoleList(roleList);
user.setDepartment(department);
logger.info("key:" + this.getClass().getName()+":userByLoginName:"+user.getLoginName());
userRedis.deleteByKey(this.getClass().getName()+":userByLoginName:"+user.getLoginName());
userRedis.addUser(this.getClass().getName()+":userByLoginName:"+user.getLoginName(),3600L,user);
}
public User getUserRedis(String loginName){
User user = userRedis.getUserByKey(this.getClass().getName()+":userByLoginName:"+loginName);
Assert.notNull(user,"用户为空!");
logger.info("===user=== name:{},loginName: {},departmentName:{}, roleName:{}",
user.getName(),user.getLoginName(),user.getDepartment().getName(),user.getRoleList().get().getName());
return user;
}
}
e.application.yml 配置如下(redis host,port,password,database 注意)
#redis
redis:
#database:
host: 100.100.100.100
port:
password:
database:
pool:
max-idle:
min-idle:
max-active:
max-wait: -1
f. UserController.java 添加
@Autowired
private UserRedisService userRedisService;
/**
* @Title: UserController
* @Description: 初始化redis数据
* @return
* @author mengfanzhu
* @throws
*/
@RequestMapping("/initRedisdata")
@ResponseBody
public String initRedisData(){
userRedisService.redisInitData();
return "success";
}
@RequestMapping("/getUserRedisByLoginName/{loginName}")
@ResponseBody
public Map getUserRedisByLoginName(@PathVariable String loginName){
Map result = new HashMap();
User user = userRedisService.getUserRedis(loginName);
Assert.notNull(user);
result.put("name", user.getName());
result.put("loginName", user.getLoginName());
result.put("departmentName",user.getDepartment().getName());
result.put("roleName", user.getRoleList().get().getName());
return result;
}
3.运行效果
a.浏览器输入 localhost:9090/user/initRedisdata
b.查看redis
c.浏览器查看数据