Redis的介紹及使用實例.


本文就來講一下Redis安裝的方法和Redis生成主鍵的優點以及和其他幾種方式生成主鍵的對比. 

1,Redis安裝
首先將Redis的tar包拷貝到Linux下的根目錄


然后解壓到redis文件夾下:(先使用mkdir創建redis文件夾)


接下來就是解壓tar包到redis目錄下:

解壓后的目錄結構:


編譯: 使用Make命令

安裝:


安裝好之后的目錄: 


6379 下的目錄結構:(這個rdb文件時: redis database, 暫時不用管它, 重啟后自動生成的)


bin下的目錄結構:


配置后台運行:(將redis-3.0.0目錄下的redis.conf文件拷貝到6379目錄下, 使用cp命令)


編輯redis.conf文件(使用vim 命令編輯,修改daemonize為yes, 意思就是支持后台運行)


啟動redis服務:(啟動及停止命令)

 

客服端連接服務器:(如果是遠程連接: ./bin/redis-cli -h 192.168.200.128 -p 6379)

命令行演示:


這樣一個redis就啟動完成了. 

2, 使用Redis生成主鍵的優點及與其他生成主鍵方式的對比
Redis生成ID
當使用數據庫來生成ID性能不夠要求的時候,我們可以嘗試使用Redis來生成ID。這主要依賴於Redis是單線程的,所以也可以用生成全局唯一的ID。可以用Redis的原子操作 INCR和INCRBY來實現。

可以使用Redis集群來獲取更高的吞吐量。假如一個集群中有5台Redis。可以初始化每台Redis的值分別是1,2,3,4,5,然后步長都是5。各個Redis生成的ID為:

A:1,6,11,16,21

B:2,7,12,17,22

C:3,8,13,18,23

D:4,9,14,19,24

E:5,10,15,20,25

這個,隨便負載到哪個機確定好,未來很難做修改。但是3-5台服務器基本能夠滿足器上,都可以獲得不同的ID。但是步長和初始值一定需要事先需要了。使用Redis集群也可以方式單點故障的問題。

另外,比較適合使用Redis來生成每天從0開始的流水號。比如訂單號=日期+當日自增長號。可以每天在Redis中生成一個Key,使用INCR進行累加。

優點:

1)不依賴於數據庫,靈活方便,且性能優於數據庫。

2)數字ID天然排序,對分頁或者需要排序的結果很有幫助。

缺點:

1)如果系統中沒有Redis,還需要引入新的組件,增加系統復雜度。

2)需要編碼和配置的工作量比較大。

用INT做主鍵的優點:

    1、需要很小的數據存儲空間,僅僅需要4 byte 。

    2、insert和update操作時使用INT的性能比GUID好,所以使用int將會提高應用程序的性能。

    3、index和Join 操作,int的性能最好。

    4、容易記憶。

    5、支持通過函數獲取最新的值,如:Scope_Indentity() 。

使用INT做主鍵的缺點

    1、如果經常有合並表的操作,就可能會出現主鍵重復的情況。

    2、使用INT數據范圍有限制。如果存在大量的數據,可能會超出INT的取值范圍。

    3、很難處理分布式存儲的數據表。

使用GUID做主鍵的優點:

    1、它是獨一無二的。

    2、出現重復的機會少。

    3、適合大量數據中的插入和更新操作。

    4、跨服務器數據合並非常方便。

使用GUID做主鍵的缺點:

    1、存儲空間大(16 byte),因此它將會占用更多的磁盤大小。

    2、很難記憶。join操作性能比int要低。

    3、沒有內置的函數獲取最新產生的guid主鍵。

    4、GUID做主鍵將會添加到表上的所以其他索引中,因此會降低性能。


3. 代碼中演示使用Redis
Java接口測試Redis:



Spring和Redis整合:

Service層:(ProductServiceIml.java) 

      @Autowired
      private Jedis jedis;

 2     public void insertProduct(Product product){
 3         //商品設置
 4         //ID自增長的方式不好, 在這里使用redis生成id
 5         Long id = jedis.incr("pno");
 6         product.setId(id);
 7         
 8         //設置默認下架
 9         product.setIsShow(false);
10         //默認不刪除
11         product.setIsDel(false);
12         //時間
13         product.setCreateTime(new Date());
14         
15         //保存商品, 在mapper.xml中寫的是返回自增長的主鍵id, 然后進行級聯保存sku表
16         //但是product如果已經設置了id 就不會再返回主鍵id了.
17         productDao.insertSelective(product);
18         
19         //庫存 多個
20         for (String color : product.getColors().split(",")) {
21             //尺碼
22             for(String size : product.getSizes().split(",")){
23                 Sku sku = new Sku();
24                 //商品ID 這個在mapper.xml中設置返回主鍵id
25                 sku.setProductId(product.getId());
26                 //顏色 
27                 sku.setColorId(Long.parseLong(color));
28                 //市場價
29                 sku.setMarketPrice(0f);
30                 //售價
31                 sku.setPrice(0f);
32                 //運費
33                 sku.setDeliveFee(10f);
34                 //購買限制
35                 sku.setUpperLimit(188);
36                 //尺碼
37                 sku.setSize(size);
38                 //時間
39                 sku.setCreateTime(new Date());
40                 //庫存
41                 sku.setStock(0);
42                 skuDao.insertSelective(sku);
43             }
44         }
45     }

看到這個最上面使用了Jdis去調用Redis服務, 然后使用incr對pno(在redis中可以對pno設置值)加1操作. 之前使用的都是自增長ID, 在mapper.xml中insert完成之后自動返回主鍵id到product中, 在級聯保存的時候可以直接使用product.getId(). 下面就來看一下redis與spring整合的配置.




redis.xml配置文件:

 1 <beans xmlns="http://www.springframework.org/schema/beans"
 2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
 3     xmlns:context="http://www.springframework.org/schema/context"
 4     xmlns:aop="http://www.springframework.org/schema/aop" 
 5     xmlns:tx="http://www.springframework.org/schema/tx"
 6     xmlns:task="http://www.springframework.org/schema/task"
 7     xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
 8     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 9         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
10         http://www.springframework.org/schema/mvc 
11         http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 
12         http://www.springframework.org/schema/context 
13         http://www.springframework.org/schema/context/spring-context-4.0.xsd 
14         http://www.springframework.org/schema/aop 
15         http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 
16         http://www.springframework.org/schema/tx 
17         http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
18         http://www.springframework.org/schema/task
19            http://www.springframework.org/schema/task/spring-task-4.0.xsd
20         http://code.alibabatech.com/schema/dubbo        
21         http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
22         
23         <!-- 整合Redis-->
24         <bean id="jdis" class="redis.clients.jedis.Jedis">
25             <constructor-arg value="192.168.200.128" index="0" type="java.lang.String"/>
26             <constructor-arg value="6379" index="1"/>
27         </bean>        
28         
29 </beans>
View Code


關於Redis的使用暫時就這么多, 下次還會繼續分享更多的內容. 







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM