Redis簡介

1. 關係型數據庫

常見的關係型數據庫:SqlServer,Mysql,oracle。
特點:數據和數據之間,表和字段之間,表和表之間是存在關係的。
例如:部門表中的員工ID,與員工表的員工ID。
用戶表中的用戶名、密碼字段。
商品分類表和商品表,就是一對多的關係。
特點:
1、數據之間有關係,在進行對數據的增刪改查的時候就非常方便。
如查部門下的所有員工信息時,只要寫一條SQL語句,就能搞定。
2、關係型數據庫是有事務操作,能夠保證數據的一致性、完整性。

缺點:
1、因爲數據與數據之間是有關係,這種關係不是空穴來風,它是由底層大量算法來保證的。如select * from product;語句,其實會進行底層大量算法的運算。雖然查詢出來你所想要的數據,但是大量算法會拉低系統運行速度、消耗系統性能。
2、關係型數據庫在面對海量數據的增刪改查時會顯示得無能爲力。很有可能會宕機(未響應、卡住了)。
3、海量數據環境下對數據表進行維護/擴展,也會變得無能無力。
如:update product set cname = ‘手機數碼’;
//如果數據量在幾百萬以上會直接卡到
如:要將商品表的cname字段,由varchar(64)修改爲char(100) 由於數據量大,每一條語句都要去運行關係算法,這樣直接會卡死。
特點:關係型數據庫適合處理一般量級數據,但是安全。

2. 非關係型數據庫

爲了處理海量數據,需要將關係型數據庫的關係去掉。
非關係型數據庫設計之初是爲了替代關係型數據庫。
常用的非關係型數據庫:Redis。
優點:
1、海量數據的增刪改查,非常輕鬆應對。因爲數據與數據之間是沒有關係的,所以就不存在大量算法。
2、海量數據的維護也是非常輕鬆,如在海量數據中擴充一個字段(非關係數據庫不用去運行關係算法)。

1. 缺點:
1、數據和數據之間沒有有關係,所以不能一目瞭然。如在關係型數據庫中存儲一個部門表,一看就能 知道部門表裏有哪些數據(部門名、部門下的員工)。非關係型數據庫數據與數據之間是沒有關係的,它們之 間是單獨存在的。把數據查詢出來時,就好比一盤散沙一樣,然後自己再將它們整理成爲一個有關係的表。
2、非關係型數據庫數據與數據之間是沒有關係了,也沒有強大的事務保證數據的完整性與安全性。

特點:適合處理海量數據,效率高。但是不一定安全。
如:查詢奧運健兒獎牌總數。 這些數據一般都是在官網上進行展示,它的查詢是極爲頻繁的,可能 幾秒鐘就會有上萬次查詢,像這種幾秒鐘查詢上萬次查詢,如果交給關係型數據庫,它不一定能扛得住。 而非關係型數據庫會非常輕鬆應對。

結論:將來看開發都是關係型數據庫+非關係型數據庫一起共同帶起一個項目。在這個 項目中, 重要 的數據保存到關係型數據庫中,而海量且不重要的數據就保存到非關係型數 據庫中。

3.Redis充當的角色

充當關係型數據庫的緩存而存在,緩解關係型數據庫的查詢壓力(也叫緩存數據庫)。
在這裏插入圖片描述

4.Redis部署

使用docker在Linux系統部署Redis

# 拉取Redis
docker pull Redis
 
# --name:名稱 -p:端口 ‐v:目錄映射關係 
 docker run ‐di ‐‐name=redis‐p 6379:6379 redis 

客戶端測試 在你的本地電腦命令提示符下,用window版本redis測試 
redis‐cli ‐h 192.168.247.135

5.Redis數據結構介紹

1.redis是使用鍵值對去保存數據的,類似於java中的map集合。(redis中是沒有表概念)
2.這個map集合是有key和value,key全部都是字符串,value有五種數據類型。
在這裏插入圖片描述

6.使用redisTemplate進行各類型的CURD操作

package spring_data_redis_test;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.List;
import java.util.Set;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "classpath:spring/applicationContext_redis.xml")
public class AllTest {
    //注入template對象
    @Autowired
    private RedisTemplate redisTemplate;
//----------------------Hash類型的操作:經常用---------------------------------
//(1)存入值
@Test
public void  boundHashOpsSet(){
    redisTemplate.boundHashOps("namehash").put("country1","中國");
    redisTemplate.boundHashOps("namehash").put("country2","日本");
    redisTemplate.boundHashOps("namehash").put("country3","韓國");
}
//(2)提取所有的KEY
@Test
public void  boundHashOpsKeys(){
    Set keys = redisTemplate.boundHashOps("namehash").keys();
    System.out.println(keys);
}
//(3)提取所有的值
@Test
public void boundHashOpsValues(){
    List values = redisTemplate.boundHashOps("namehash").values();
    System.out.println(values);
}
//(4) 根據KEY提取值
@Test
public void boundHashOpsByKey(){
    Object name = redisTemplate.boundHashOps("namehash").get("country1");
    System.out.println(name);
}
//根據KEY移除值
@Test
public void boundHashOpsDelByKey(){
    redisTemplate.boundHashOps("namehash").delete("country2");
}
//----------------------------值類型的操作:因爲操作數量少,所以不長用---------------------------------
    @Test
    public void setValue(){
        redisTemplate.boundValueOps("name").set("王五");
    }
    @Test
    public void getValue(){
        Object name = redisTemplate.boundValueOps("name").get();
        System.out.println(name);
    }
    @Test
    public void deleteValue(){
        redisTemplate.delete("name");
    }

//----------------------set類型的操作:因爲操作數量少,所以不長用---------------------------------
    /**
     * 存入值
     */
    @Test
    public void boundSetOpsAdd(){
    redisTemplate.boundSetOps("nameset").add("曹操"); //放入值
    redisTemplate.boundSetOps("nameset").add("劉備");
    redisTemplate.boundSetOps("nameset").add("孫權");
    }
    /**
     * 提取值
     */
    @Test
    public void boundSetOpsGet(){
        Set names= redisTemplate.boundSetOps("nameset").members();//取出值
        System.out.println(names);
    }
    /**
     * 刪除集合中的某一個值
     */
    @Test
     public void boundSetOpsDelete(){
         redisTemplate.boundSetOps("nameset").remove("曹操");
     }

    /**
     * 刪除整個集合
     */
    @Test
    public void boundSetOpsDeleteAll(){
        redisTemplate.delete("nameset");
    }

    //----------------------list類型的操作:因爲操作數量少,所以不長用---------------------------------
    /**
     * 右壓棧:後添加的對象排在後邊
     * 右壓棧用的多,因爲快,原理是
     */
    @Test
    public void boundListrightPush(){
        redisTemplate.boundListOps("namelist").rightPush("趙子龍");
        redisTemplate.boundListOps("namelist").rightPush("張飛");
        redisTemplate.boundListOps("namelist").rightPush("關羽");
    }
    /**
     * 顯示右壓棧集合
     */
    @Test
    public void boundListRange(){
        List namelist = redisTemplate.boundListOps("namelist").range(0, 10);
        System.out.println(namelist);
    }
    

    /**
     * 查詢:根據索引查詢集合某個元素
     */
    @Test
    public void boundListIndex(){
        Object name = redisTemplate.boundListOps("namelist").index(1);
        System.out.println(name);
    }

    /**
     * 刪除: 根據值移除集合某個元素
     */
    @Test
    public void  bondListRemove(){
        redisTemplate.boundListOps("namelist").remove(1,"關羽");
    }
    /**
     * 刪除: 刪除全部
     */
    @Test
    public void  bondListDelete(){
        redisTemplate.delete("namelist");
    }
}
發佈了4 篇原創文章 · 獲贊 6 · 訪問量 422
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章