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");
}
}