征服 Redis + Jedis + Spring (二)—— 哈希表操作(HMGET HMSET)
不得不说,用哈希操作来存对象,有点自讨苦吃!
不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?!
或许,是我的理解不对,没有真正的理解哈希表。
?
?
相关链接:
征服 Redis
征服 Redis + Jedis
征服 Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)
征服 Redis + Jedis + Spring (二)—— 哈希表操作(HMGET HMSET)
?
一、预期接上一篇,扩充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.保存——HMSET?
@Overridepublic void save(final User user) {redisTemplate.execute(new RedisCallback<Object>() {@Overridepublic 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()));?看着就有点肿。。。Map封装完以后,用HMSET命令:
?
connection.hMSet(key, boundHashOperations.entries());
?这时候就完成了哈希表的保存操作,可以在控制台看到相应的数据了。
?
@Overridepublic User read(final String uid) {return redisTemplate.execute(new RedisCallback<User>() {@Overridepublic 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"));?我绝对相信,要么是我用的过于肤浅,低估了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)
1 楼 kuro_0505 2012-09-15 确实很痛苦,这样子太操蛋了~看看有没有好点方法~