spring-data-redis针对jedis提供了如下功能:
JdkSerializationRedisSerializer
:POJO对象的存取场景,使用JDK本身序列化机制,将pojo类通过ObjectInputStream/ObjectOutputStream
进行序列化操作,最终redis-server中将存储字节序列。是目前最常用的序列化策略。StringRedisSerializer
:Key或者value为字符串的场景,根据指定的charset对数据的字节序列编码成string,是“new String(bytes, charset)”和“string.getBytes(charset)”的直接封装。是最轻量级和高效的策略。JacksonJsonRedisSerializer
:jackson-json工具提供了javabean与json之间的转换能力,可以将pojo实例序列化成json格式存储在redis中,也可以将json格式的数据转换成pojo实例。因为jackson工具在序列化和反序列化时,需要明确指定Class类型,因此此策略封装起来稍微复杂。【需要jackson-mapper-asl工具支持】OxmSerializer
:提供了将javabean与xml之间的转换能力,目前可用的三方支持包括jaxb,apache-xmlbeans;redis存储的数据将是xml工具。不过使用此策略,编程将会有些难度,而且效率最低;不建议使用。【需要spring-oxm模块的支持】无论什么时候,只要有可能就利用key超时的优势。一个很好的例子就是储存一些诸如临时认证key之类的东西。当你去查找一个授权key时——以OAUTH为例——通常会得到一个超时时间。
这样在设置key的时候,设成同样的超时时间,Redis就会自动为你清除。
例:user:userid:9:username
在 pom.xml 中spring-boot-starter-data-redis的依赖,Spring Boot2.x 后底层不在是Jedis默认为Lettuce,如果做版本升级的朋友需要注意下
org.apache.commons
commons-pool2
org.springframework.boot
spring-boot-starter-data-redis
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
application.properties
server.port=8888
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.lettuce.pool.max-wait=10000ms
# 连接池中的最大空闲连接
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接
spring.redis.lettuce.pool.min-idle=0
# 连接超时时间(毫秒)
spring.redis.timeout=10000ms
注意如果设置了redis连接池必须要添加
commons-pool2
依赖
@Configuration
public class RedisConfig extends CachingConfigurerSupport {
@Override
public KeyGenerator keyGenerator() {
return (target, method, objects) -> {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append("::" + method.getName() + ":");
for (Object obj : objects) {
sb.append(obj.toString());
}
return sb.toString();
};
}
/** * 选择redis作为默认缓存工具 * @param redisTemplate * @return */
// @Bean
// public CacheManager cacheManager(RedisTemplate redisTemplate) {
// RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
// return rcm;
// }
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory factory) {
RedisTemplate template = new RedisTemplate<>();
// 配置连接工厂
template.setConnectionFactory(factory);
// 使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
Jackson2JsonRedisSerializer
spring-redis中使用了RedisTemplate来进行redis的操作,通过泛型的K和V设置键值对的对象类型。这里使用了string作为key的对象类型,值为Object。
对于Object,spring-redis默认使用了jdk自带的序列化,不推荐使用默认了。所以使用了json的序列化方式
HashOperations:对hash类型的数据操作
ValueOperations:对redis字符串类型数据操作
ListOperations:对链表类型的数据操作
SetOperations:对无序集合类型的数据操作
ZSetOperations:对有序集合类型的数据操作
@Component
public class RedisService {
@Autowired private RedisTemplate redisTemplate;
/** * 默认过期时长,单位:秒 */
public static final long DEFAULT_EXPIRE = 60 * 60 * 24;
/** * 不设置过期时长 */
public static final long NOT_EXPIRE = -1;
public boolean existsKey(String key) {
return redisTemplate.hasKey(key);
}
/** * 重名名key,如果newKey已经存在,则newKey的原值被覆盖 * * @param oldKey * @param newKey */
public void renameKey(String oldKey, String newKey) {
redisTemplate.rename(oldKey, newKey);
}
/** * newKey不存在时才重命名 * * @param oldKey * @param newKey * @return 修改成功返回true */
public boolean renameKeyNotExist(String oldKey, String newKey) {
return redisTemplate.renameIfAbsent(oldKey, newKey);
}
/** * 删除key * * @param key */
public void deleteKey(String key) {
redisTemplate.delete(key);
}
/** * 删除多个key * * @param keys */
public void deleteKey(String... keys) {
Set kSet = Stream.of(keys).map(k -> k).collect(Collectors.toSet());
redisTemplate.delete(kSet);
}
/** * 删除Key的集合 * * @param keys */
public void deleteKey(Collection keys) {
Set kSet = keys.stream().map(k -> k).collect(Collectors.toSet());
redisTemplate.delete(kSet);
}
/** * 设置key的生命周期 * * @param key * @param time * @param timeUnit */
public void expireKey(String key, long time, TimeUnit timeUnit) {
redisTemplate.expire(key, time, timeUnit);
}
/** * 指定key在指定的日期过期 * * @param key * @param date */
public void expireKeyAt(String key, Date date) {
redisTemplate.expireAt(key, date);
}
/** * 查询key的生命周期 * * @param key * @param timeUnit * @return */
public long getKeyExpire(String key, TimeUnit timeUnit) {
return redisTemplate.getExpire(key, timeUnit);
}
/** * 将key设置为永久有效 * * @param key */
public void persistKey(String key) {
redisTemplate.persist(key);
}
}
public class Redis {
/**
* redis的key 形式为: 表名:主键名:主键值:列名 *
*
* @param tableName 表名
* @param majorKey 主键名
* @param majorKeyValue 主键值
* @param column 列名
* @return
*/
public static String getKeyWithColumn(
String tableName, String majorKey, String majorKeyValue, String column) {
StringBuffer buffer = new StringBuffer();
buffer.append(tableName).append(":");
buffer.append(majorKey).append(":");
buffer.append(majorKeyValue).append(":");
buffer.append(column);
return buffer.toString();
}
/**
* * redis的key * 形式为: * 表名:主键名:主键值 * * @param tableName 表名 * @param majorKey 主键名 * @param
* majorKeyValue 主键值 * @return
*/
public static String getKey(String tableName, String majorKey, String majorKeyValue) {
StringBuffer buffer = new StringBuffer();
buffer.append(tableName).append(":");
buffer.append(majorKey).append(":");
buffer.append(majorKeyValue).append(":");
return buffer.toString();
}
}
高级进阶-通过spring-boot-starter-data-redis源码了解starter和autoconfigure模块
demo