redis怎么用在項目上

redis怎么用在項目上

想起自己以前想把redis整合到JavaWeb項目中,網上搜了很多教程都不全面,現在我終于弄明白了,所以想在這分享一下。

redis怎么用在項目上

1.Redis的安裝

我這里就不講了,網上有很多教程,windows,Linux,我自己的是搭建在服務器上的。

圖形化連接

redis怎么用在項目上

向業務邏輯中添加緩存

1.1. 接口封裝

常用的操作redis的方法提取出一個接口,分別對應單機版和集群版創建兩個實現類。

1.1.1. 接口定義

##jedisClient

package?cn.e3mall.common.jedis; import?java.util.List; public?interface?JedisClient?{ String?set(String?key,?String?value); String?get(String?key); Boolean?exists(String?key); Long?expire(String?key,?int?seconds); Long?ttl(String?key); Long?incr(String?key); Long?hset(String?key,?String?field,?String?value); String?hget(String?key,?String?field); Long?hdel(String?key,?String...?field); Boolean?hexists(String?key,?String?field); List<string>?hvals(String?key); Long?del(String?key); }</string>

###JedisClientPool

package?cn.e3mall.common.jedis; import?java.util.List; import?redis.clients.jedis.Jedis; import?redis.clients.jedis.JedisPool; public?class?JedisClientPool?implements?JedisClient?{ private?JedisPool?jedisPool; public?JedisPool?getJedisPool()?{ return?jedisPool; } public?void?setJedisPool(JedisPool?jedisPool)?{ this.jedisPool?=?jedisPool; } @Override public?String?set(String?key,?String?value)?{ Jedis?jedis?=?jedisPool.getResource(); String?result?=?jedis.set(key,?value); jedis.close(); return?result; } @Override public?String?get(String?key)?{ Jedis?jedis?=?jedisPool.getResource(); String?result?=?jedis.get(key); jedis.close(); return?result; } @Override public?Boolean?exists(String?key)?{ Jedis?jedis?=?jedisPool.getResource(); Boolean?result?=?jedis.exists(key); jedis.close(); return?result; } @Override public?Long?expire(String?key,?int?seconds)?{ Jedis?jedis?=?jedisPool.getResource(); Long?result?=?jedis.expire(key,?seconds); jedis.close(); return?result; } @Override public?Long?ttl(String?key)?{ Jedis?jedis?=?jedisPool.getResource(); Long?result?=?jedis.ttl(key); jedis.close(); return?result; } @Override public?Long?incr(String?key)?{ Jedis?jedis?=?jedisPool.getResource(); Long?result?=?jedis.incr(key); jedis.close(); return?result; } @Override public?Long?hset(String?key,?String?field,?String?value)?{ Jedis?jedis?=?jedisPool.getResource(); Long?result?=?jedis.hset(key,?field,?value); jedis.close(); return?result; } @Override public?String?hget(String?key,?String?field)?{ Jedis?jedis?=?jedisPool.getResource(); String?result?=?jedis.hget(key,?field); jedis.close(); return?result; } @Override public?Long?hdel(String?key,?String...?field)?{ Jedis?jedis?=?jedisPool.getResource(); Long?result?=?jedis.hdel(key,?field); jedis.close(); return?result; } @Override public?Boolean?hexists(String?key,?String?field)?{ Jedis?jedis?=?jedisPool.getResource(); Boolean?result?=?jedis.hexists(key,?field); jedis.close(); return?result; } @Override public?List<string>?hvals(String?key)?{ Jedis?jedis?=?jedisPool.getResource(); List<string>?result?=?jedis.hvals(key); jedis.close(); return?result; } @Override public?Long?del(String?key)?{ Jedis?jedis?=?jedisPool.getResource(); Long?result?=?jedis.del(key); jedis.close(); return?result; } }</string></string>

###JedisClientCluster

package?cn.e3mall.common.jedis; import?java.util.List; import?redis.clients.jedis.JedisCluster; public?class?JedisClientCluster?implements?JedisClient?{ private?JedisCluster?jedisCluster; public?JedisCluster?getJedisCluster()?{ return?jedisCluster; } public?void?setJedisCluster(JedisCluster?jedisCluster)?{ this.jedisCluster?=?jedisCluster; } @Override public?String?set(String?key,?String?value)?{ return?jedisCluster.set(key,?value); } @Override public?String?get(String?key)?{ return?jedisCluster.get(key); } @Override public?Boolean?exists(String?key)?{ return?jedisCluster.exists(key); } @Override public?Long?expire(String?key,?int?seconds)?{ return?jedisCluster.expire(key,?seconds); } @Override public?Long?ttl(String?key)?{ return?jedisCluster.ttl(key); } @Override public?Long?incr(String?key)?{ return?jedisCluster.incr(key); } @Override public?Long?hset(String?key,?String?field,?String?value)?{ return?jedisCluster.hset(key,?field,?value); } @Override public?String?hget(String?key,?String?field)?{ return?jedisCluster.hget(key,?field); } @Override public?Long?hdel(String?key,?String...?field)?{ return?jedisCluster.hdel(key,?field); } @Override public?Boolean?hexists(String?key,?String?field)?{ return?jedisCluster.hexists(key,?field); } @Override public?List<string>?hvals(String?key)?{ return?jedisCluster.hvals(key); } @Override public?Long?del(String?key)?{ return?jedisCluster.del(key); } }</string>

配置:applicationContext-redis.xml

<?xml  version="1.0" encoding="UTF-8"?><beans xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemalocation="http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-4.2.xsd http://www.springframework.org/schema/context?http://www.springframework.org/schema/context/spring-context-4.2.xsd http://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop-4.2.xsd?http://www.springframework.org/schema/tx?http://www.springframework.org/schema/tx/spring-tx-4.2.xsd http://www.springframework.org/schema/util?http://www.springframework.org/schema/util/spring-util-4.2.xsd"><!-- 連接redis單機版 --><bean><property></property></bean><bean><constructor-arg></constructor-arg><constructor-arg></constructor-arg></bean><!-- 連接redis集群 --><!-- <bean id="jedisClientCluster" class="cn.e3mall.common.jedis.JedisClientCluster"> <property name="jedisCluster" ref="jedisCluster"/> </bean> <bean id="jedisCluster" class="redis.clients.jedis.JedisCluster"> <constructor-arg name="nodes"> <set> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.162"></constructor-arg> <constructor-arg name="port" value="7001"></constructor-arg> </bean>  <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.162"></constructor-arg> <constructor-arg name="port" value="7002"></constructor-arg> </bean>  <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.162"></constructor-arg> <constructor-arg name="port" value="7003"></constructor-arg> </bean>  <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.162"></constructor-arg> <constructor-arg name="port" value="7004"></constructor-arg> </bean>  <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.162"></constructor-arg> <constructor-arg name="port" value="7005"></constructor-arg> </bean>  <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.162"></constructor-arg> <constructor-arg name="port" value="7006"></constructor-arg> </bean>  </set> </constructor-arg> </bean> --></beans>

?封裝代碼測試

@Test public?void?testJedisClient()?throws?Exception?{ //初始化Spring容器 ApplicationContext?applicationContext?=?new?ClassPathXmlApplicationContext("classpath:spring/applicationContext-redis.xml"); //從容器中獲得JedisClient對象 JedisClient?jedisClient?=?applicationContext.getBean(JedisClient.class); jedisClient.set("first",?"100"); String?result?=?jedisClient.get("first"); System.out.println(result); }

添加緩存

1.1.1. 功能分析

查詢內容列表時添加緩存。

1、查詢數據庫之前先查詢緩存。

2、查詢到結果,直接響應結果。

3、查詢不到,緩存中沒有需要查詢數據庫。

4、把查詢結果添加到緩存中。

5、返回結果。

向redis中添加緩存: Key:cid Value:內容列表。需要把java對象轉換成json。 ? 使用hash對key進行歸類。 HASH_KEY:HASH ????????????|--KEY:VALUE ????????????|--KEY:VALUE ????????????|--KEY:VALUE ????????????|--KEY:VALUE

注意:添加緩存不能影響正常業務邏輯。

代碼實現(在服務層實現)

@Autowired private?JedisClient?jedisClient;
@Value("${CONTENT_LIST}") private?String?CONTENT_LIST; @Override public?E3Result?addContent(TbContent?content)?{ //將內容數據插入到內容表 content.setCreated(new?Date()); content.setUpdated(new?Date()); //插入到數據庫 contentMapper.insert(content); //緩存同步,刪除緩存中對應的數據。 jedisClient.hdel(CONTENT_LIST,?content.getCategoryId().toString()); return?E3Result.ok(); }
@Override public?List<tbcontent>?getContentListByCid(long?cid)?{ //查詢緩存 try?{ //如果緩存中有直接響應結果 String?json?=?jedisClient.hget(CONTENT_LIST,?cid?+?""); if?(StringUtils.isNotBlank(json))?{ List<tbcontent>?list?=?JsonUtils.jsonToList(json,TbContent.class); System.out.println("從緩存中查出的數據"); return?list; } }?catch?(Exception?e)?{ e.printStackTrace(); } //如果沒有查詢數據庫 TbContentExample?example?=?new?TbContentExample(); Criteria?criteria?=?example.createCriteria(); //設置查詢條件 criteria.andCategoryIdEqualTo(cid); //執行查詢 List<tbcontent>?list?=?contentMapper.selectByExampleWithBLOBs(example); //把結果添加到緩存 try?{ System.out.println("把結果添加到緩存"); jedisClient.hset(CONTENT_LIST,?cid?+?"",?JsonUtils.objectToJson(list)); }?catch?(Exception?e)?{ e.printStackTrace(); } return?list; }</tbcontent></tbcontent></tbcontent>

**注意要實現緩存同步

再講一個東西,熱緩存,給它設一個過期時間(不同步也是可以的)

??@Override public?TbItem?getItemById(long?itemId)?{ //獲取商品添加緩存,不影業務響邏輯,try-catch try?{ System.out.println("緩存獲取商品信息"); String?json?=?jedisClient.get(REDIS_ITEM_PRE+":"+itemId+":BASE"); if(StringUtils.isNotBlank(json))?{ TbItem?tbItem?=?JsonUtils.jsonToPojo(json,TbItem.class); return?tbItem; } }catch(Exception?e)?{ e.printStackTrace(); } //緩存中沒有,查詢數據庫 //根據主鍵查詢 //TbItem?tbItem?=?itemMapper.selectByPrimaryKey(itemId); TbItemExample?example?=?new?TbItemExample(); Criteria?criteria?=?example.createCriteria(); //設置查詢條件 criteria.andIdEqualTo(itemId); //執行查詢 List<tbitem>?list?=?itemMapper.selectByExample(example); if?(list?!=?null?&amp;&amp;?list.size()?&gt;?0)?{ //結果添加到緩存 try?{ System.out.println("緩存添加商品信息"); jedisClient.set(REDIS_ITEM_PRE+":"+itemId+":BASE",JsonUtils.objectToJson(list.get(0))); //設置過期時間(1個小時) jedisClient.expire(REDIS_ITEM_PRE+":"+itemId+":BASE",TIEM_CACHE_EXPIRE); }catch(Exception?e)?{ e.printStackTrace(); } return?list.get(0); } return?null; }</tbitem>

redis怎么用在項目上

redis怎么用在項目上

redis中的數據:

{"itemId":1231490,"created":1425821627000,"updated":1425821627000,"itemDesc":"
??

????

??????

????

??

溫馨提示:小米4聯通版內置運營商軟件,小米4官方聯通版是無內置運營商軟件的。
????

???

????產品展示????Products?Exhibition???

??

?

??

????

????

??

@@##@@

小米手機4

依然出色性能用智能手機閱讀、拍照、游戲甚至完成復雜艱巨的任務,這一切都依賴于快。每一代小米手機,都使用了當前先進的元器件。更快的處理器、更快的閃存、更快的相機和圖像處理,支持更快的網絡。集世界全新科技在一部5英寸大小的設備,只為讓科技樂趣人人都可享用,生活正因此變得更加美好

????

???

????產品信息????Product?Information???

??

?

Qualcomm??驍龍??801四核2.5GHz?處理器
高端手機處理器性能之王小米手機?4?采用了高通動力十足的驍龍801手機處理器,內含四個Krait?400?2.5GHz?處理核心。運算速度提升14%,性能更強大。它能出色地同時處理多個復雜任務。它的強大還體現在圖像處理器速度較前代提升近一倍,這讓拍照與錄像都有了更多玩法和可能性。內含一個?Hexagon?DSP?核心,專門以超低功耗運行電影、音樂、拍照等任務。這意味著在性能更強大的同時,手機續航都比以往更加持久耐用。

@@##@@
Adreno?330?圖形處理器
游戲機品質的3D渲染能力Adreno?330?圖形處理器支持高級圖形處理API,包括OpenGL?ES?3.0、OpenCL、RenderscriptCompute和FlexRender?。它之所以能夠快速渲染復雜的圖形,得益于統一渲染架構及FlexRender?快速渲染技術。統一渲染架構能夠根據所渲染的圖形類型,動態調整其資源分配方式,像素和頂點渲染均可進行獨立調節。FlexRender?技術可以直接或通過延遲渲染模式在圖形像素間動態轉換,從而幫助Adreno?GPU更快速、更高效地渲染游戲圖形。

@@##@@
高色飽和度屏,84%?NTSC色域
鮮艷度比?iPhone?5s?高17%小米手機4?采用了高色彩飽和度夏普/JDI屏幕,整體的色彩飽和度提升17%,令色彩表現力更加豐富。無論在小米手機4上面瀏覽圖片、觀看視頻,或是使用精彩的App,都能為你呈現逼真的顏色效果。

@@##@@
??

????

????

??

@@##@@

索尼高畫質

最快0.3秒極速對焦如何用手機拍下轉瞬即逝的美好瞬間?采用索尼?IMX?214?第二代?1300?萬像素?Exmor?RS??堆棧式圖像傳感器,通過減少片上微透鏡與感光二極管的距離,使其更容易集合光線。支持硬件更豐富、噪點更少的照片。6片鏡頭組采用了閉環式對焦技術,對焦最快至0.3秒,這比主流手機都快了兩倍之多。它還具備手機上最大的F1.8大光圈,暗光更出色,背景虛化效果更加柔美。為了讓拍攝具備更多便利和趣味,還可以使用魔術對焦功能,先拍照,回看時再選擇焦點。不必苦練攝影技能,卻可以用小米手機4拍出動人有趣的照片

支持最新4G?LTE網絡
用更快的方式上網、聽音樂、看視頻移動4G版支持最新中國移動4G(TDD-LTE)網絡,下行峰值速率最高可達到132Mbps,上傳的速度可達31Mbps。如此之快的傳輸速度幾乎可滿足對于無線應用的任何需要。當你外出旅行時,你可以用它隨時隨地觀看在線高清視頻,瀏覽網頁或玩最流行的在線游戲,極速的4G網絡速度可以帶給你酣暢淋漓的使用體驗。另可選購聯通3G及電信3G版本。

@@##@@
用手機遙控電視、空調
配備紅外發射器,支持2853款設備小米手機4?內置紅外遙控功能,支持與紅外接受設備的傳輸協議,可以通過專門為這一功能定制的小米遙控器App,遙控家里電視、空調等支持紅外協議的家用電器。目前已支持2853款設備,更多設備不斷更

@@##@@
MIUI?V5
全球24種語言版本,6500萬用戶好評如潮MIUI?針對原生?Android?深入系統底層優化,更流暢也更加省電。其次是好看,上千款原創主題,上萬種搭配,讓手機界面千變萬化。更重要的是,它讓你的生活更加方便。自動識別陌生電話,識別騷擾、詐騙電話。它還可以迅速找到你需要的生活服務,就連預約餐館和醫院掛號也能在系統中完成。

@@##@@

“}

{"id":1231490,"title":"小米4?白色?聯通3G手機","sellPoint":"賣完下柜!不銹鋼金屬邊框,5英寸屏超窄邊,驍龍四核2.5GHz處理器,3G?RAM,1

更多Redis相關技術文章,請訪問Redis教程欄目進行學習!

redis怎么用在項目上redis怎么用在項目上redis怎么用在項目上redis怎么用在項目上redis怎么用在項目上redis怎么用在項目上redis怎么用在項目上redis怎么用在項目上

? 版權聲明
THE END
喜歡就支持一下吧
點贊13 分享