JedisConnectionFactory是连接工厂,通过配置单台服务器或连接池(pool)的方式获取redis服务器的连接
@Primary
@Bean(name="redisTemplate")
public RedisTemplate redisTemplate(JedisConnectionFactory factory) {
RedisTemplate rt = new RedisTemplate();
FastJsonSerializer fastJsonSerializer = new FastJsonSerializer();
StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
rt.setConnectionFactory(factory);
rt.setKeySerializer(stringRedisSerializer);
rt.setValueSerializer(fastJsonSerializer);
rt.setHashKeySerializer(fastJsonSerializer);
rt.afterPropertiesSet();
return rt;
}
RedisTemplate快速完成基本的crud操作
public class RedisTemplate<K, V> extends RedisAccessor implements RedisOperations<K, V>, BeanClassLoaderAware
StringRedisTemplate提供了最常用的String实现
public class StringRedisTemplate extends RedisTemplate<String, String>
注意:
不要使用泛型JAVA集合,如RedisTemplate<Object, Collection<?>>
因为,这样等于让JVM把Collection<?>
序列化为字节数组,已value的方式保存在redis中。这种方式,存在大量的序列化反序列化操作,并且每次操作集合,都要先获得一个完成的集合(即集合的所有元素)。
建议,使用redis提供的集合类型,如List,Set,ZSet(Sorted set)和Map。
private ListOperations<K, V> listOps;
private SetOperations<K, V> setOps;
private ZSetOperations<K, V> zSetOps;
private GeoOperations<K, V> geoOps;
private HyperLogLogOperations<K, V> hllOps;
opsForXXX 和 boundXXXOps 的区别
opsForXXX 获得一个operator,但是没有指定key,在一个连接(事务)内操作多个key和其对应的value。如:
public ValueOperations<K, V> opsForValue() {
if (valueOps == null) {
valueOps = new DefaultValueOperations<K, V>(this);
}
return valueOps;
}
boundXXXOps 获得一个指定了操作对象(key)的operator,在一个连接内只能操作这个key的value。如:
public BoundValueOperations<K, V> boundValueOps(K key) {
return new DefaultBoundValueOperations<K, V>(key, this);
}