redis--StringRedisTemplate和RedisTemplate区别
StringRedisTemplate:
1)、只能存储string类型的值,因此不能存储如对象
2)、序列化为string,如:
RedisTemplate:
1)、可以存储任意类型,含对象。
2)、序列化采用jdk的,如:
redisTemplate.opsForValue().set("key-0", "hello");
redisTemplate.opsForValue().set("key-1", User.getSampleUser()); public static User getSampleUser() {
User user = new User();
user.setId(123);
user.setName("遥远2");
return user;
}
在java中能正确读取,但是在client中就是jdk序列化后的字符了,不利于查看。
======================================
RedisTemplate使用总结:
1、如果采用默认的jdk序列化,可以不用自行指定序列化即不用再RedisConfig中配置序列化方式。但是,
@Qualifier("redisTemplate")//必须加此行
private RedisTemplate redisTemplate;//不能为RedisTemplate<K,V>
一定要加@Qualifier("redisTemplate"),否则会当成StringRedisTemplate,因而报错。
2、RedisTemplate也可当做StringRedisTemplate使用,但需要配置成string序列化:
@Configuration
public class RedisConfig { @Bean("strRedisTemplate")
public RedisTemplate<Object,Object> strRedisTemplate(RedisConnectionFactory redisConectionFactory) {
RedisTemplate<Object,Object> template = new RedisTemplate<Object,Object>();
template.setConnectionFactory(redisConectionFactory);
RedisSerializer<String> stringSerializer = new StringRedisSerializer();
template.setKeySerializer(stringSerializer);//对key序列化
template.setValueSerializer(stringSerializer);//对value序列化
return template;
}
}
但,意义不大,如果用的value是string的,直接使用StringRedisTemplate即可。
3、RedisTemplate对象序列化
import org.springframework.core.convert.converter.Converter;
import org.springframework.core.serializer.support.DeserializingConverter;
import org.springframework.core.serializer.support.SerializingConverter;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.SerializationException; public class RedisObjectSerializer implements RedisSerializer<Object> {
private Converter<Object,byte[]> serializer = new SerializingConverter();
private Converter<byte[],Object> deserializer = new DeserializingConverter();
private static final byte[] EMPTY_ARRAY = new byte[0]; @Override
public Object deserialize(byte[] bytes) throws SerializationException {
if (isEmpty(bytes)) {
return null;
}
return deserializer.convert(bytes);
} @Override
public byte[] serialize(Object t) throws SerializationException {
if (t == null) {
return EMPTY_ARRAY;
}
return serializer.convert(t);
}
private boolean isEmpty(byte[] data) {
return (data == null || data.length == 0);
}
}
发现,插入后,依然是默认的jdk序列化。如图:
所以,此方式也不建议使用。
4、json序列化
参考:https://github.com/alibaba/fastjson/wiki/%E5%9C%A8-Spring-%E4%B8%AD%E9%9B%86%E6%88%90-Fastjson
分别对key、value序列化:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.StringRedisSerializer; import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer; @Configuration
public class RedisConfig { @Bean("jsonRedisTemplate")
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConectionFactory) {
RedisTemplate<Object,Object> template = new RedisTemplate<Object,Object>();
template.setConnectionFactory(redisConectionFactory); template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericFastJsonRedisSerializer()); //template.setDefaultSerializer(new FastJsonRedisSerializer(Object.class));
return template;
}
}
使用默认的:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate; import com.alibaba.fastjson.support.spring.GenericFastJsonRedisSerializer; @Configuration
public class RedisConfig { @Bean("jsonRedisTemplate")
public RedisTemplate<Object,Object> redisTemplate(RedisConnectionFactory redisConectionFactory) {
RedisTemplate<Object,Object> template = new RedisTemplate<Object,Object>();
template.setConnectionFactory(redisConectionFactory); //template.setKeySerializer(new StringRedisSerializer());
//template.setValueSerializer(new GenericFastJsonRedisSerializer());
template.setDefaultSerializer(new GenericFastJsonRedisSerializer());
return template;
}
}
此时,在redis-cli中,执行命令:
必须为key加上 \",才可以获取值。因此,最后总结:
当value存储的是string类型时,使用StringRedisTemplate。
否则,使用RedisTemplate,且,即使 使用RedisTemplate,也必须分别对key、value做序列化,而不是使用一个默认的,即:
redis--StringRedisTemplate和RedisTemplate区别的更多相关文章
- StringRedisTemplate与RedisTemplate区别
StringRedisTemplate与RedisTemplate两者的关系是StringRedisTemplate继承RedisTemplate. 两者的数据是不共通的:也就是说StringRedi ...
- Redis(九):使用RedisTemplate访问Redis数据结构API大全
RedisTemplate介绍 spring封装了RedisTemplate对象来进行对redis的各种操作,它支持所有的 redis 原生的api. RedisTemplate在spring代码中的 ...
- SpringBoot2.x集成Redis (StringTemplate与redisTemplate的用法)
1. Redis介绍Redis数据库是一个完全开源免费的高性能Key-Value数据库.它支持存储的value类型有五种,包括string(字符串).list(链表).set(集合).zset(sor ...
- Redis与Memcache的区别
Redis与Memcache的区别 数据类型: redis数据类型丰富,支持set liset等类型 memcache支持简单数据类型,需要客户端自己处理复杂对象 持久性: red ...
- Redis和Memcache的区别
Redis和Memcache的区别 总结一: 1.数据类型 redis数据类型丰富,支持set liset等类型 memcache支持简单数据类型,需要客户端自己处理复杂对象 2.持久性 redis支 ...
- Redis与Memcached的区别
传统MySQL+ Memcached架构遇到的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量 ...
- 也谈谈 Redis 和 Memcached 的区别
本文作者: 伯乐在线 - 朱小厮 . 说到redis就会联想到memcached,反之亦然.了解过两者的同学有那么个大致的印象: redis与memcached相比,比仅支持简单的key-value数 ...
- 【转载】Redis与Memcached的区别
传统MySQL+ Memcached架构遇到的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量 ...
- (转)Redis与Memcached的区别
如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点: 1 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储. 2 Redis支持 ...
- Redis 与 Memcached 的区别
[转]Redis 与 Memcached 的区别 传统 MySQL + Memcached 架构遇到的问题 实际上 MySQL 是适合进行海量数据存储的,通过 Memcached 将热点数据加 ...
随机推荐
- kvm初体验之五:vm连接网络的两种方式:bridge和nat
1. 在安装vm时指定网络连接方式 1)bridge virt-install --name vm1 --ram=1024 --vcpus=1 --disk path=/vm-images/vm1,s ...
- listen 76
Flavors Fluctuate With Temperature Does an ice-cold drink actually taste better than the same bevera ...
- python web server gateway interface (wsgi ) notes
前言: 注:如果需要得到支持批Python3.x以及包含了勘误表,附录,和说明的更新版规范,请查看PEP 3333 摘要: 这篇文档详细说明了一套在web服务器与Python web应用程序(web框 ...
- Highcharts小数保留两位方法
tooltip: { valueSuffix: '%', formatter:function(){ return''+this.series.name+' '+Highcharts.numberFo ...
- BZOJ2726:任务安排(DP+斜率优化+二分)
机器上有N个需要处理的任务,它们构成了一个序列.这些任务被标号为1到N,因此序列的排列为1,2,3...N.这N个任务被分成若干批,每批包含相邻的若干任务.从时刻0开始,这些任务被分批加工,第i个任务 ...
- IHE-PIX 备注
IHE给出了各个Actor之间如何通讯的建议: 1. 应用程序通讯时必须用MLLP包装或者解析. 2. 客户端建立连接后,服务器端必须用此连接进行应答.客户端可以继续用此连接启 ...
- Ternary Calculation
Ternary Calculation Time Limit : /2000ms (Java/Other) Memory Limit : /65536K (Java/Other) Total Subm ...
- Docker入门(一):简介
这个<Docker入门>系列文档,是我根据Docker官网(https://docs.docker.com)的帮助文档大致翻译而成.主要是作为个人学习记录.有错误的地方,Robin欢迎大家 ...
- httpmodule VS2012 和 VS2013
http://stackoverflow.com/questions/963545/httpmodule-not-running-with-visual-studio 如果将 httpmodule 配 ...
- ObservableCollection排序
ObservableCollection没有自带的sort排序功能,那么可以写一个扩展方法: public static void Sort<T>(this ObservableColle ...