Redis實戰之徵服 Redis + Jedis + Spring (二)
不得不說,用雜湊操作來存物件,有點自討苦吃!
不過,既然吃了苦,也做個記錄,也許以後API升級後,能好用些呢?!
或許,是我的理解不對,沒有真正的理解雜湊表。
相關連結:
一、預期
接上一篇,擴充User屬性:
Java程式碼- publicclass User implements Serializable {
- privatestaticfinallong serialVersionUID = -1267719235225203410L;
- private String uid;
- private String address;
- private
- 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 postCode1) "\xe4\xb8\x8a\xe6\xb5\xb7"
2) "13800138000"
3) "100859"
幾乎就是一個物件了!
但是,接下來的程式碼實現,讓我徹底崩潰了!
二、程式碼實現
1.儲存——HMSET
Java程式碼- @Override
- publicvoid save(final User user) {
- redisTemplate.execute(new RedisCallback<Object>() {
- @Override
- public Object doInRedis(RedisConnection connection)
- throws DataAccessException {
- byte
- "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());
- returnnull;
- }
- });
- }
@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程式碼- 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命令:
Java程式碼- connection.hMSet(key, boundHashOperations.entries());
connection.hMSet(key, boundHashOperations.entries());
這時候就完成了雜湊表的儲存操作,可以在控制檯看到相應的資料了。
redis 127.0.0.1:6379> hmget uc.user.info.uid.u123456 address mobile postCode1) "\xe4\xb8\x8a\xe6\xb5\xb7"
2) "13800138000"
3) "100859"
2.獲取——HMGET
這一刻,我徹底崩潰了!取出來的值是個List,還得根據取得順序,逐個反序列化,得到內容。
Java程式碼- @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;
- }
- returnnull;
- }
- });
- }
@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程式碼- 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型別,還沒搞定除此以外任何型別。吾將上下而求索~~~
上述操作也許你吐了,接下來的程式碼,就再吐一次吧!
封裝物件的時候,一定要記得次序。。。。這絕對不是一個優質程式碼的實現風格!
Java程式碼- 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支援!
相關連結:
相關推薦
Redis實戰之徵服 Redis + Jedis + Spring (二)
不得不說,用雜湊操作來存物件,有點自討苦吃! 不過,既然吃了苦,也做個記錄,也許以後API升級後,能好用些呢?! 或許,是我的理解不對,沒有真正的理解雜湊表。 相關連結: 一、預期 接上一篇,擴充User屬性: Java程式碼 publiccla
Redis實戰之徵服 Redis + Jedis + Spring (三)
一開始以為Spring下操作雜湊表,列表,真就是那麼土。恍惚間發現“stringRedisTemplate.opsForList()”的強大,抓緊時間惡補下。 通過spring-data-redis完成LINDEX, LLEN, LPOP, LPUSH, LRANGE, L
征服 Redis + Jedis + Spring (二)—— 雜湊表操作(HMGET HMSET)
一、預期 接上一篇,擴充User屬性: Java程式碼 public class User implements Serializable { private static final long serialVersionUID = -1267
Netty遊戲伺服器實戰開發(8):利用redis或者zookeeper實現3pc分散式事務鎖(二)。支撐騰訊系列某手遊百萬級流量公測
導讀:在上篇文章中介紹了分散式事務專案的基本原理和工程元件,我們瞭解到了分散式事務的理論知識。處於實戰的經驗,我們將理論知識使用到實際專案中。所以我們將藉助idea中maven工程 來實戰我們的專案。 回到正文: 在上篇文章中我們已經把需要的準備工作做好了。現在
spring-boot-2.0.3不一樣系列之源碼篇 - run方法(二)之prepareEnvir
config ace let fff 輸出 cloud 通過 什麽事 來看 前言 此系列是針對springboot的啟動,旨在於和大家一起來看看springboot啟動的過程中到底做了一些什麽事。如果大家對springboot的源碼有所研究,可以挑些自己感興趣或者對自己有
redis叢集搭建及問題的決方法(二)
一、準備好有三個主節點的叢集 127.0.0.1:8000> cluster nodes 8ce851252f32fcab268e77d3b3ed976d57d2f498 10.211.55.5:8000 myself,master - 0 0 1 con
python 實戰之模仿開發QQ聊天軟體(三)TCP/IP伺服器與客戶端建設
無論是p2p還是c/s還是b/s,只要用到通訊,必然是要用到今天寫的這個。 TCP/IP是網路軟體最核心的部分,缺少這個你只能當做單機遊戲玩。 TCP/IP,只需要搞清楚udp和tcp這兩個就可以了。 兩者的區別在於 udp每次傳送資訊都需要傳送ip和埠號,可以比
java框架之spring(二)
注入物件(本例是接著上一個繼續進行) 在上例中,對Category的name屬性注入了"花季歲月"字串 在本例中 ,對Product物件,注入一個Category物件 1、首先新建一個類Product.java package com.hjsy.pojo; publ
資料探勘實戰之天池精準醫療大賽(3)——sklearn工具包簡介
Part 2 sklearn工具包簡介:前面介紹了一大堆的思路,要展開這一系列的流程,還要從sklearn包的使用開始,現對此作一些介紹。先分如下幾個方面介紹:2-0.學習文件2-1.轉換器,估計器及流水線 2-2.資料預處理2-3.特徵抽取、選擇2-4.模型呼叫2-5.模型
資料探勘實戰之天池精準醫療大賽(1)——賽題與資料
首先介紹題目與資料:特別提供一下資料,供後來看到的盆友下載研究(現在官網上剩下的資料是複賽的了),測試資料分AB榜,不瞭解的去看天池平臺的介紹:競賽題目中國是世界上糖尿病患者最多的國家,病人達到1.1億,每年有130萬人死於糖尿病及其相關疾病。每年用於糖尿病的醫療費用佔中國公
Spring Cloud 系列之 Gateway 服務閘道器(二)
本篇文章為系列文章,未讀第一集的同學請猛戳這裡:Spring Cloud 系列之 Gateway 服務閘道器(一) 本篇文章講解 Gateway 閘道器的多種路由規則、動態路由規則(配合服務發現的路由規則)。 路由規則 點選連結觀看:路由規則(獲取更多請關注公眾號「哈嘍沃德先生」)
spring(二)
per 取出 keys str ans 繼承 分享 sta void 盡量使用 scope="singleton" ,不要使用prototype,因為對性能的影響較大 給集合類型註入值 Java中主要的集合有:map set list 數組 department類
python學習之函數學習進階(二)
python學習之函數進階二一、內置函數 zip函數: zip()是Python的一個內建函數,它接受一系列可叠代的對象作為參數,將對象中對應的 元素按順序組合成一個tuple,每個tuple中包含的是原有序列中對應序號位置的元素,然後返回由 這些tuples組成的list。若傳入參數的長度不等,則返回li
linux設備驅動之平臺總線實踐環節(二)
linux設備驅動模型1、上一節中,我們將初步的驅動代碼寫完後編譯後,放入到rootfs中進行insmod時,在/sys/bus/platform/drvier/目錄中能夠看到why_led這個目錄,但是進入後只有一些基本的東西,卻沒有能使用這個led驅動的關鍵性東西,那是因為我們沒有提供platform_d
solr搜索之demo和集成IKAnalyzer(二)
solr solr搜索 ikanalyzer分詞器 ikanalyzer 1 新建demo-solr關閉運行的solr應用。進入solr目錄:D:\solr-4.10.2\example1、在example目錄下創建demo-solr文件夾;2、將./solr下的solr.xml拷貝
Spark源代碼分析之六:Task調度(二)
oge 3.4 總結 utili filter 相關 .com ram 順序 話說在《Spark源代碼分析之五:Task調度(一)》一文中,我們對Task調度分析到了DriverEndpoint的makeOffers()方法。這種方法針對接收到的Re
上門洗車APP --- Androidclient開發 之 網絡框架封裝介紹(二)
glob imp success rgb sed error margin p s 再次 上門洗車APP --- Androidclient開發 之 網絡框架封裝介紹(二)前幾篇博文中給大家介紹了一下APP中的基本業務及開發本項目使用的網絡架構:上門洗車APP ---
Unity3D之Mecanim動畫系統學習筆記(二):模型導入
leg character ... sdk ocs 物體 mat 版本 sset 我們要在Unity3D中使用上模型和動畫,需要經過下面幾個階段的制作,下面以一個人形的模型開發為準來介紹。 模型制作 模型建模(Modelling) 我們的美術在建模時一般會制作一個稱為
不一樣的Office 365之 —— Mini Hybrid了解一下(二)配置Mini Hybrid
O365 Office 365 混合 部署 Hybrid 下邊來看一下配置mini hybrid的過程,整個過程其實和配置混合部署的過程非常相似,現在微軟已經把混合部署的配置過的相當簡單了,基本只需要鼠標操作即可,需要說明的是mini hybrid仍然是需要以AD同步為前提的,所以
C之有符號與無符號(二)
C語言 有符號數 無符號數 我們在 C 語言中經常會見到 unsigned 關鍵字,那麽這是什麽意思呢?在計算機內,數據類型分為有符號和無符號兩種類型。它的最高位用於標識數據的符號:如果最高位為 1,表明這個數為負數;如果是0的則表明這個數為正數。那麽我們就來做個試驗驗證下,代碼如