本文就來講一下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>

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