1. 程式人生 > >Redis實戰之徵服 Redis + Jedis + Spring (二)

Redis實戰之徵服 Redis + Jedis + Spring (二)

不得不說,用雜湊操作來存物件,有點自討苦吃!

不過,既然吃了苦,也做個記錄,也許以後API升級後,能好用些呢?!

或許,是我的理解不對,沒有真正的理解雜湊表。

相關連結:

一、預期

接上一篇,擴充User屬性:

Java程式碼  
  1. publicclass User implements Serializable {  
  2.     privatestaticfinallong 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"

幾乎就是一個物件了!

 

但是,接下來的程式碼實現,讓我徹底崩潰了!

二、程式碼實現

1.儲存——HMSET

Java程式碼  
  1. @Override
  2. publicvoid 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.             returnnull;  
  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.             returnnull;  
  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!等等,這不是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支援!

相關連結:

相關推薦

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

Unity3DMecanim動畫系統學習筆記:模型導入

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的則表明這個數為正數。那麽我們就來做個試驗驗證下,代碼如