征服 Redis + Jedis + Spring (二)—— 雜湊表操作(HMGET HMSET)
阿新 • • 發佈:2019-01-30
一、預期
接上一篇,擴充User屬性:
Java程式碼- 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 postCode1) "\xe4\xb8\x8a\xe6\xb5\xb7"
2) "13800138000"
3) "100859"
幾乎就是一個物件了!
但是,接下來的程式碼實現,讓我徹底崩潰了!
二、程式碼實現
1.儲存——HMSET
Java程式碼- @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;
- }
- });
- }
這裡用到:
Java程式碼- BoundHashOperations<Serializable, byte[], byte[]> boundHashOperations = redisTemplate.boundHashOps(key);
- boundHashOperations.put(redisTemplate.getStringSerializer().serialize("mobile"), redisTemplate.getStringSerializer().serialize(user.getMobile()));
看著就有點腫。。。Map封裝完以後,用HMSET命令:
Java程式碼- connection.hMSet(key, boundHashOperations.entries());
這時候就完成了雜湊表的儲存操作,可以在控制檯看到相應的資料了。
redis 127.0.0.1:6379> hmget uc.user.info.uid.u123456 address mobile postCode1) "\xe4\xb8\x8a\xe6\xb5\xb7"
2) "13800138000"
3) "100859"
2.獲取——HMGET
這一刻,我徹底崩潰了!取出來的值是個List,還得根據取得順序,逐個反序列化,得到內容。
Java程式碼- @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,獲取其值。
Java程式碼- List<byte[]> value = connection.hMGet(key,redisTemplate.getStringSerializer().serialize("address"),
- redisTemplate.getStringSerializer().serialize("mobile"),
- redisTemplate.getStringSerializer().serialize("postCode"));
我絕對相信,要麼是我用的過於膚淺,低估了Spring的封裝能力。或者,我該直接Json!等等,這不是MongoDB乾的事情嗎?!
PS:這兩篇部落格裡操作的資料型別,只能是String型別,還沒搞定除此以外任何型別。吾將上下而求索~~~
上述操作也許你吐了,接下來的程式碼,就再吐一次吧!
封裝物件的時候,一定要記得次序。。。。這絕對不是一個優質程式碼的實現風格!
Java程式碼- 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支援!