Redis实战之征服 Redis + Jedis + Spring (二)
来源:互联网 发布:梵高怎么得的精神 知乎 编辑:程序博客网 时间:2024/06/05 08:05
目录(?)[+]
- 一预期
- 二代码实现
- 保存HMSET
- 获取HMGET
不得不说,用哈希操作来存对象,有点自讨苦吃!
不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?!
或许,是我的理解不对,没有真正的理解哈希表。
一、预期
接上一篇,扩充User属性:
- public class User implements Serializable {
- private static final long serialVersionUID = -1267719235225203410L;
- private String uid;
- private String address;
- private String mobile;
- private String postCode;
- }
- public class User implements Serializable {
- private static final long serialVersionUID = -1267719235225203410L;
- private String uid;
- private String address;
- private String mobile;
- private String postCode;
- }
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"
1) "\xe4\xb8\x8a\xe6\xb5\xb7"
2) "13800138000"
3) "100859"
几乎就是一个对象了!
但是,接下来的代码实现,让我彻底崩溃了!
二、代码实现
1.保存——HMSET
- @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;
- }
- });
- }
- @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;
- }
- });
- }
@Overridepublic void save(final User user) {redisTemplate.execute(new RedisCallback<Object>() {@Overridepublic 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()));
- BoundHashOperations<Serializable, byte[], byte[]> boundHashOperations = redisTemplate.boundHashOps(key);
- 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命令:
- connection.hMSet(key, boundHashOperations.entries());
- 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"
1) "\xe4\xb8\x8a\xe6\xb5\xb7"
2) "13800138000"
3) "100859"
2.获取——HMGET
这一刻,我彻底崩溃了!取出来的值是个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;
- }
- });
- }
- @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;
- }
- });
- }
@Overridepublic User read(final String uid) {return redisTemplate.execute(new RedisCallback<User>() {@Overridepublic 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"));
- List<byte[]> value = connection.hMGet(key,redisTemplate.getStringSerializer().serialize("address"),
- redisTemplate.getStringSerializer().serialize("mobile"),
- 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类型,还没搞定除此以外任何类型。吾将上下而求索~~~
上述操作也许你吐了,接下来的代码,就再吐一次吧!
封装对象的时候,一定要记得次序。。。。这绝对不是一个优质代码的实现风格!
- 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 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 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支持!
forward from http://blog.csdn.net/it_man/article/details/9730649- Redis实战之征服 Redis + Jedis + Spring (二)
- Redis实战之征服 Redis + Jedis + Spring (二)
- Redis实战之征服 Redis + Jedis + Spring (二)
- Redis实战之征服 Redis + Jedis + Spring (一)
- Redis实战之征服 Redis + Jedis + Spring (三)
- Redis实战之征服 Redis + Jedis + Spring (一)
- Redis实战之征服 Redis + Jedis + Spring (三)
- Redis实战之征服 Redis + Jedis + Spring (一)
- Redis实战之征服 Redis + Jedis + Spring (一)
- Redis实战之征服 Redis + Jedis + Spring (三)
- Redis实战之征服 Redis + Jedis + Spring (一)
- Redis实战之征服 Redis + Jedis + Spring (一)
- 征服 Redis + Jedis + Spring (二)—— 哈希表操作(HMGET HMSET)
- 征服 Redis + Jedis + Spring (二)—— 哈希表操作(HMGET HMSET)
- 征服 Redis + Jedis + Spring (三)—— 列表操作
- 征服 Redis + Jedis + Spring (三)—— 列表操作
- 征服 Redis + Jedis + Spring (三)—— 列表操作
- 征服 Redis + Jedis + Spring (三)—— 列表操作
- C++中虚析构函数的作用
- C++ 一些常用的函数以及头文件(一)
- QQ通信机制
- Flex的默认主程序
- FRM-92101:forms Server在启动过程中失败
- Redis实战之征服 Redis + Jedis + Spring (二)
- C#中窗体使用Invoke和BeginInvoke详解
- Power Strings(kmp 重复子串)
- boost::checked_delete作用介绍
- excelDownload
- Android项目实战--手机卫士18--读取用户的短信内容以及短信备份
- 黑马程序员------Java的泛型(原理应用、自定义泛型)
- log4j:ERROR Could not instantiate class [org.apache.hadoop.hive.shims.HiveEventCounter].
- PowerDesigner 学习及使用