博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Springboot+redis 整合
阅读量:4512 次
发布时间:2019-06-08

本文共 9180 字,大约阅读时间需要 30 分钟。

运行环境:

JDK1.7.

SpringBoot1.4.7

redis3.0.4

1.生成Springboot项目,分别添加web,redis依赖,具体的maven依赖如下

1      
2
org.springframework.boot
3
spring-boot-starter-data-redis
4
5
6
org.springframework.boot
7
spring-boot-starter-web
8
9 10
11
org.springframework.boot
12
spring-boot-starter-test
13
test
14

数据源

使用spring的默认配置

在 src/main/resources/application.properties 中配置数据源信息。

1 server.context-path=/redis 2 server.port=9099 3  4 # REDIS (RedisProperties) 5 # Redis数据库索引(默认为0) 6 spring.redis.database=0 7 # Redis服务器地址 8 spring.redis.host=192.168.0.106 9 # Redis服务器连接端口10 spring.redis.port=637911 # Redis服务器连接密码(默认为空)12 #Sspring.redis.password=13 # 连接池最大连接数(使用负值表示没有限制)14 spring.redis.pool.max-active=815 # 连接池最大阻塞等待时间(使用负值表示没有限制)16 spring.redis.pool.max-wait=-117 # 连接池中的最大空闲连接18 spring.redis.pool.max-idle=819 # 连接池中的最小空闲连接20 spring.redis.pool.min-idle=021 # 连接超时时间(毫秒)22 spring.redis.timeout=10

然后我们需要一个配置类,将配置文件与对象进行关联

新建一个RedisConfig类

@Configuration@EnableAutoConfigurationpublic class RedisConfig extends CachingConfigurerSupport {}

通过

@ConfigurationProperties

注解,将属性文件注入进来

@Bean    @ConfigurationProperties(prefix = "spring.redis")    public JedisPoolConfig getRedisConfig() {        JedisPoolConfig config = new JedisPoolConfig();        //System.out.println(config.getMaxWaitMillis());        return config;    }

这里需要注意的是,我们的属性文件并没有全部的注入进来,这里只是配置连接池的属性

我们还需要将redis的host,port等信息也注入进来

1 @Autowired 2     private Environment env; 3  4 @Bean 5     @ConfigurationProperties(prefix = "spring.redis") 6     public JedisConnectionFactory getConnectionFactory() { 7         JedisConnectionFactory factory = new JedisConnectionFactory(); 8         JedisPoolConfig config = getRedisConfig(); 9         factory.setPoolConfig(config);10         factory.setHostName(env.getProperty("spring.redis.host"));11         factory.setPort(Integer.parseInt(env.getProperty("spring.redis.port").trim()));12         factory.setDatabase(Integer.parseInt(env.getProperty("spring.redis.database").trim()));13         logger.info("JedisConnectionFactory bean init success.");14         return factory;15     }

这样我们的属性信息就都配置好了

我们就要开始连接redis服务器,实现我们的业务了,这里我们先介绍下 RedisTemplate

spring 封装了 RedisTemplate 对象来进行对redis的各种操作,它支持所有的 redis 原生的 api。

RedisTemplate中定义了对5种数据结构操作

1 redisTemplate.opsForValue();//操作字符串2 redisTemplate.opsForHash();//操作hash3 redisTemplate.opsForList();//操作list4 redisTemplate.opsForSet();//操作set5 redisTemplate.opsForZSet();//操作有序set

StringRedisTemplate与RedisTemplate

  • 两者的关系是StringRedisTemplate继承RedisTemplate。

  • 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。

  • SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。

    StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。

    RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

我们先来写一个简单的例子,来看看RedisTemplate是怎么操作的

还是在RedisConfig类里面

1 @Bean2     public RedisTemplate
getRedisTemplate() {3 RedisTemplate
template = new RedisTemplate();4 template.setConnectionFactory(getConnectionFactory());5 6 return template;7 }

然后我们新建一个service类,注入redisTemplate,操作相关的api,将键值对写入到redis服务器

 

1 @Autowired 2     private RedisTemplate
redisTemplate; 6 7 public void setKey(Map
> map) { 8 ValueOperations
opsForValue = redisTemplate.opsForValue(); 9 for (Map.Entry
> entry : map.entrySet()) {10 String jsonStringFromMap = JsonUtils.getJsonStringFromMap(entry.getValue());11 opsForValue.set(entry.getKey(), jsonStringFromMap);12 }13 }

 

再写一个controller类,注入service
@RequestMapping(value = "set")    public ResponseVo setKey() {        ResponseVo responseVo = new ResponseVo();        try {            Map
> map = new HashMap
>(); Map
map2 = new HashMap<>(); map2.put("value", "2"); map.put("boxUid", map2); demoService.setKey(map); responseVo.setInfo("操作成功"); responseVo.setData(map); } catch (Exception e) { responseVo.setInfo("操作失败"); responseVo.setData(e.getMessage()); } return responseVo; }

请求:http://localhost:9099/redis/demo/set

数据就写到redis数据库了。


 

序列化

RedisTemplate对象默认使用jdkSerializer实现序列化,如果想要更换序列化的实现方式,例如使用json实现value的序列化,可以进行如下配置

1 @Bean 2     Jackson2JsonRedisSerializer jackson2JsonRedisSerializer(ObjectMapper objectMapper) { 3         Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer( 4                 Object.class); 5         jackson2JsonRedisSerializer.setObjectMapper(objectMapper); 6         return jackson2JsonRedisSerializer; 7     } 8  9     @Bean10     RedisTemplate
objRedisTemplate(JedisConnectionFactory connectionFactory,11 Jackson2JsonRedisSerializer
jackson2JsonRedisSerializer) {12 RedisTemplate
redisTemplate = new RedisTemplate
();13 redisTemplate.setConnectionFactory(getConnectionFactory());14 redisTemplate.setDefaultSerializer(jackson2JsonRedisSerializer);15 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();16 redisTemplate.setKeySerializer(stringRedisSerializer);17 redisTemplate.setHashKeySerializer(stringRedisSerializer);18 return redisTemplate;19 }

redis的value将会以jason形式保存

 

对象序列化

除了String类型,实战中我们还经常会在Redis中存储对象,这时候我们就会想是否可以使用类似RedisTemplate<String, User>来初始化并进行操作。但是Spring Boot并不支持直接使用,需要我们自己实现RedisSerializer<T>接口来对传入对象进行序列化和反序列化,下面我们通过一个实例来完成对象的读写操作。

  • 创建要存储的对象:User
1 public class User implements Serializable { 2  3     /** 4      *  5      */ 6     private static final long serialVersionUID = -8289770787953160443L; 7  8     private String username; 9     private Integer age;10 11     public User() {12         super();13         // TODO Auto-generated constructor stub14     }15 16     public User(String username, Integer age) {17         this.username = username;18         this.age = age;19     }20 21     public String getUsername() {22         return username;23     }24 25     public void setUsername(String username) {26         this.username = username;27     }28 29     public Integer getAge() {30         return age;31     }32 33     public void setAge(Integer age) {34         this.age = age;35     }36 37 }

 

  • 实现对象的序列化接口
1 public class RedisObjectSerializer implements RedisSerializer { 2     // private Converter
serializer = new SerializingConverter(); 3 // private Converter
deserializer = new 4 // DeserializingConverter(); 5 static final byte[] EMPTY_ARRAY = new byte[0]; 6 7 @Override 8 public Object deserialize(byte[] bytes) { 9 if (isEmpty(bytes)) {10 return null;11 }12 ObjectInputStream oii = null;13 ByteArrayInputStream bis = null;14 bis = new ByteArrayInputStream(bytes);15 try {16 oii = new ObjectInputStream(bis);17 Object obj = oii.readObject();18 return obj;19 } catch (Exception e) {20 21 e.printStackTrace();22 }23 return null;24 }25 26 @Override27 public byte[] serialize(Object object) {28 if (object == null) {29 return EMPTY_ARRAY;30 }31 ObjectOutputStream obi = null;32 ByteArrayOutputStream bai = null;33 try {34 bai = new ByteArrayOutputStream();35 obi = new ObjectOutputStream(bai);36 obi.writeObject(object);37 byte[] byt = bai.toByteArray();38 return byt;39 } catch (IOException e) {40 e.printStackTrace();41 }42 return null;43 }44 45 private boolean isEmpty(byte[] data) {46 return (data == null || data.length == 0);47 }48 }
  • 配置针对User的RedisTemplate实例
@Bean    public RedisTemplate
redisTemplate(RedisConnectionFactory factory) { RedisTemplate
template = new RedisTemplate
(); template.setConnectionFactory(getConnectionFactory()); template.setKeySerializer(new StringRedisSerializer()); template.setValueSerializer(new RedisObjectSerializer()); return template; }
  • 完成了配置工作后,编写测试用例实验效果
@Autowired    private RedisTemplate
redisUserTemplate;public void setUser(User user) { ValueOperations
opsForValue = redisUserTemplate.opsForValue(); opsForValue.set(user.getUsername(), user); Integer age = opsForValue.get(user.getUsername()).getAge(); String username = opsForValue.get(user.getUsername()).getUsername(); System.out.println(age + " " + username); }

最后的结果是会输出年龄和姓名。

 

源代码

相关示例代码在

转载于:https://www.cnblogs.com/xmzJava/p/7336918.html

你可能感兴趣的文章
POJ 1083
查看>>
单变量微积分笔记16——定积分的应用1(对数与面积)
查看>>
ACM模板——最短路
查看>>
实验3 分支语句和循环语句(1)
查看>>
JSP页面上添加Fckeditor
查看>>
scrapyd spiderkeeper docker部署
查看>>
Qt教程
查看>>
http://linux-mtd.infradead.org/doc/nand.html nand
查看>>
Verilog语言:还真的是人格分裂的语言
查看>>
BTC全节点搭建
查看>>
mac安装Redis可视化工具-Redis Desktop Manager
查看>>
css3_圆角导航栏(2例)
查看>>
Xcode SDK模拟器安装及安装路径
查看>>
uva1625颜色的长度
查看>>
待研究
查看>>
C语言对结构体何时用-> , 何时用.
查看>>
Android 常用命令集的使用
查看>>
Android ADT,SDK的安装,让人烦恼的在线方式!
查看>>
mac显示隐藏文件
查看>>
RobotFramework下的http接口自动化Follow Response关键字的使用
查看>>