Redis可以說是目前最火爆的NoSQL數據庫!
?
過去幾年,Memcached很盛行,現在有很多公司已將Memcached替換成了Redis。當然,很多人替換并不清楚為什么,只是感覺不想讓主流拋棄,這也充分反映了目前Redis的強勢。
?
Redis是基于內存的數據結構存儲開源系統,采用C語言編寫,運行效率極高。可作為內存數據庫、緩存或消息代理中間件,前兩種情況實際當中使用更多些。
?
Redis與Memcached一樣,以<key,value>二元鍵值對的形式存儲數據,但與Memcached最大的不同在于Redis支持更多的數據類型,包括String、Hash、List、Set、Sorted Set等。
?
Redis目前發展很快,當前版本是3,其官方網址是:http://redis.io/ 源碼地址:https://github.com/antirez/redis
?
由于采用ANSI C編寫,Redis官方支持POSIX類型系統如linux等,Windows環境下有第三方的移植程序,但一般只做開發調試用,真正部署還是運行在linux系統上,才能發揮其威力。
?
Redis的安裝部署R
?
下面我們就在CentOS 6上進行安裝部署,具體步驟如下:
?
1.wget http://download.redis.io/releases/redis-3.0.5.tar.gz
這是當前的最新版本,可以到官網下載頁面查看最新版本或安裝以前的版本。
?
2.tar xzf redis-3.0.5.tar.gz 解壓后,cd redis-3.0.5 到Redis主目錄
?
3.make 編譯,注意可能會出現機器上缺少依賴包的提示,按提示安裝依賴包,直到make成功。
?
4.make test 運行測試,一路顯示ok通過(需要安裝TCL依賴包,見提示)。
?
?
這時在src目錄下會多出幾個可執行程序,其中redis-server是服務主程序。我們運行redis-server --help看看有哪些參數:
?
?
5. ./src/redis-server & 后臺啟動Redis,會顯示成功畫面,但會有三個警告提示。redis的提示很詳細,我們照著做修改即可。
?
echo 511 > /proc/sys/net/core/somaxconn
vim /etc/sysctl.conf 加入vm.overcommit_memory = 1
vim /etc/rc.local 加入 echo never > /sys/kernel/mm/transparent_hugepage/enabled
?
后兩個重啟生效。再次運行redis-server命令,只存在一個沒有指定config文件使用缺省配置的警告。啟動畫面如下:
?
?
我們看到,服務已啟動,監聽的端口號是6379
?
6. ./src/redis-cli 運行提供的客戶端程序,體驗下簡單操作命令。
?
?
redis所有支持命令在 http://redis.io/commands 上可以查到。
?
7. ./redis-cli shutdown 關閉redis服務。
?
8. make install 將redis命令安裝到bin目錄下,成為系統命令。
?
Redis配置參數
?
前面我們啟動redis,沒有指定配置文件,一般情況下,我們需要指定配置文件啟動。在redis主目錄下,有個redis.conf配置文件模板。cp redis.conf /etc 復制到etc目錄下。
?
redis.conf文件里的配置參數有詳細的解釋說明,下面是幾個常用參數:
?
daemonize 缺省是no, 一般使用改為yes,這樣啟動redis-server時自動是后臺運行方式。
?
port 6379 指定端口號,可以調整自己需要的端口值。
?
tcp-backlog 511 這個值就是前面需要調整somaxconn值的原因,它涉及到TCP連接時accept queue隊列的大小,是取它們的最小值。這個參數和redis高并發處理請求密切相關,根據實際運行情況調整。
?
bind 只接受來自某IP的請求,安全考慮,缺省不限制。
?
tcp-keepalive 60 主動檢測客戶端連接是否正常,官方建議是60s
?
loglevel notice 定義日志級別
logfile "" 定義日志文件位置
?
save 900 1 存儲數據到硬盤策略,這條定義的是900s內如有1個key值發生變化,就執行save存數據快照到硬盤操作。
?
dbfilename dump.rdb 指定數據快照文件名
dir ./ 指定數據快照文件目錄
?
調整好參數后,我們用redis-server /etc/redis.conf 命令啟動即可。
?
Java程序訪問Redis
?
Redis支持的客戶端操作語言非常豐富,達到40多種。就Java來說,也有很多訪問驅動實現,我們最常用的還是Jedis。
?
Jedis源碼地址: https://github.com/xetorthio/jedis 活躍度很高,能夠跟上Redis服務端發布的最新功能,而且使用簡單,基本和Redis命令行語法相似。
?
下面我們就在spring工程下簡單使用下Jedis:
?
1. pom.xml 中配置Jedis和單元測試jar包。
?
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.2</version>
</dependency>
?
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
?
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
<scope>test</scope>
</dependency>
?
2. spring配置xml文件配置Jedis連接服務器相關參數。
?
<bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
<property name="maxTotal" value="4096"/>
<property name="maxIdle" value="200"/>
<property name="maxWaitMillis" value="3000"/>
<property name="testOnBorrow" value="true" />
<property name="testOnReturn" value="true" />
</bean>
?
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg index="0" ref="poolConfig"/>
<constructor-arg index="1" value="127.0.0.1"/>
<constructor-arg index="2" value="6379" type="int"/>
</bean>
?
3. 編寫測試代碼:
?
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring-test.xml")
public class RedisTest extends AbstractJUnit4SpringContextTests {
?
@Autowired
private JedisPool jedisPool;
?
@Test
public void basicOpTest(){
?
Jedis jedis = jedisPool.getResource();
?
jedis.set("person.001.name", "frank");
jedis.set("person.001.city", "beijing");
?
String name = jedis.get("person.001.name");
String city = jedis.get("person.001.city");
?
assertEquals("frank",name);
assertEquals("beijing",city);
?
jedis.del("person.001.name");
Boolean result = jedis.exists("person.001.name");
assertEquals(false,result);
?
result = jedis.exists("person.001.city");
assertEquals(true,result);
?
jedis.close();
}
}
?
eclipse下JUnit Test運行單元測試通過!
?
?
讀完本篇,你應該了解如下內容:
1.Redis是基于內存的數據存儲系統,數據以<key,value>形式存儲。value支持多種數據類型,包括String、Hash、List、Set、Sorted Set等。
?
2.Redis采用C語言開發,安裝運行在linux等POSIX系統上,windows系統上有第三方移植,可做開發測試。
?
3.Java常用的Redis客戶端編程驅動是Jedis。
?
本文摘自微信號:Java架構師
?