一:配置Redis服务器
在springboot中配置redis服务器很简单,只要把相应的配置写在配置文件里面(比如application.properties):
#Redis配置
#Matser的ip地址
redis.hostName=192.168.1.110
spring.redis.host=192.168.1.110
#端口号
spring.redis.port=6379
#如果有密码
#redis.password=123456
#客户端超时时间单位是毫秒 默认是2000
spring.redis.timeout=10000
#最大空闲数
spring.redis.jedis.pool.max-idle=300
#连接池的最大数据库连接数。设为0表示无限制,如果是jedis 2.4以后用redis.maxTotal
#redis.maxActive=600
#控制一个pool可分配多少个jedis实例,用来替换上面的redis.maxActive,如果是jedis 2.4以后用该属性
redis.maxTotal=1000
#最大建立连接等待时间。如果超过此时间将接到异常。设为-1表示无限制。
redis.maxWaitMillis=1000
#连接的最小空闲时间 默认1800000毫秒(30分钟)
redis.minEvictableIdleTimeMillis=300000
#每次释放连接的最大数目,默认3
redis.numTestsPerEvictionRun=1024
#逐出扫描的时间间隔(毫秒) 如果为负数,则不运行逐出线程, 默认-1
redis.timeBetweenEvictionRunsMillis=30000
#是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个
redis.testOnBorrow=true
#在空闲时检查有效性, 默认false
redis.testWhileIdle=true
可以根据自己需求添加和修改相关的配置,添加了这些属性之后,在springboot启动的时候会创建有关Redis的操作对象,比如:RedisConnectionFactory类,RedisTemplate,StringRedisTemplate等常用的Redis对象.
二:修改RedisTemplate默认属性
我们都知道spring中操作基本redis都是通过RedisTemplate来进行的,但是根据配置文件配置redis来生成的RedisTemplate往往不能满足要求,比如:RedisTemplate的默认的序列化器是:JdkSerializationRedisSerializer。这样Redis服务器存入的的就是经过序列化后的特殊字符串,有时候对于我们查看并不方便,如果使用默认的序列化器,则我们存入的key值会变成下面的样子:
127.0.0.1:6379> keys *
1) "\xac\xed\x00\x05t\x00\x06test03"
2) "\xac\xed\x00\x05t\x00\x06test04"
这是因为Redis是一种基于字符串存储的NoSql,而java是基于对象的语言,对象是无法存储到Redis中的,不过Java提供了序列化机制,只要类实现了java.io.Serializable接口,就代表类的对象可以进行序列化,通过将类的对象进行序列化就能够得到二进制字符串,这样Redis就可以将这些类对象以字符串的格式进行存储。Java也可以将这些二进制字符串进行反序列化来得到对象。Spring给我提供了一些序列化器让我们可以自定义序列化的方式,这些序列化方式通过RedisTemplate来设置。
RedisTemplate中提供了如下的一些序列化器的属性
属性 | 描述 | 备注 |
---|---|---|
defaultSerializer | 默认序列化器 | 如果没设置,则使用JdkSerializationRedisSerializer |
keySerializer | Redis键序列化器 | 如果没设置,则使用默认序列化器 |
valueSerializer | Redis值序列化器 | 如果没设置,则使用默认序列化器 |
hashKeySerializer | Redis散列结构field序列化器 | 如果没设置,则使用默认序列化器 |
hashValueSerializer | Redis散列结构value序列化器 | 如果没设置,则使用默认序列化器 |
stringSerializer | 字符串序列化器 | RedisTemplate自动赋值为StringRedisSerializer |
我们在Java配置中设置我们自己的序列化器如下(注意备注信息!):
/**
*springboot默认的redisTemplate添加了@ConditionOnMissingBean所以,如果自定义了,默认的就不会加载
*/
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
template.setConnectionFactory(factory);
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);
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
// key采用String的序列化方式
template.setKeySerializer(stringRedisSerializer);
// hash的key也采用String的序列化方式
template.setHashKeySerializer(stringRedisSerializer);
// value序列化方式采用jackson
template.setValueSerializer(jackson2JsonRedisSerializer);
// hash的value序列化方式采用jackson
template.setHashValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return template;
}
设置上面的属性之后,再看我们的存入的key值变成如下内容:
127.0.0.1:6379> keys *
1) "test04"
2) "test03"
这是对于key:value中的key的设置,上述代码中也对value的序列化进行设置,设置内容见下。
三:设置中文序列化
如果我们的value里面包含了中文内容,而我们想看到完整正确的value内容,需要增加valueSerializer的设置。如上设置的jackson2JsonRedisSerializer。但是你可能加上这个配置去Redis后台去查看的时候还是会看到如下的情况:
127.0.0.1:6379> get test03
"\xac\xed\x00\x05t\x00\t\xe4\xbd\xa0\xe5\xa5\xbd\xe5\x95\x8a"
这种时候并不是设置没有起作用的原因,而是Redis服务器的启动的时候需要添加 -- raw 参数,它能让数据按原格式输出,不显示多余的内容,也能使中文显示。启动命令如下:
./redis-cli --raw
启动之后再查询如下:
127.0.0.1:6379> get test03
"李银河"