1、redis基本特性
Redis是基於內存的Key-Value型高性能的NoSQL數據庫。
1.1、基於鍵值對的數據結構
redis主要提供了5種數據結構(即5種不同類型的值value):
字符串類型(String)、散列類型(Hash)、列表類型(List)、集合類型(Set)、有序集合類型(SortedSet,簡稱Zset)
1.2、速度快
1.Redis的所有數據都是存放在內存中的,所以把數據放在內存中是Redis速度快的最主要原因。
2. Redis是用C語言實現的,一般來說C語言實現的程序“距離”操作系統更近,執行速度 相對會快。
3. Redis使用了單線程架構,預防了多線程可能產生的競爭問題。
1.3、比較豐富的功能
1.提供了鍵過期功能,可以用來實現緩存 提供了發佈訂閱功能,可以用來實現消息系統 。
2.提供了簡單的事務功能,能在一定程度上保證事務特性。
3.提供了流水線(Pipeline)功能,這樣客戶端能將一批命令一次性傳到Redis,減少了網絡的開銷。
1.4、客戶端語言多
Redis提供了簡單的TCP通信協議,很多編程語言可以很方便的接入到Redis,所以支持Redis的客戶端語言也非常多,基本涵蓋了主流的編程語言。
- 官網中列出了一些Java的客戶端,比如Jedis、Redisson、Jredis、JDBC-Redis等,其中官方推薦使用Jedis和Redisson。
1.5、持久化
由於redis的數據是放在內存中的,一旦發生斷點或者機器故障,會丟失重要的數據,因此爲了保證數據的持久性,提供了兩種持久化到硬盤的方案:
- RDB方式(默認)
- AOF方式
1.6、主從複製
Redis提供了複製功能,實現了多個相同數據的Redis副本,複製功能是分佈式Redis的基礎。
1.7、高可用和分佈式
Redis從2.8版本提供了高可用實現:Redis Sentinel (哨兵模式),它能夠保證Redis節點的故障發現和故障自動轉移。
Redis從3.0版本提供了分佈式實現Redis Cluster 集羣,保證了高可用、高性能、高可擴展性。
2、應用場景
2.1、內存數據庫
可以用於實現登錄信息、購物車信息、用戶瀏覽記錄等功能。
2.2、緩存服務器
可以用於實現商品數據、廣告數據等功能。
2.3、解決分佈式集羣架構中的session分離問題(session共享)
2.4、消息隊列
消息隊列系統可以說是一個大型網站的必備基礎組件,因爲其具有業務解耦、非實時業務削峯等特性。Redis提供了發佈訂閱功能和阻塞隊列的功能,雖然功能比較少,但是對於一般的消息隊列功能基本可以滿足。
可以用於實現秒殺、搶購等功能。
2.5、應用排行榜
排行榜系統幾乎存在於所有的網站,例如按照熱度排名的排行榜,按照發布時間的排行榜,按照各種複雜維度計算出的排行榜,Redis提供了列表和有序集合數據結構,合理的使用這些數據結構可以很方便的構建各種排行榜系統。
2.6、網站訪問統計
3、Java客戶端Jedis
3.1、添加jar包
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
3.2、單實例連接
@Test
public void testJedis() {
//創建一個Jedis的連接
Jedis jedis = new Jedis("127.0.0.1", 6379);
//執行redis命令
jedis.set("key", "hello world");
//從redis中取值
String result = jedis.get("key");
//打印結果
System.out.println(result);
//關閉連接
jedis.close();
}
3.3、連接池連接
@Test
public void testJedisPool() {
//創建一連接池對象
JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);
//從連接池中獲得連接
Jedis jedis = jedisPool.getResource();
String result = jedis.get("key") ;
System.out.println(result);
//關閉連接
jedis.close();
//關閉連接池
jedisPool.close();
}
3.4、spring整合JedisPool
- 配置spring配置文件applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd ">
<!-- 連接池配置 -->
<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
<!-- 最大連接數 -->
<property name="maxTotal" value="30" />
<!-- 最大空閒連接數 -->
<property name="maxIdle" value="10" />
<!-- 每次釋放連接的最大數目 -->
<property name="numTestsPerEvictionRun" value="1024" />
<!-- 釋放連接的掃描間隔(毫秒) -->
<property name="timeBetweenEvictionRunsMillis" value="30000" />
<!-- 連接最小空閒時間 -->
<property name="minEvictableIdleTimeMillis" value="1800000" />
<!-- 連接空閒多久後釋放, 當空閒時間>該值 且 空閒連接>最大空閒連接數 時直接釋放 -->
<property name="softMinEvictableIdleTimeMillis" value="10000" />
<!-- 獲取連接時的最大等待毫秒數,小於零:阻塞不確定的時間,默認-1 -->
<property name="maxWaitMillis" value="1500" />
<!-- 在獲取連接的時候檢查有效性, 默認false -->
<property name="testOnBorrow" value="false" />
<!-- 在空閒時檢查有效性, 默認false -->
<property name="testWhileIdle" value="true" />
<!-- 連接耗盡時是否阻塞, false報異常,ture阻塞直到超時, 默認true -->
<property name="blockWhenExhausted" value="false" />
</bean>
<!-- redis單機 通過連接池 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool"
destroy-method="close">
<constructor-arg name="poolConfig" ref="jedisPoolConfig" />
<constructor-arg name="host" value="主機ip" />
<constructor-arg name="port" value="端口號" />
</bean>
</beans>
@Test
public void testJedisPool() {
JedisPool pool = (JedisPool) applicationContext.getBean("jedisPool");
Jedis jedis = null;
try {
jedis = pool.getResource();
jedis.set("key1", "xiaoli");
String name = jedis.get("key1");
System.out.println(name);
} catch (Exception ex) {
ex.printStackTrace();
} finally {
if (jedis != null) {
// 關閉連接
jedis.close();
}
}
}