不得不说,用哈希操作来存对象,有点自讨苦吃!

不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?!

或许,是我的理解不对,没有真正的理解哈希表。

相关链接:

Redis实战

Redis实战之Redis + Jedis

Redis实战之征服 Redis + Jedis + Spring (一)

Redis实战之征服 Redis + Jedis + Spring (二)

Redis实战之征服 Redis + Jedis + Spring (三)

一、预期

接上一篇,扩充User属性:

  1. public class User implements Serializable {
  2. private static final long serialVersionUID = -1267719235225203410L;
  3. private String uid;
  4. private String address;
  5. private String mobile;
  6. private String postCode;
  7. }
public class User implements Serializable {
private static final long serialVersionUID = -1267719235225203410L; private String uid; private String address; private String mobile; private String postCode;
}

我期望的是:

redis 127.0.0.1:6379> hmget uc.user.info.uid.u123456 address mobile postCode
1) "\xe4\xb8\x8a\xe6\xb5\xb7"

2) "13800138000"

3) "100859"

几乎就是一个对象了!

但是,接下来的代码实现,让我彻底崩溃了!

二、代码实现

1.保存——HMSET

  1. @Override
  2. public void save(final User user) {
  3. redisTemplate.execute(new RedisCallback<Object>() {
  4. @Override
  5. public Object doInRedis(RedisConnection connection)
  6. throws DataAccessException {
  7. byte[] key = redisTemplate.getStringSerializer().serialize(
  8. "uc.user.info.uid." + user.getUid());
  9. BoundHashOperations<Serializable, byte[], byte[]> boundHashOperations = redisTemplate
  10. .boundHashOps(key);
  11. boundHashOperations.put(redisTemplate.getStringSerializer()
  12. .serialize("mobile"), redisTemplate
  13. .getStringSerializer().serialize(user.getMobile()));
  14. boundHashOperations.put(redisTemplate.getStringSerializer()
  15. .serialize("address"), redisTemplate
  16. .getStringSerializer().serialize(user.getAddress()));
  17. boundHashOperations.put(redisTemplate.getStringSerializer()
  18. .serialize("postCode"), redisTemplate
  19. .getStringSerializer().serialize(user.getPostCode()));
  20. connection.hMSet(key, boundHashOperations.entries());
  21. return null;
  22. }
  23. });
  24. }
	@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;
}
});
}

这里用到:

  1. BoundHashOperations<Serializable, byte[], byte[]> boundHashOperations = redisTemplate.boundHashOps(key);
  2. 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命令:

  1. connection.hMSet(key, boundHashOperations.entries());
connection.hMSet(key, boundHashOperations.entries());

这时候就完成了哈希表的保存操作,可以在控制台看到相应的数据了。

redis 127.0.0.1:6379> hmget uc.user.info.uid.u123456 address mobile postCode
1) "\xe4\xb8\x8a\xe6\xb5\xb7"

2) "13800138000"

3) "100859"

2.获取——HMGET

这一刻,我彻底崩溃了!取出来的值是个List,还得根据取得顺序,逐个反序列化,得到内容。

  1. @Override
  2. public User read(final String uid) {
  3. return redisTemplate.execute(new RedisCallback<User>() {
  4. @Override
  5. public User doInRedis(RedisConnection connection)
  6. throws DataAccessException {
  7. byte[] key = redisTemplate.getStringSerializer().serialize(
  8. "uc.user.info.uid." + uid);
  9. if (connection.exists(key)) {
  10. List<byte[]> value = connection.hMGet(
  11. key,
  12. redisTemplate.getStringSerializer().serialize(
  13. "address"),
  14. redisTemplate.getStringSerializer().serialize(
  15. "mobile"), redisTemplate
  16. .getStringSerializer()
  17. .serialize("postCode"));
  18. User user = new User();
  19. String address = redisTemplate.getStringSerializer()
  20. .deserialize(value.get(0));
  21. user.setAddress(address);
  22. String mobile = redisTemplate.getStringSerializer()
  23. .deserialize(value.get(1));
  24. user.setMobile(mobile);
  25. String postCode = redisTemplate.getStringSerializer()
  26. .deserialize(value.get(2));
  27. user.setPostCode(postCode);
  28. user.setUid(uid);
  29. return user;
  30. }
  31. return null;
  32. }
  33. });
  34. }
	@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,获取其值。

  1. List<byte[]> value = connection.hMGet(key,redisTemplate.getStringSerializer().serialize("address"),
  2. redisTemplate.getStringSerializer().serialize("mobile"),
  3. 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类型,还没搞定除此以外任何类型。吾将上下而求索~~~

上述操作也许你吐了,接下来的代码,就再吐一次吧!

封装对象的时候,一定要记得次序。。。。这绝对不是一个优质代码的实现风格!

  1. User user = new User();
  2. String address = redisTemplate.getStringSerializer().deserialize(value.get(0));
  3. user.setAddress(address);
  4. String mobile = redisTemplate.getStringSerializer().deserialize(value.get(1));
  5. user.setMobile(mobile);
  6. String postCode = redisTemplate.getStringSerializer().deserialize(value.get(2));
  7. 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实战之Redis + Jedis

Redis实战之征服 Redis + Jedis + Spring (一)

Redis实战之征服 Redis + Jedis + Spring (二)

Redis实战之征服 Redis + Jedis + Spring (三)

Redis实战之征服 Redis + Jedis + Spring (二)的更多相关文章

  1. Redis实战之征服 Redis + Jedis + Spring (一)

    Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: Redis实战 Re ...

  2. Redis实战之征服 Redis + Jedis + Spring (三)

    一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现“stringRedisTemplate.opsForList()”的强大,抓紧时间恶补下. 通过spring-data-redis完 ...

  3. Redis实战 | 5种Redis数据类型详解

    我们知道Redis是目前非常主流的KV数据库,它因高性能的读写能力而著称,其实还有另外一个优势,就是Redis提供了更加丰富的数据类型,这使得Redis有着更加广泛的使用场景.那Redis提供给用户的 ...

  4. Redis 实战 —— 13. 扩展 Redis

    简介 当数据量增大或者读写请求增多后,一台 Redis 服务器可能没办法再存储所有数据或者处理所有读写请求,那么就需要对 Redis 进行扩展,保证 Redis 在能存储所有数据对情况下,同时能正常处 ...

  5. Redis与Java的链接Jedis(二)

    就像jdbc跟java链接数据库一样 redis跟java链接最好的工具就是Jedis 相关资源下载:https://github.com/xetorthio/jedis 正常建立java项目, 导入 ...

  6. 小D课堂 - 零基础入门SpringBoot2.X到实战_第9节 SpringBoot2.x整合Redis实战_40、Redis工具类封装讲解和实战

    笔记 4.Redis工具类封装讲解和实战     简介:高效开发方式 Redis工具类封装讲解和实战         1.常用客户端 https://redisdesktop.com/download ...

  7. Redis实战之Redis + Jedis

    用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redi ...

  8. Redis实战之Redis + Jedis[转]

    http://blog.csdn.net/it_man/article/details/9730605 2013-08-03 11:01 1786人阅读 评论(0) 收藏 举报   目录(?)[-] ...

  9. Redis实战

    大约一年多前,公司同事开始使用Redis,不清楚是配置,还是版本的问题,当时的Redis经常在使用一段时间后,连接爆满且不释放.印象中,Redis 2.4.8以下的版本由于设计上的主从库同步问题,就会 ...

随机推荐

  1. DSP6455 DSP/BIOS中断配置问题(是否需要ECM-事件组合以及实例)

    2013-06-20 21:08:48 中断的配置有两种常用的方式: 一是通过CSL提供的API进行配置,这种方法相对DSP/BIOS偏底层,也比较麻烦:这种方法要求对中断系统的工作方式很清楚. 二是 ...

  2. VS2005工程增加SDK

    客户最近发过来一个VS2005的工程,此工程是基于Pocket PC 2003(ARMV4),需要改为我们WINCE6.0系统对应的SDK,下面具体说明如何添加新的SDK. 选择configurati ...

  3. ubuntu程序安装方法

    以前一直使用window,今天安装了一个ubuntu系统(如果有同学也想装,建议装英文版的),因为以前ubuntu系统用的不多,所以安装软件就是一个问题. 就以安装chrome来说吧: 1.在Goog ...

  4. CDN-内容推送网络

    前段时间介绍了浏览器缓存机制,通过浏览器缓存一方面可以改善用户的体验,而不用漫长地等待从服务器下载资源:另一方面减轻服务器压力.节省流量.CDN是另一种可以大幅度优化用户体验,且减轻服务器压力的技术. ...

  5. HDU 3549 Flow Problem 流问题(最大流,入门)

    题意:给个赤裸的最大流问题. 思路:EK+BFS解决.跟HDU1532几乎一样的. #include <bits/stdc++.h> #define LL long long #defin ...

  6. boostrap兼容ie及其案例

    多梦网络 wordpress主题 http://www.dmeng.net/

  7. CentOS 7 安装JDK

    卸载原系统上的JDK: [root@admin ~]# java -version 查看需要卸载的JDK清单: [root@admin ~]# rpm -qa | grep java java-1.6 ...

  8. Windows Server 2008文件同步

    配置Windows Server 2008文件同步   摘要: 众所周知,Linux系统可以用rsync来实现文件或目录的同步,windows系统下也一样可以.我们现在就用cwRsync来实现wind ...

  9. Jquery AutoComplete的使用方法实例

    jquery.autocomplete详解 语法: autocomplete(urlor data, [options] ) 参数: url or data:数组或者url [options]:可选项 ...

  10. android 打包签名

    1.Eclipse工程中右键工程,弹出选项中选择 android工具 → 生成签名应用包 2.选择需要打包的android项目工程 3.如果已有私钥文件,选择私钥文件 输入密码,如果没有私钥文件见第6 ...