使用SpringBoot,很难避开使用Redis数据库吧。基本的安装和使用参考文章中都写得很明白了,我就是从参考文章入的门,没有什么问题。
1.安装
总结在另一篇文章中Redis相关知识点
2.添加依赖
1 2 3 4 5
| <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
|
3.配置数据库连接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| spring:
redis: host: 127.0.0.1 port: 6379 database: 0
jedis: pool: max-active: 50 max-wait: 3000 max-idle: 20 min-idle: 2 timeout: 5000
|
4.编写Redis操作工具类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| package com.bibichuan.phemsjava.boot;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Component;
@Component public class RedisUtils {
@Autowired private RedisTemplate<String, String> redisTemplate;
public String get(final String key) { return redisTemplate.opsForValue().get(key); }
public boolean set(final String key, String value) { boolean result = false; try { redisTemplate.opsForValue().set(key, value); result = true; } catch (Exception e) { e.printStackTrace(); } return result; }
public boolean getAndSet(final String key, String value) { boolean result = false; try { redisTemplate.opsForValue().getAndSet(key, value); result = true; } catch (Exception e) { e.printStackTrace(); } return result; }
public boolean delete(final String key) { boolean result = false; try { redisTemplate.delete(key); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } }
|
5.使用
1 2
| @Resource private RedisUtils redisUtils;
|
6.序列话对象的时候多加了双引号
问题
(1) org.apache.catalina.connector.ClientAbortException: java.io.IOException: Broken pipe
别人这样改的:配置文件的 timeout 参数设置为0 同时配置testOnReturn,testWhileIdle,testOnBorrow为true 这样就没有提示这样的错误了。
1 2 3 4 5 6 7 8
| #客户端超时时间 redis.timeout=0 #是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个 redis.testOnBorrow=true #在空闲时检查有效性, 默认false redis.testWhileIdle=true #是否进行有效性检查 redis.testOnReturn=true
|
今天发生了更加奇怪的问题,就是只有使用谷歌浏览器访问服务的时候,后台才会出现Broken pipe的问题,使用火狐流量其不会出现这样的问题。
出现这个问题,可能是用户提前关闭了连接,比如前端页面发送了ajax请求,还没等服务器回复,就直接跳转了页面,于是就可能会出现这个问题。
(2) redisTemplate.opsForValue() 获取到的值为null
我使用 redisTemplate.opsForValue() 将一个类保存到缓存中,然后再次使用 redisTemplate.opsForValue() 读取这个值,debug的时候,里面的属性值都变成了null,在redis中查看,发现有值的。我猜测的原因,是因为我这个类的属性,是包含大写字母的,虽然能序列化进去,但是解析不出来,因为只有几个小写字段的属性是有值的。
【解决】
这个问题就是在java 对象的属性上,使用 @JsonProperty 进行标注
1 2
| @JsonProperty("AuthSiteSingle") private String AuthSiteSingle;
|