0九、redis安裝入門

課程補充

1.1 網絡的知識

1.1.1 虛擬機和window的鏈接

 

 

說明:虛擬機的nat模式依賴於net8網卡,nat8網卡的地址是一個網關,window系統中.window系統訪問Linux系統必須通過nat8網卡.不然不能通訊java

1.1.2 虛擬化關閉

 

 

說明:該報錯信息是因爲計算機關閉了虛擬化設置.須要進入bios系統中開啓便可F10保存退出.mysql

1.1.3 數據庫連接長時間連接不上

說明:1.關閉防火牆ios

     2.開放mysql對外的訪問權限nginx

 3.ping 主機IP地址是否成功redis

 4.nat8網卡重啓算法

 5.安裝mysql開始spring

 6.保證mysql數據的一致性sql

Redis

2.1 Redis介紹

2.1.1 分析

說明:數據庫中雖然實現了主從複製和讀寫分離.在必定程度上可以抗擊高併發,可是性能並非特別的完善.如今所面臨的主要問題是用戶大量的讀的操做所引起的高併發的問題?數據庫

如何處理:緩存機制json

 

 

2.1.2 緩存機制

說明:緩存機制是下降了客戶端訪問服務器的訪問頻次.而且緩存中的數據是與服務器(數據庫)中的數據是同步的.

2.1.3 引入緩存引起的問題

1.緩存的數據如何存儲??

2.緩存中的數據如何持久化??

3.緩存中的數據如何實現數據同步??

4.緩存中的數據內存如何維護

2.1.4 解決方案

1.緩存中的數據可使用Map存儲,

由於map的數據結構是key:value. key不容許重複

2.定時將緩存中的數據保存到磁盤文件中.當服務器宕機,先應該讀取磁盤持久化文件,恢復緩存的數據.

3.當數據發生」更新」操做時,及時的維護緩存的數據(攔截器/監聽器/AOP)

4.設定最大的內存,當內存超過閾值時,採用lru算法刪除最近最少使用的數據

 

2.1.5 Redis介紹

 

說明:redis是現階段使用量較多的緩存數據庫.可以支持300000/秒集合運算.由於底層是基於c語言開發的.

 

2.1.6 Redis下載

  

 

 

2.2 安裝redis

2.2.1 引入jar

 

 

2.2.2 編譯redis

 

 

 

 

 

說明:若是出現上述文件表示編譯成功

 

  1. redis-server 表示啓動redis

  2. redis-cli    鏈接redis的客戶端

  3. redis-check-rdb 檢測數據持久化文件 rdb

  4. redis-check-aof 檢測redis持久化文件aof

2.2.3 安裝redis

 

 

說明:若是出現上圖的提示,表示redis安裝成功

2.2.4 Redis啓動

說明:啓動的命令 redis-server

 

 

 

2.2.5 開啓redis的後臺啓動

  1. 編輯配置文件

vim redis.conf

  1. 取消IP綁定

 

 

  1. 關閉保護模式

 

 

4.開啓後臺啓動

 

 

 

  1. 啓動測試

redis-server redis.conf

 

 

5.關閉redis

Kill -9 9249

redis-cli shutdown

 

 

2.2.6 Redis客戶端測試

命令:redis-cli 進入客戶端

 

2.2.7 Redis命令

說明:學習redis命令

指令

說明

案例

set

設定key的值

set name tom

get

獲取指定 key 的值

get name

strlen

獲取key值的長度

strlen name

exists

檢查給定 key 是否存在

exists name 返回1存在  0不存在

del

刪除指定的key/key1 key2

del name1 name2

keys

命令用於查找全部符合給定模式 pattern 的 key

Keys * 查詢所有的key值

Keys n?me 佔位符

Keys name* 以name開頭的key

mset

賦值多個key-value

mset key1 value1 key2 value2 key3 value3

同時賦值多個值

mget

獲取多個key

Mget key1 key2 key3

append

對指定的key進行追加

append key 123456   value123456

append key " 123456" value 123456中間多一個空格

Type

查看key的類型

Type key1  

127.0.0.1:6379> TYPE key1string

Flushdb

清空當前數據庫

Flushdb 清空數據庫

Select

切換數據庫

Select 0-15 redis一共有16個數據庫

FLUSHALL

清空所有數據庫數據

flushall

Incr

自動增加1

Incr num  數據會自動加1

Incr string 數據庫會報錯

Decr

自動減1

Decr name 數據會自動減1

incrby

指定步長自增

Incrby 2 每次自增2

Decrby

指定步長自減

Decrby 2每次減2

Expire

指定key的失效時間單位是秒(s)

EXPIRE name1 5   5秒後數據失效

Ttl

查看key的剩餘存活時間

Ttl name

-2表示失效

-1沒有失效時間

Pexpire

設置失效時間(毫秒)

Pexpire name 1000 用於秒殺業務

Persist

撤銷失效時間

撤銷失效時間

2.3 Redis入門案例

2.3.1 引入jar包文件

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-redis</artifactId>
    <version>1.4.1.RELEASE</version>
</dependency>

<jedis.version>2.6.2</jedis.version>
<!-- jedis -->
<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>${jedis.version}</version>
</dependency>

 

2.3.2 入門案例

/**
     * 1.鏈接遠程redis的客戶端 ip:6379
     * 2.經過jedis操做數據的增和刪
     */
    @Test
    public void test01(){
        Jedis jedis = new Jedis("192.168.126.142", 6379);
        jedis.set("name", "jerry");
        System.out.println("獲取redis中的數據:"+jedis.get("name"));
    }

 

2.4 Spring管理jedis

2.4.1 編輯配置文件

<!--Spring管理Jedis  
        name= "構造參數的名稱"
        index="構造參數的位置"
        總結:構造注入時使用index不用name.緣由因爲java只會維護形參的數據類型
        不會維護形參的名稱.全部經過name屬性進行構造注入時,可能會產生風險.
        因此建議使用index.
        
        addUser(int age,String sex)
        addUser(int arg0,String arg1) 因爲沒有導入源碼
        
        關於type類型的說明:
        通常狀況下,SPring會自動的維護參數類型,因此能夠省略不寫.
        可是若是類中的構造方法重載較多,出現參數個數相同的狀況,
        須要指定參數類型.Spring根據特定的參數實現構造注入.
    -->
    <bean id="jedis" class="redis.clients.jedis.Jedis">
        <constructor-arg index="0" value="${redis.host}" 
        type="java.lang.String"/>
        <constructor-arg index="1" value="${redis.port}" 
        type="int"/>
    </bean>

 

2.4.2 引入redis的配置文件

1.編輯redis.properties

 

 2.交給Spring容器管理

 

 

2.5 Redis緩存實例

2.5.1 使用緩存的要求

說明:將變化不大的數據添加到緩存中.

省市縣區,部門名稱/信息/商品的分類目錄

2.5.2 商品分類目錄實現緩存

說明:商品分類目錄使用redis緩存實現

規定:

  1. key值使用parentId
  2. value值使用List集合的JSON

  步驟:

1.當用戶查詢數據時,先查詢緩存

2.當緩存中沒有數據,應該查詢後臺的數據庫

3.將查詢的結果轉化爲JSON,存入redis

4.當用戶再次查詢時,緩存中已經含有該數據

5.redis中的JSON串轉化爲List集合

6.list集合返回

 

 

2.5.3 編輯Controller

 

 

2.5.4 編輯Service

/**
     * 1.當用戶查詢數據時,先查詢緩存
       2.當緩存中沒有數據,應該查詢後臺的數據庫
       3.將查詢的結果轉化爲JSON串,存入redis中
       4.當用戶再次查詢時,緩存中已經含有該數據
       5.將redis中的JSON串轉化爲List集合
       6.將list集合返回
     */
    @Override
    public List<ItemCat> findItemCatByParentId(Long parentId) {
        //建立List集合
        List<ItemCat> itemCatList = new ArrayList<ItemCat>();
        
        //定義key 定義前綴保證key不重複
        String key = "ITEM_CAT_"+parentId;
        
        //從緩存中獲取數據
        String jsonData = jedis.get(key);
        
        try {
            //判斷返回值是否爲空
            if(StringUtils.isEmpty(jsonData)){
                //表示沒有緩存 查詢數據庫
                ItemCat itemCat = new ItemCat();
                itemCat.setParentId(parentId);
                itemCat.setStatus(1); //正常的分類信息
                
                itemCatList = itemCatMapper.select(itemCat);
                
                //將itemcatList集合轉化爲JSON串
                String resultJSON = 
                        objectMapper.writeValueAsString(itemCatList);
                
                //將數據存入redis緩存中
                jedis.set(key, resultJSON);
            }else{
                //表示redis中含有數據,將JSON數據轉化爲List集合
                ItemCat[] itemCats = 
                        objectMapper.readValue(jsonData,ItemCat[].class);
                
                //將返回值轉化爲List集合
                itemCatList = Arrays.asList(itemCats);
            }
        
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        return itemCatList;

    }    
View Code

 

2.5.5 編輯pojo

 

 

說明:若是不添加上述的註解則會報錯

 

 

 

說明:因爲將JSON數據轉化爲對象時,須要調用其中的setXXX()方法.可是statetext屬性是樹形結構展示數據時的要求和實際的業務沒有關係.因此添加@JsonIgnoreProperties(ignoreUnknown=true)表示忽略未知字段.最終實現對象的轉化.

2.5.6 速度測試

 

  1. 使用redis緩存前

沒有使用redis緩存前耗時400毫秒

  1. 使用redis緩存後

 

 

速度明顯提高

 

2.5.7 修改

1.修改數據文件

 

2.修改nginx配置文件

 

 

2.6 Redis單臺高級編輯

2.6.1 定義配置文件

<!--經過線程池的方式整合單臺redis  -->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!--定義鏈接的總數  -->
        <property name="maxTotal" value="${redis.maxTotal}"/>
        
        <!--定義最大的空閒數量  -->
        <property name="maxIdle" value="${redis.maxIdle}"/>
        
        <!--定義最小空閒數量  -->
        <property name="minIdle" value="${redis.minIdle}"></property>
    </bean>
    
    
    <!--經過工廠模式建立jedis鏈接 
        須要指定 host主機 和端口號
        引用鏈接池配置
     -->
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="hostName" value="${redis.host}"/>
        <property name="port" value="${redis.port}"/>
        
        <!--引入線程池的配置  -->
        <property name="poolConfig" ref="poolConfig"/>
    </bean>
    
    <!--配置SpringJedisTemplate spring操做redis的模板工具API  -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.StringRedisTemplate">
        <!--配置redis工廠  -->
        <property name="connectionFactory" ref="jedisConnectionFactory"></property>
    </bean>
View Code

 

2.6.2 引入redis.properties文件

redis.host=192.168.126.142

redis.port=6379

redis.maxTotal=1000

redis.maxIdle=30

redis.minIdle=10

2.6.3 編輯工具類

@Service
public class RedisService {
    
    @Autowired    //注入spring的模板工具
    private StringRedisTemplate redisTemplate;
    
    
    public void set(String key,String value){
        ValueOperations<String, String> operations = 
                redisTemplate.opsForValue();
        //將數據寫入redis中
        operations.set(key, value);
    }
    
    //經過key獲取數據
    public String get(String key){
        ValueOperations<String, String> operations = 
                redisTemplate.opsForValue();
        return operations.get(key);
    }    
}
View Code

 

說明:jt-common編輯完成以後須要從新進行打包,不然業務層調用不生效

2.6.4 編輯service

說明:將原有單個jedis的操做改成jedis鏈接池的形式.性能更好,更加適用於企業開發.

相關文章
相關標籤/搜索