1、StringRedisTemplate是什么?
StringRedisTemplate继承自RedisTemplate类,实现了BeanClassLoaderAware,Aware,InitializingBean,RedisOperations<K, V>接口。StringRedisTemplate是RedisTemplate以字符串为中心的扩展,由于针对 Redis 的大多数操作都是基于字符串的,因此此类提供了一个专用类。StringRedisTemplate是默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
2、使用方法
2.1、构造方法
StringRedisTemplate提供了两个构造方法:
方法 | 描述 |
StringRedisTemplate() | 构造一个新StringRedisTemplate实例 |
StringRedisTemplate(RedisConnectionFactory connectionFactory) | 构造一个StringRedisTemplate可以使用的新实例 |
2.2、常用操作方法
2.2.1、从RedisTemplate继承的方法:afterPropertiesSet, boundGeoOps, boundHashOps, boundListOps, boundSetOps, boundStreamOps, boundValueOps, boundZSetOps, convertAndSend, copy, countExistingKeys, createRedisConnectionProxy 等详见: https://docs.spring.io/spring-data/redis/docs/current/api/org/springframework/data/redis/core/RedisTemplate.html#boundStreamOps-K-
2.2.2、 从RedisAccessor继承的方法
方法 | 描述 |
getConnectionFactory() | 返回连接工厂 |
getRequiredConnectionFactory() | 如果未设置连接工厂,则返回必需的RedisConnectionFactory或抛出IllegalStateException |
setConnectionFactory(RedisConnectionFactory connectionFactory) | 设置连接工厂 |
2.2.3、从Object继承的方法: clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
详见: https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#wait-long-int-
2.2.4、从RedisOperations继承的方法
返回类型 | 方法 | 描述 |
default Boolean | expire(K key, Duration timeout) | 设定时间key |
Boolean | expire(K key, long timeout, TimeUnit unit) | 设定时间key |
Boolean | expireAt(K key, Date date) | 将给定的到期时间设置key为日期时间戳 |
default Boolean | expireAt(K key, Instant expireAt) | 将给定的到期时间设置key为日期时间戳 |
default void | restore(K key, byte[] value, long timeToLive, TimeUnit unit) | 创建key使用serializedValue,之前获得使用dump(Object) |
void | restore(K key, byte[] value, long timeToLive, TimeUnit unit, boolean replace) | 创建key使用serializedValue,之前获得使用dump(Object) |
3、常见使用方法
(1)检查key是否存在,返回boolean值
stringRedisTemplate.hasKey(String key)
(2)根据key获取缓存中value
stringRedisTemplate.opsForValue().get(Object key)
(3) 截取key键对应缓存中的字符串,从开始下标位置开始到结束下标的位置(包含结束下标)
stringRedisTemplate.opsForValue().get(String key,long start,long end)
(4) 向缓存中存入key值对应的value数据
stringRedisTemplate.opsForValue().set(String key,String value)
(5) 覆盖从指定位置开始的值
stringRedisTemplate.opsForValue().set(String key,String value,long offset)
(6) 向缓存中存入数据,并指定过期时间,默认毫秒
stringRedisTemplate.opsForValue().set(String key,String value,Duration timeout)
(7) 向缓存中存入数据,并指定过期时间,可指定过期时间的单位,如TimeUnit.MINUTES,表示过期时间单位是分钟
stringRedisTemplate.opsForValue().set(String key,String value,long timeout,TimeUnit unit)
(8) 向缓存中存入数据,以map形式存储
stringRedisTemplate.opsForHash().putAll(String key,Map<?,?> m)
(9) 向缓存中存入数据
stringRedisTemplate.opsForHash().put(String key,Object hashkey,Object value)
(10) 删除缓存
stringRedisTemplate.delete(String key,Object ...hashkeys)
(11) 以增量形式存储
stringRedisTemplate.opsForValue().increment(String key)
(12) 以增量的方式将long值存储在变量中,相当于一个计数器(计算 +)
stringRedisTemplate.opsForValue().increment(String key,long delta)
(13) 以增量的方式将double值存储在变量中,相当于一个计数器(计算 +)
stringRedisTemplate.opsForValue().increment(String key,double delta)
(14) 获取key对应的map
stringRedisTemplate.opsForHash().entries(String key)
(15) 设置过期时间
stringRedisTemplate.expire(String key,Duration timeout)
stringRedisTemplate.expire(String key,long timeout,TimeUnit unit)
4、RedisTemplate的两种序列化实践方案:
当使用RedisTemplate往redis中存储java对象的时候,会将该java对象的字节码文件也同时存进了内存中,这是为了实现自动反序列化,会带来额外的内存开销。
方案一:
1.自定义RedisTemplate
2.修改RedisTemplate的序列化器为GenericJackson2JsonRedisSerializer
@Configuration
public class MyRedisTemplate {
/**
* 将往redis中存放的【key(string)、value(object)】对象都添加可序列化的功能,从而实现了redis可存放对象的功能并提高了编程效率
* @param factory
* @return
*/
@Bean
@SuppressWarnings("all")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
// 为了开发方便,一般直接使用 <String, Object>
RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
// 注入连接工厂
template.setConnectionFactory(factory);
// Json序列化配置
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);
// String 的序列化
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;
}
}
但是为了节省内存开销,并不会使用JSON序列化器来处理Value,而是统一使用String序列化器,要求只能存储String类型的key和value,当需要存储Java对象时,手动完成对象的序列化和反序列化;
Spring默认提供了一个StringRedisTemplate类,它的key和Value的序列化方式默认就是String类型,省去了我们自定义RedisTemplate的过程
方案二:
1.使用StringRedisTemplate
2.写入Redis时,手动把对象序列化为json格式字符串
读取Redis时,手动把读取到的JSON反序列化成对象
标签:String,redis,value,stringRedisTemplate,key,序列化,StringRedisTemplate,springboot From: https://www.cnblogs.com/gapu/p/17552732.html