Redis实战之征服 Redis + Jedis + Spring (二)
不得不说,用哈希操作来存对象,有点自讨苦吃!
不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?!
或许,是我的理解不对,没有真正的理解哈希表。
相关链接:
Redis实战之征服 Redis + Jedis + Spring (一)
Redis实战之征服 Redis + Jedis + Spring (二)
Redis实战之征服 Redis + Jedis + Spring (三)
一、预期
接上一篇,扩充User属性:
- public class User implements Serializable {
- private static final long serialVersionUID = -1267719235225203410L;
- private String uid;
- private String address;
- private String mobile;
- private String postCode;
- }
public class User implements Serializable {
private static final long serialVersionUID = -1267719235225203410L; private String uid; private String address; private String mobile; private String postCode;
}
我期望的是:
1) "\xe4\xb8\x8a\xe6\xb5\xb7"
2) "13800138000"
3) "100859"
几乎就是一个对象了!
但是,接下来的代码实现,让我彻底崩溃了!
二、代码实现
1.保存——HMSET
- @Override
- public void save(final User user) {
- redisTemplate.execute(new RedisCallback<Object>() {
- @Override
- public Object doInRedis(RedisConnection connection)
- throws DataAccessException {
- byte[] key = redisTemplate.getStringSerializer().serialize(
- "uc.user.info.uid." + user.getUid());
- BoundHashOperations<Serializable, byte[], byte[]> boundHashOperations = redisTemplate
- .boundHashOps(key);
- boundHashOperations.put(redisTemplate.getStringSerializer()
- .serialize("mobile"), redisTemplate
- .getStringSerializer().serialize(user.getMobile()));
- boundHashOperations.put(redisTemplate.getStringSerializer()
- .serialize("address"), redisTemplate
- .getStringSerializer().serialize(user.getAddress()));
- boundHashOperations.put(redisTemplate.getStringSerializer()
- .serialize("postCode"), redisTemplate
- .getStringSerializer().serialize(user.getPostCode()));
- connection.hMSet(key, boundHashOperations.entries());
- return null;
- }
- });
- }
@Override
public void save(final User user) {
redisTemplate.execute(new RedisCallback<Object>() {
@Override
public Object doInRedis(RedisConnection connection)
throws DataAccessException {
byte[] key = redisTemplate.getStringSerializer().serialize(
"uc.user.info.uid." + user.getUid());
BoundHashOperations<Serializable, byte[], byte[]> boundHashOperations = redisTemplate
.boundHashOps(key);
boundHashOperations.put(redisTemplate.getStringSerializer()
.serialize("mobile"), redisTemplate
.getStringSerializer().serialize(user.getMobile()));
boundHashOperations.put(redisTemplate.getStringSerializer()
.serialize("address"), redisTemplate
.getStringSerializer().serialize(user.getAddress()));
boundHashOperations.put(redisTemplate.getStringSerializer()
.serialize("postCode"), redisTemplate
.getStringSerializer().serialize(user.getPostCode()));
connection.hMSet(key, boundHashOperations.entries());
return null;
}
});
}
这里用到:
- BoundHashOperations<Serializable, byte[], byte[]> boundHashOperations = redisTemplate.boundHashOps(key);
- boundHashOperations.put(redisTemplate.getStringSerializer().serialize("mobile"), redisTemplate.getStringSerializer().serialize(user.getMobile()));
BoundHashOperations<Serializable, byte[], byte[]> boundHashOperations = redisTemplate.boundHashOps(key);
boundHashOperations.put(redisTemplate.getStringSerializer().serialize("mobile"), redisTemplate.getStringSerializer().serialize(user.getMobile()));
看着就有点肿。。。Map封装完以后,用HMSET命令:
- connection.hMSet(key, boundHashOperations.entries());
connection.hMSet(key, boundHashOperations.entries());
这时候就完成了哈希表的保存操作,可以在控制台看到相应的数据了。
1) "\xe4\xb8\x8a\xe6\xb5\xb7"
2) "13800138000"
3) "100859"
2.获取——HMGET
这一刻,我彻底崩溃了!取出来的值是个List,还得根据取得顺序,逐个反序列化,得到内容。
- @Override
- public User read(final String uid) {
- return redisTemplate.execute(new RedisCallback<User>() {
- @Override
- public User doInRedis(RedisConnection connection)
- throws DataAccessException {
- byte[] key = redisTemplate.getStringSerializer().serialize(
- "uc.user.info.uid." + uid);
- if (connection.exists(key)) {
- List<byte[]> value = connection.hMGet(
- key,
- redisTemplate.getStringSerializer().serialize(
- "address"),
- redisTemplate.getStringSerializer().serialize(
- "mobile"), redisTemplate
- .getStringSerializer()
- .serialize("postCode"));
- User user = new User();
- String address = redisTemplate.getStringSerializer()
- .deserialize(value.get(0));
- user.setAddress(address);
- String mobile = redisTemplate.getStringSerializer()
- .deserialize(value.get(1));
- user.setMobile(mobile);
- String postCode = redisTemplate.getStringSerializer()
- .deserialize(value.get(2));
- user.setPostCode(postCode);
- user.setUid(uid);
- return user;
- }
- return null;
- }
- });
- }
@Override
public User read(final String uid) {
return redisTemplate.execute(new RedisCallback<User>() {
@Override
public User doInRedis(RedisConnection connection)
throws DataAccessException {
byte[] key = redisTemplate.getStringSerializer().serialize(
"uc.user.info.uid." + uid);
if (connection.exists(key)) {
List<byte[]> value = connection.hMGet(
key,
redisTemplate.getStringSerializer().serialize(
"address"),
redisTemplate.getStringSerializer().serialize(
"mobile"), redisTemplate
.getStringSerializer()
.serialize("postCode"));
User user = new User();
String address = redisTemplate.getStringSerializer()
.deserialize(value.get(0));
user.setAddress(address);
String mobile = redisTemplate.getStringSerializer()
.deserialize(value.get(1));
user.setMobile(mobile);
String postCode = redisTemplate.getStringSerializer()
.deserialize(value.get(2));
user.setPostCode(postCode);
user.setUid(uid); return user;
}
return null;
}
});
}
这个实现,跟Redis的命令几乎一模一样,指定Key,指定field,获取其值。
- List<byte[]> value = connection.hMGet(key,redisTemplate.getStringSerializer().serialize("address"),
- redisTemplate.getStringSerializer().serialize("mobile"),
- redisTemplate.getStringSerializer().serialize("postCode"));
List<byte[]> value = connection.hMGet(key,redisTemplate.getStringSerializer().serialize("address"),
redisTemplate.getStringSerializer().serialize("mobile"),
redisTemplate.getStringSerializer().serialize("postCode"));
我绝对相信,要么是我用的过于肤浅,低估了Spring的封装能力。或者,我该直接Json!等等,这不是MongoDB干的事情吗?!
PS:这两篇博客里操作的数据类型,只能是String类型,还没搞定除此以外任何类型。吾将上下而求索~~~
上述操作也许你吐了,接下来的代码,就再吐一次吧!
封装对象的时候,一定要记得次序。。。。这绝对不是一个优质代码的实现风格!
- User user = new User();
- String address = redisTemplate.getStringSerializer().deserialize(value.get(0));
- user.setAddress(address);
- String mobile = redisTemplate.getStringSerializer().deserialize(value.get(1));
- user.setMobile(mobile);
- String postCode = redisTemplate.getStringSerializer().deserialize(value.get(2));
- user.setPostCode(postCode);
User user = new User();
String address = redisTemplate.getStringSerializer().deserialize(value.get(0));
user.setAddress(address);
String mobile = redisTemplate.getStringSerializer().deserialize(value.get(1));
user.setMobile(mobile);
String postCode = redisTemplate.getStringSerializer().deserialize(value.get(2));
user.setPostCode(postCode);
好吧!苦逼的事情,就此结束。目标Json支持!
相关链接:
Redis实战之征服 Redis + Jedis + Spring (一)
Redis实战之征服 Redis + Jedis + Spring (二)
Redis实战之征服 Redis + Jedis + Spring (三)
Redis实战之征服 Redis + Jedis + Spring (二)的更多相关文章
- Redis实战之征服 Redis + Jedis + Spring (一)
Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: Redis实战 Re ...
- Redis实战之征服 Redis + Jedis + Spring (三)
一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现“stringRedisTemplate.opsForList()”的强大,抓紧时间恶补下. 通过spring-data-redis完 ...
- Redis实战 | 5种Redis数据类型详解
我们知道Redis是目前非常主流的KV数据库,它因高性能的读写能力而著称,其实还有另外一个优势,就是Redis提供了更加丰富的数据类型,这使得Redis有着更加广泛的使用场景.那Redis提供给用户的 ...
- Redis 实战 —— 13. 扩展 Redis
简介 当数据量增大或者读写请求增多后,一台 Redis 服务器可能没办法再存储所有数据或者处理所有读写请求,那么就需要对 Redis 进行扩展,保证 Redis 在能存储所有数据对情况下,同时能正常处 ...
- Redis与Java的链接Jedis(二)
就像jdbc跟java链接数据库一样 redis跟java链接最好的工具就是Jedis 相关资源下载:https://github.com/xetorthio/jedis 正常建立java项目, 导入 ...
- 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_40、Redis工具类封装讲解和实战
笔记 4.Redis工具类封装讲解和实战 简介:高效开发方式 Redis工具类封装讲解和实战 1.常用客户端 https://redisdesktop.com/download ...
- Redis实战之Redis + Jedis
用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redi ...
- Redis实战之Redis + Jedis[转]
http://blog.csdn.net/it_man/article/details/9730605 2013-08-03 11:01 1786人阅读 评论(0) 收藏 举报 目录(?)[-] ...
- Redis实战
大约一年多前,公司同事开始使用Redis,不清楚是配置,还是版本的问题,当时的Redis经常在使用一段时间后,连接爆满且不释放.印象中,Redis 2.4.8以下的版本由于设计上的主从库同步问题,就会 ...
随机推荐
- 【原创】海量数据处理问题(一) ---- 外排,堆排,K查找的应用
这篇博客源自对一个内存无法处理的词频统计问题的思考,最后给出的解决办法是自己想的,可以肯定这不是最好的解法.但是通过和同学的讨论,仍然感觉这是一个有意义及有意思的问题,所以和大家分享与探讨. 如果有误 ...
- jquery的smartWizard插件使用方法
jquery 的smartWizard插件常用在一些向导式的,按步骤的功能中,是的用户按照我们设定的步骤进行操作,这样一方面有较好的用户体验,可以将庞大的表格 数据分解成多个步骤,是的每个步骤的数据量 ...
- Android开发之 android:windowSoftInputMode属性详解
android:windowSoftInputMode activity主窗口与软键盘的交互模式,可以用来避免输入法面板遮挡问题,Android1.5后的一个新特性. 这个属性能影响两件事情: [一] ...
- Python各种模块下载及安装配置
方式1 在Python官网https://www.python.org/或者是github搜索进行下载 ,解压缩之后通过命令提示符进入已经解压缩文件夹根目录,输入下面的命令: python setup ...
- 大四实习准备4_java内部类
2015-4-30 [昨天又可耻地休息了一天,懒劲比较大啊.跟懒劲有直接关系,这几天对幸福的感知也黯淡了,对未来的幸福不是那么渴望了.表现在对亲情和爱情上. 我想生活的本意是积极进取.茁壮生长并时常感 ...
- NOI2010能量采集(数论)
没想到NOI竟然还有这种数学题,看来要好好学数论了…… 网上的题解: 完整的结题报告: 首先我们需要知道一个知识,对于坐标系第一象限任意的整点(即横纵坐标均为整数的点)p(n,m),其与原点o(0,0 ...
- sql 的错误处理功能很弱
--下面演示了SQL错误处理的脆弱性--邹建 --演示1--测试的存储过程1create proc p1asprint 12/0if @@error<>0print '发生错误1' sel ...
- YQL
YQL,(Yahoo! Query Language)是一种支持对互联网上的数据进行查询.过滤.连接.类似SQL语法的简单语言.用YQL官方的话:有了YQL,开发人员只需要使用一种 简单的查询语言即可 ...
- (五)学习CSS之line-height属性
参考:http://www.jb51.net/w3school/css/pr_dim_line-height.htm line-height 属性设置行间的距离(行高). 注释:不允许使用负值. 值 ...
- NET下RabbitMQ实践[配置篇]
这个系列目前计划写四篇,分别是配置,示例,WCF发布,实战.当然不排除加餐情况. 介绍: rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Publi ...