Redis + Jedis + Spring 实例(对象的操作)
不得不说,用哈希操作来存对象,有点自讨苦吃!
不过,既然吃了苦,也做个记录,也许以后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;
- }
我期望的是:
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;
- }
- });
- }
这里用到:
- 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());
这时候就完成了哈希表的保存操作,可以在控制台看到相应的数据了。
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;
- }
- });
- }
这个实现,跟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"));
我绝对相信,要么是我用的过于肤浅,低估了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);
Redis + Jedis + Spring 实例(对象的操作)的更多相关文章
- 征服 Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)
有日子没写博客了,真的是忙得要疯掉. 完成项目基础架构搭建工作,解决了核心技术问题,接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: 征服 Redis 征服 Redis + J ...
- 征服 Redis + Jedis + Spring (三)—— 列表操作【转】
一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现“stringRedisTemplate.opsForList()”的强大,抓紧时间恶补下. 相关链接: 征服 Redis 征服 Re ...
- Redis实战之征服 Redis + Jedis + Spring (一)
Redis + Jedis + Spring (一)—— 配置&常规操作(GET SET DEL)接着需要快速的调研下基于Spring框架下的Redis操作. 相关链接: Redis实战 Re ...
- Redis实战之征服 Redis + Jedis + Spring (二)
不得不说,用哈希操作来存对象,有点自讨苦吃! 不过,既然吃了苦,也做个记录,也许以后API升级后,能好用些呢?! 或许,是我的理解不对,没有真正的理解哈希表. 相关链接: Redis实战 Redis实 ...
- Redis实战之征服 Redis + Jedis + Spring (三)
一开始以为Spring下操作哈希表,列表,真就是那么土.恍惚间发现“stringRedisTemplate.opsForList()”的强大,抓紧时间恶补下. 通过spring-data-redis完 ...
- 征服 Redis + Jedis + Spring —— 配置&常规操作
Spring提供了对于Redis的专门支持:spring-data-redis.此外,类似的还有: 我想大部分人对spring-data-hadoop.spring-data-mongodb.spri ...
- Redis + Jedis + Spring (list操作)
为了简便操作,我使用了StringRedisTemplate.用字符串操作做展示.当然,你可以继续使用RedisTemplate. 闲言少叙,上代码,一目了然: /** * Mar 5, 2013 * ...
- Redis + Jedis + Spring整合遇到的异常(转)
项目中需要用到缓存,经过比较后,选择了redis,客户端使用jedis连接,也使用到了spring提供的spring-data-redis.配置正确后启动tomcat,发现如下异常: Caused b ...
- Redis实战之Redis + Jedis
用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redi ...
随机推荐
- [原创作品] javascript 实现的web分页器原理
很久没有写博客了,因为最近忙于一些杂七杂八的事情.不过,互联网的价值在于信息共享,因为共享,所以互联网才能飞快发展.博主建了一个技术共享qq群:164858883,因为目前人数还比较少,活跃度还不是很 ...
- Android动态加载jar/dex
前言 在目前的软硬件环境下,Native App与Web App在用户体验上有着明显的优势,但在实际项目中有些会因为业务的频繁变更而频繁的升级客户端,造成较差的用户体验,而这也恰恰是Web App的优 ...
- javaweb 学习的好地方
http://www.cnblogs.com/xdp-gacl/p/3729033.html 强烈推荐这个哥们的学习笔记.太赞了.
- Code First 数据注释--DatabaseGenerated
EF中可以使用DatabaseGenerated设置数据库字段的属性,它有三个枚举值:Computed.None.Identity Computed 表示这一列是计算所得 None 不做处理 Iden ...
- jaxb xml to bean
package www.garbin.com.utils; import javax.xml.bind.JAXBContext; import javax.xml.bind.JAXBException ...
- git教程 入门
快速上传已有代码到github 如何将最新代码上传到github,这里讲本地已有项目文件的情况(假如本地有一个helloworld的工程目录,目录中有很多项目文件.),步骤如下: 前提:已安装git客 ...
- 常用js代码整理、收集
个人整理了一下个人常用到的一些js代码,以方便学习以及日后使用,或许有一些是个人之前从网上摘下来的,但是不记得是具体从哪里来的了,如果你看到有一段代码跟你的文章很相似甚至一样,请不要气愤,请告诉我,我 ...
- 一键分享到新浪微博、腾讯微博、搜狐微博、人人网、开心网、百度收藏等js代码大全
下面给大家一些分享的js代码,只要把代码插入自己的网页中稍微修改一下图片路径就可以用了,好了,废话少说,上代码: document.writeln("<b>喜欢本文,那就分享到 ...
- apt软件包管理
apt软件包管理 ---- http://wiki.ubuntu.org.cn/UbuntuHelp:AptGet/Howto/zh APT HOWTO ---- http://www.d ...
- Pyhon之常用操作符 - 零基础入门学习Python006
Pyhon之常用操作符 让编程改变世界 Change the world by program 今天我们来谈谈Python之常用操作符,在此之前的一些例子中,大家已经看到Python可以完成简单的算术 ...