Redis實戰之徵服 Redis + Jedis + Spring (二)

不得不說,用哈希操做來存對象,有點自討苦吃!java

不過,既然吃了苦,也作個記錄,也許之後API升級後,能好用些呢?!web

或許,是個人理解不對,沒有真正的理解哈希表。redis

 

相關連接:ide

Redis實戰 post

Redis實戰之Redis + Jedis ui

Redis實戰之徵服 Redis + Jedis + Spring (一)spa

Redis實戰之徵服 Redis + Jedis + Spring (二).net

Redis實戰之徵服 Redis + Jedis + Spring (三)code

 

1、預期

接上一篇,擴充User屬性:對象

 

Java代碼  
  1. public class User implements Serializable {  
  2.     private static final long serialVersionUID = -1267719235225203410L;  
  3.   
  4.     private String uid;  
  5.   
  6.     private String address;  
  7.   
  8.     private String mobile;  
  9.   
  10.     private String postCode;  
  11. }  
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"

 

 

幾乎就是一個對象了! 

可是,接下來的代碼實現,讓我完全崩潰了!

 

2、代碼實現

1.保存——HMSET

 

Java代碼  
  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;
			}
		});
	}

 

 

 

這裏用到:

 

Java代碼  
  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命令:

 

Java代碼  
  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,還得根據取得順序,逐個反序列化,獲得內容。

 

Java代碼  
  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.   
  30.                 return user;  
  31.             }  
  32.             return null;  
  33.         }  
  34.     });  
  35. }  
	@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代碼  
  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類型,還沒搞定除此之外任何類型。吾將上下而求索~~~

上述操做也許你吐了,接下來的代碼,就再吐一次吧!

封裝對象的時候,必定要記得次序。。。。這絕對不是一個優質代碼的實現風格!

 

Java代碼  
  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 (三)

相關文章
相關標籤/搜索