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

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

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

www.zeeklog.com  - Redis实战之征服 Redis + Jedis + Spring (二)

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

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

相关链接:

一、预期

接上一篇,扩充User属性:

Java代码

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

几乎就是一个对象了!

www.zeeklog.com  - Redis实战之征服 Redis + Jedis + Spring (二)

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

www.zeeklog.com  - Redis实战之征服 Redis + Jedis + Spring (二)

二、代码实现

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

www.zeeklog.com  - Redis实战之征服 Redis + Jedis + Spring (二)

等等,这不是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支持!

相关链接:

Read more

深入理解 Proxy 和 Object.defineProperty

在JavaScript中,对象是一种核心的数据结构,而对对象的操作也是开发中经常遇到的任务。在这个过程中,我们经常会使用到两个重要的特性:Proxy和Object.defineProperty。这两者都允许我们在对象上进行拦截和自定义操作,但它们在实现方式、应用场景和灵活性等方面存在一些显著的区别。本文将深入比较Proxy和Object.defineProperty,包括它们的基本概念、使用示例以及适用场景,以帮助读者更好地理解和运用这两个特性。 1. Object.defineProperty 1.1 基本概念 Object.defineProperty 是 ECMAScript 5 引入的一个方法,用于直接在对象上定义新属性或修改已有属性。它的基本语法如下: javascript 代码解读复制代码Object.defineProperty(obj, prop, descriptor); 其中,obj是目标对象,prop是要定义或修改的属性名,descriptor是一个描述符对象,用于定义属性的特性。 1.2 使用示例 javascript 代码解读复制代码//

By Ne0inhk

Proxy 和 Object.defineProperty 的区别

Proxy 和 Object.defineProperty 是 JavaScript 中两个不同的特性,它们的作用也不完全相同。 Object.defineProperty 允许你在一个对象上定义一个新属性或者修改一个已有属性。通过这个方法你可以精确地定义属性的特征,比如它是否可写、可枚举、可配置等。该方法的使用场景通常是需要在一个对象上创建一个属性,然后控制这个属性的行为。 Proxy 也可以用来代理一个对象,但是相比于 Object.defineProperty,它提供了更加强大的功能。使用 Proxy 可以截获并重定义对象的基本操作,比如访问属性、赋值、函数调用等等。在这些操作被执行之前,可以通过拦截器函数对这些操作进行拦截和修改。因此,通过 Proxy,你可以完全重写一个对象的默认行为。该方法的使用场景通常是需要对一个对象的行为进行定制化,或者需要在对象上添加额外的功能。 对比 以下是 Proxy 和 Object.defineProperty 的一些区别对比: 方面ProxyObject.defineProperty语法使用 new Proxy(target,

By Ne0inhk