redis(一):redis基本介紹

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();
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章