征服 Redis + Jedis + Spring (二)—— 哈希表操作(HMGET HMSET)

一、预期

接上一篇,扩充User属性:

Java代码 收藏代码
  1. publicclassUserimplementsSerializable{
  2. privatestaticfinallongserialVersionUID=-1267719235225203410L;
  3. privateStringuid;
  4. privateStringaddress;
  5. privateStringmobile;
  6. privateStringpostCode;
  7. }

我期望的是:

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"

几乎就是一个对象了!

但是,接下来的代码实现,让我彻底崩溃了!

二、代码实现

1.保存——HMSET

Java代码 收藏代码
  1. @Override
  2. publicvoidsave(finalUseruser){
  3. redisTemplate.execute(newRedisCallback(){
  4. @Override
  5. publicObjectdoInRedis(RedisConnectionconnection)
  6. throwsDataAccessException{
  7. byte[]key=redisTemplate.getStringSerializer().serialize(
  8. "uc.user.info.uid."+user.getUid());
  9. BoundHashOperationsbyte[],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. returnnull;
  22. }
  23. });
  24. }
  25. 这里用到:

    Java代码 收藏代码
    1. BoundHashOperationsbyte[],byte[]>boundHashOperations=redisTemplate.boundHashOps(key);
    2. boundHashOperations.put(redisTemplate.getStringSerializer().serialize("mobile"),redisTemplate.getStringSerializer().serialize(user.getMobile()));

    看着就有点肿。。。Map封装完以后,用HMSET命令:

    Java代码 收藏代码
    1. 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. publicUserread(finalStringuid){
    3. returnredisTemplate.execute(newRedisCallback(){
    4. @Override
    5. publicUserdoInRedis(RedisConnectionconnection)
    6. throwsDataAccessException{
    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. Useruser=newUser();
    19. Stringaddress=redisTemplate.getStringSerializer()
    20. .deserialize(value.get(0));
    21. user.setAddress(address);
    22. Stringmobile=redisTemplate.getStringSerializer()
    23. .deserialize(value.get(1));
    24. user.setMobile(mobile);
    25. StringpostCode=redisTemplate.getStringSerializer()
    26. .deserialize(value.get(2));
    27. user.setPostCode(postCode);
    28. user.setUid(uid);
    29. returnuser;
    30. }
    31. returnnull;
    32. }
    33. });
    34. }

    这个实现,跟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"));

    我绝对相信,要么是我用的过于肤浅,低估了Spring的封装能力。或者,我该直接Json!等等,这不是MongoDB干的事情吗?!

    PS:这两篇博客里操作的数据类型,只能是String类型,还没搞定除此以外任何类型。吾将上下而求索~~~

    上述操作也许你吐了,接下来的代码,就再吐一次吧!

    封装对象的时候,一定要记得次序。。。。这绝对不是一个优质代码的实现风格!

    Java代码 收藏代码
    1. Useruser=newUser();
    2. Stringaddress=redisTemplate.getStringSerializer().deserialize(value.get(0));
    3. user.setAddress(address);
    4. Stringmobile=redisTemplate.getStringSerializer().deserialize(value.get(1));
    5. user.setMobile(mobile);
    6. StringpostCode=redisTemplate.getStringSerializer().deserialize(value.get(2));
    7. user.setPostCode(postCode);

    好吧!苦逼的事情,就此结束。目标Json支持!

    你可能感兴趣的:(征服 Redis + Jedis + Spring (二)—— 哈希表操作(HMGET HMSET))