不得不說,用哈希操做來存對象,有點自討苦吃!java
不過,既然吃了苦,也作個記錄,也許之後API升級後,能好用些呢?!web
或許,是個人理解不對,沒有真正的理解哈希表。redis
相關連接:ide
Redis實戰 post
Redis實戰之徵服 Redis + Jedis + Spring (一)spa
Redis實戰之徵服 Redis + Jedis + Spring (二).net
Redis實戰之徵服 Redis + Jedis + Spring (三)code
接上一篇,擴充User屬性:對象
public class User implements Serializable { private static final long serialVersionUID = -1267719235225203410L; private String uid; private String address; private String mobile; private String postCode; }
我指望的是:
幾乎就是一個對象了!
可是,接下來的代碼實現,讓我完全崩潰了!
@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()));
看着就有點腫。。。Map封裝完之後,用HMSET命令:
connection.hMSet(key, boundHashOperations.entries());
這時候就完成了哈希表的保存操做,能夠在控制檯看到相應的數據了。
這一刻,我完全崩潰了!取出來的值是個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; } }); }
這個實現,跟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 + Spring (一)