不得不说,用哈希操作来存对象,有点自讨苦吃!
不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?!
或许,是我的理解不对,没有真正的理解哈希表。
相关链接:
征服 Redis
征服 Redis + Jedis
征服 Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)
征服 Redis + Jedis + Spring (二)—— 哈希表操作(HMGET HMSET)
征服 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; }
我期望的是:
1) "\xe4\xb8\x8a\xe6\xb5\xb7"
2) "13800138000"
3) "100859"
几乎就是一个对象了!
但是,接下来的代码实现,让我彻底崩溃了!
二、代码实现
1.保存——HMSET
@Override public void save(final User user) { redisTemplate.execute(new RedisCallback
这里用到:
BoundHashOperationsboundHashOperations = redisTemplate.boundHashOps(key); boundHashOperations.put(redisTemplate.getStringSerializer().serialize("mobile"), redisTemplate.getStringSerializer().serialize(user.getMobile()));
看着就有点肿。。。Map封装完以后,用HMSET命令:
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() { @Override public User doInRedis(RedisConnection connection) throws DataAccessException { byte[] key = redisTemplate.getStringSerializer().serialize( "uc.user.info.uid." + uid); if (connection.exists(key)) { List 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,获取其值。
Listvalue = 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);
好吧!苦逼的事情,就此结束。目标Json支持!
相关链接:
征服 Redis
征服 Redis + Jedis
征服 Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)
征服 Redis + Jedis + Spring (二)—— 哈希表操作(HMGET HMSET)
征服 Redis + Jedis + Spring (三)—— 列表操作