目录(?)[+]

不得不说,用哈希操作来存对象,有点自讨苦吃!

不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?!

或许,是我的理解不对,没有真正的理解哈希表。

一、预期

接上一篇,扩充User属性:

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

  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. }
  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. }

这里用到:

  1. BoundHashOperations<Serializable, byte[], byte[]> boundHashOperations = redisTemplate.boundHashOps(key);
  2. boundHashOperations.put(redisTemplate.getStringSerializer().serialize("mobile"), redisTemplate.getStringSerializer().serialize(user.getMobile()));
  1. BoundHashOperations<Serializable, byte[], byte[]> boundHashOperations = redisTemplate.boundHashOps(key);
  2. boundHashOperations.put(redisTemplate.getStringSerializer().serialize("mobile"), redisTemplate.getStringSerializer().serialize(user.getMobile()));

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

  1. connection.hMSet(key, boundHashOperations.entries());
  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,还得根据取得顺序,逐个反序列化,得到内容。

  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. return user;
  30. }
  31. return null;
  32. }
  33. });
  34. }
  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. return user;
  30. }
  31. return null;
  32. }
  33. });
  34. }

这个实现,跟Redis的命令几乎一模一样,指定Key,指定field,获取其值。

  1. List<byte[]> value = connection.hMGet(key,redisTemplate.getStringSerializer().serialize("address"),
  2. redisTemplate.getStringSerializer().serialize("mobile"),
  3. redisTemplate.getStringSerializer().serialize("postCode"));
  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类型,还没搞定除此以外任何类型。吾将上下而求索~~~

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

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

  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);
  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);

Redis + Jedis + Spring 实例(对象的操作)的更多相关文章

  1. 征服 Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)

    有日子没写博客了,真的是忙得要疯掉. 完成项目基础架构搭建工作,解决了核心技术问题,接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: 征服 Redis 征服 Redis + J ...

  2. 征服 Redis + Jedis + Spring (三)—— 列表操作【转】

    一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现“stringRedisTemplate.opsForList()”的强大,抓紧时间恶补下. 相关链接: 征服 Redis 征服 Re ...

  3. Redis实战之征服 Redis + Jedis + Spring (一)

    Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: Redis实战 Re ...

  4. Redis实战之征服 Redis + Jedis + Spring (二)

    不得不说,用哈希操作来存对象,有点自讨苦吃! 不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?! 或许,是我的理解不对,没有真正的理解哈希表. 相关链接: Redis实战 Redis实 ...

  5. Redis实战之征服 Redis + Jedis + Spring (三)

    一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现“stringRedisTemplate.opsForList()”的强大,抓紧时间恶补下. 通过spring-data-redis完 ...

  6. 征服 Redis + Jedis + Spring —— 配置&常规操作

    Spring提供了对于Redis的专门支持:spring-data-redis.此外,类似的还有: 我想大部分人对spring-data-hadoop.spring-data-mongodb.spri ...

  7. Redis + Jedis + Spring (list操作)

    为了简便操作,我使用了StringRedisTemplate.用字符串操作做展示.当然,你可以继续使用RedisTemplate. 闲言少叙,上代码,一目了然: /** * Mar 5, 2013 * ...

  8. Redis + Jedis + Spring整合遇到的异常(转)

    项目中需要用到缓存,经过比较后,选择了redis,客户端使用jedis连接,也使用到了spring提供的spring-data-redis.配置正确后启动tomcat,发现如下异常: Caused b ...

  9. Redis实战之Redis + Jedis

    用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redi ...

随机推荐

  1. android分享到新浪微博,认证+发送微博,

    分享到新浪微博,折腾了大半个月,现在终于弄出来了,心里的那个爽呀,太痛快了,哈哈!! 废话少说,首先是认证, 1.进入新浪微博提供的开放平台http://open.weibo.com/ 注册新浪账号. ...

  2. [Angular 2] Using ng-for to repeat template elements

    This lesson covers Angular 2’s version of looping through data in your templates: ng-for. It’s conce ...

  3. Solr 安装与集成IK中文分词器

    创建wangchuanfu core 1.  在example目录下创建wangchuanfu-solr文件夹: 2.  将./solr下的solr.xml拷贝到wangchuanfu-solr目录下 ...

  4. Docker中的一些命令

    可以交互的方式启动container $ sudo docker run -t -i ubuntu:14.04 /bin/bash 当这个Bash shell进程终止时,这个容器也停止了. docke ...

  5. C#中弹出新窗口

    1.在主窗体程序中定义对应别的窗体的对象 Form_a_class form1 = Form_a_class  test_delegate(); 2.调用显示 form1.ShowDialog();

  6. 【android】java.net.ConnectException: localhost/127.0.0.1:8080 - Connection refused

    调试中通过android simulator模拟器链接localhost或者127.0.0.1,因为我在电脑上面建立了apache,我的代码大概就是URL url = new URL(urlStrin ...

  7. Android开发重修

    Android程序开发的重新学习 #####Mars课程学习笔记20140926 1.Service主要用于完成耗时较长的操作,没有图形化界面. 2.Content Provider数据的提供者,是A ...

  8. 实验八 sqlite数据库操作

    实验报告 课程名称 基于Android平台移动互联网开发 实验日期 2016年5月3日 实验项目名称 SQLite数据库操作 实验地点 S30010 实验类型 □验证型    √设计型    □综合型 ...

  9. meta 属性

    几乎所有的网页里,我们可以看到类似下面这段的html代码:<head><meta http-equiv="content-Type" content=" ...

  10. [TYVJ] P1026 犁田机器人

    犁田机器人 背景 Background USACO OCT 09 2ND   描述 Description Farmer John為了让自己从无穷无尽的犁田工作中解放出来,於是买了个新机器人帮助他犁田 ...