sql:操做(關係型)數據庫的標準查詢語言php
關係型數據庫(rdbms):以關係(由行和列組成的二維表)模型爲核心數據庫,有表的儲存系統。(mysql、oracle、sqlserver...)java
nosql:針對非關係型數據庫的語言,彌補關係型數據庫的一些缺點,主要用到大的數據量或者高併發的場景下。mysql
非關係型數據庫分類:c++
(1) Redis 是一個高性能的 開源的、C語言寫的Nosql(非關係型數據庫),數據保存能夠存儲在內存中或者磁盤中。redis
(2) Redis 是以key-value形式存儲,和傳統的關係型數據庫不同。不必定遵循傳統數據庫的一些基本要求,spring
好比說,不遵循sql標準,事務,表結構等等,redis嚴格上不是一種數據庫,應該是一種數據結構化存儲方sql
法的集合。(數據結構:數組,list,set,map等)數據庫
redis提供了一下操做方法,咱們使用這些方法就能夠對存入字符串,組織成各類類型數據庫結構數組
(string,list,set,map等)緩存
小結:
(1) redis開源 高性能nosql數據庫,數據能夠存儲在內存或磁盤上面
(2) Redis 主要key-value結構形式存儲,redis底層支持各類類型的數據存儲結構
包括 list set map string等。
1. 數據保存在內存,存取速度快,併發能力強。
2. 它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、 zset(sorted set --有序集合)
和hash(哈希類型)。
3. redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部分場合能夠對關係數據庫(如MySQL)起到很好的補充做用。
4. 它提供了Java,C/C++,C#,PHP,JavaScript等客戶端,使用很方便。
5. Redis支持集羣(主從同步)。數據能夠主服務器向任意數量從的從服務器上同步,從服務器能夠是關聯其餘從服務器的主服務器。
6. 支持持久化,能夠將數據保存在硬盤的文件中。
7. 支持訂閱/發佈(subscribe/publish)功能 QQ羣
總結:
1. 數據存儲:存放在內存,還支持持久化.-存取速度快,併發能力強,數據安全性高
2. 支持value類
3. 支持多個語言客戶端
4. 還支持集羣(支持高併發,海量數據)
(1) 最多,就是緩存(cache 使用空間換取時間) --redis
(2) 計數器應用 -- 微博 熱點新聞 -- 轉載 點贊(高併發)
(3) 實時防攻擊系統 -- 銀行網站 (登陸) --計數 (ip 同一個ip + 5)
redis--支持斷電恢復 內存和磁盤
(4) 有效期的應用 -- 道具 紅包 優惠券 ...
(5) 支持無序的場景 -- set特效
(6) 隊列 -->quene -->秒殺 搶購 --redis
(7) 消息系統訂閱發佈 -->redis(MQ消息隊列--高併發 秒殺 搶購 轉發 )
|
mysql |
redis |
memcached |
類型 |
關係型 |
非關係型 |
非關係型 |
存儲位置 |
磁盤 |
磁盤和內存 |
內存 |
存儲過時 |
不支持 |
支持 |
支持 |
讀寫性能 |
低 |
很是高 |
很是高 |
對value爲string類型的經常使用操做:
set key value //將字符串值value關聯到key
get key //返回key關聯的字符串值
mset //同時設置一個或多個key-value對
mget //返回全部(一個或多個)給定key的值
incr key //將 key 中儲存的數字值增1(key不存在,則初始化爲0,再加1)
decr key //將 key 中儲存的數字值減1(key不存在,則初始化爲0,再減1)
incrBy key //自增多少
decrBy key //自減多少
keys * //獲取全部key列表
del key //刪除key
expire key xx //設置key的過時時間(xx秒後過時)
ttl key //查看key的過時時間
flushall //清空整個redis服務器數據,全部的數據庫所有清空
flushdb //清除當前庫,redis中默認有16個數據庫,名稱分別爲0,1,2.。。15
select index --select 0
list集合能夠當作是一個左右排列的隊列(列表)
lpush key value //將一個或多個值 value 插入到列表 key 的表頭(最左邊)
rpush key value //將一個或多個值 value 插入到列表 key 的表尾(最右邊)
lpop key //移除並返回列表 key 的頭(最左邊)元素。
rpop key //移除並返回列表 key 的尾(最右邊)元素。
lrange key start stop//返回列表 key 中指定區間內的元素,查詢全部的stop爲-1便可
lrem key count value//根據count值移除列表key中與參數 value 相等的元素count > 0 : 從表頭開始向表尾搜索,移除與 value 相等的元素,數量爲 count 。count < 0 : 從表尾開始向表頭搜索,移除與 value 相等的元素,數量爲 count 的絕對值。count = 0 : 移除表中全部與 value 相等的值。
lindex key index //返回列表 key 中,下標爲 index 的元素
ltrim key start stop //對一個列表進行修剪
存放都是字符串,由redis組織成各類數據結構,Redis怎麼實現棧(FILO)和隊列(FIFO)?
list控制同一邊進,同一邊出就是棧
list控制一邊進,另外一邊出就是隊列
set集合是一個無序的不含重複值的隊列
sadd key member //將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略
srem key member//移除集合 key 中的一個或多個 member 元素,不存在的 member 元素會被忽略
smembers key //返回集合 key 中的全部成員。
hash類型相似於php的數組
hset key name value//添加一個name=>value鍵值對到key這個hash類型
hget key name //獲取hash類型的name鍵對應的值
hmset key name1 key1 name2 key2 //批量添加name=>value鍵值對到key這個hash類型
hmget key name1 name2//批量獲取hash類型的鍵對應的值
hkeys //返回哈希表 key 中的全部鍵
hvals //返回哈希表 key 中的全部值
hgetall //返回哈希表 key 中,全部的鍵和值
multi //標記一個事務塊的開始。
exec //執行全部事務塊內的命令。
弱事務 : 日誌
強事務 :同時成功 同時失敗-- 金融數據
discard //取消事務,放棄執行事務塊內的全部命令。
Redis的事務在執行exec指令時,才批量執行操做,沒有回滾操做
(1)經過命令動態調整密碼
CONFIG SET 命令能夠動態地調整 Redis 服務器的配置而無須重啓,重啓後失效
CONFIG SET requirepass 123456 //將密碼設置爲123456
CONFIG SET requirepass "" //清除密碼
AUTH 123456 //輸入密碼進行認證
(2)經過配置文件設置密碼
在配置文件redis.widows.conf中增長一行代碼
requirepass 123456
將密碼123456設置到配置文件中,redis啓動時加載該文件,便可啓用密碼
原來mysql須要使用jdbc,如今須要redis的一個java客戶端jedis。
jedis是客戶端,而reids是服務器。使用jedis這個java客戶端操做redis數據庫。
使用jedis客戶端,完成jedis簡單操做
@Test public void test()throws Exception{ //建立鏈接 String host ="127.0.0.1"; int port = 6379; int timeout = 1000;//超時時間,1秒超時 Jedis jedis = new Jedis(host,port,timeout); jedis.auth("admin"); //執行操做 jedis.set("yhptest","yhptest dbl!"); System.out.println(jedis.get("yhptest")); //關閉鏈接 jedis.close(); }
經過jedis鏈接池,簡單操做redis數據庫
// 思想:若是建立一個對象後須要爲他設置不少值,還不如先建立它配置對象並作完配置,而後再經過配置對象建立它 //1 建立jedispool配置對象 //2 作配置-四個 //3 建立jedispool //4 經過jedispool獲取鏈接 //5 執行操做 // 6 釋放鏈接 // 7 摧毀鏈接池-若是是真正項目中它應該是一個受spring管理的單例 @Test public void test()throws Exception{ //1 建立jedispool配置對象 JedisPoolConfig config = new JedisPoolConfig(); //2 作配置-四個 config.setMaxIdle(2); config.setMaxTotal(10); config.setMaxWaitMillis(1*1000); //建立鏈接超時 config.setTestOnBorrow(true);//獲取鏈接是測試鏈接是否暢通 //3 建立jedispool //1*1000 獲取鏈接超時時間 JedisPool pool = new JedisPool(config, "127.0.0.1",6379,1*1000,"admin"); //4 經過jedispool獲取鏈接 Jedis jedis = pool.getResource(); //5 執行操做 jedis.set("jedispooltest","dbldblddzt....."); System.out.println(jedis.get("jedispooltest")); // 6 釋放鏈接 jedis.close(); //底層作了兼容,若是是鏈接池操做就是釋放,若是是鏈接操做就是關閉 // 7 摧毀鏈接池-若是是真正項目中它應該是一個受spring管理的單例 pool.destroy(); }
@Test public void testRedis() throws Exception { Jedis jedis = new Jedis("127.0.0.1", 6379, 1000 * 10); jedis.auth("123456"); jedis.set("name", "龍傲天"); System.out.println(jedis.get("name")); jedis.close(); } @Test public void testRedisPool() throws Exception { //鏈接池 JedisPoolConfig config = new JedisPoolConfig(); config.setMaxIdle(2); config.setMaxTotal(10); JedisPool jedisPool = new JedisPool(config, "127.0.0.1", 6379, 1000 * 10, "123456"); Jedis jedis = jedisPool.getResource(); jedis.flushDB(); //字符串操做 jedis.set("name", "趙日天"); jedis.set("age", "18"); System.out.println(jedis.get("name")); System.out.println(jedis.get("age")); System.out.println(jedis.keys("*")); System.out.println("========================================"); //list集合操做 jedis.lpush("students","五五開","蕪湖神","王慕霸","古手羽","蕪湖神"); System.out.println(jedis.lrange("students", 0, -1)); jedis.lrem("students", 1, "蕪湖神"); System.out.println(jedis.lrange("students", 0, -1)); System.out.println("========================================"); //set集合操做 jedis.sadd("users","古天樂","劉德華","梁朝偉","黎明","張學友","劉德華"); System.out.println(jedis.smembers("users")); jedis.srem("users","張學友"); System.out.println(jedis.smembers("users")); System.out.println("========================================"); //hash操做 jedis.hset("players", "name","James"); System.out.println(jedis.hget("players", "name")); System.out.println("========================================"); //排序 jedis.lpush("nums","3","6","2","9","1"); System.out.println(jedis.lrange("nums", 0, -1)); System.out.println(jedis.sort("nums",new SortingParams().desc())); jedis.lpush("language","php","c++","java","h5","test","ui"); System.out.println(jedis.lrange("language", 0, -1)); SortingParams sortingParams = new SortingParams().desc().alpha(); System.out.println(jedis.sort("language", sortingParams)); jedis.flushDB(); jedis.close(); jedisPool.destroy(); }
事務操做
@Test public void testTransaction() throws Exception { JedisPoolConfig config = new JedisPoolConfig(); config.setMaxIdle(2); config.setMaxTotal(10); JedisPool jedisPool = new JedisPool(config, "127.0.0.1", 6379, 1000 * 10, "123456"); Jedis jedis = jedisPool.getResource(); jedis.flushDB(); jedis.set("name", "XXX"); jedis.set("age", "18"); Transaction transaction = jedis.multi(); transaction.incr("name"); transaction.incr("age"); List<Object> exec = transaction.exec(); System.out.println(exec); jedis.close(); jedisPool.destroy(); }
持久化(持久層,dao層,mapper層):把數據保存到磁盤的過程就叫持久化
Redis支持內存和磁盤存儲,磁盤存儲提供兩種方案:
rdb方式:save 1 1 最快的保存方法,1s中發生一次變化,若是保存數據在1s內完成,容易形成數據丟失,丟失1s數據。
aof方式:開啓 appendonly yes ,在操做的時候,把數據寫到日誌文件,在啓動的時候 ,恢復日誌文件(日誌方式)。
何時才淘汰數據: --》內存到必定極限的時候,這個時候,須要淘汰數據
淘汰一些數據,達到redis數據都是有效的。選擇合適的淘汰策略進行淘汰。
volatile-lru:從已設置過時時間的數據集(server.db[i].expires)中挑選最近最少使用的數據淘汰
volatile-ttl:從已設置過時時間的數據集(server.db[i].expires)中挑選將要過時的數據淘汰
volatile-random:從已設置過時時間的數據集(server.db[i].expires)中任意選擇數據淘汰
allkeys-lru:從數據集(server.db[i].dict)中挑選最近最少使用的數據淘汰
allkeys-random:從數據集(server.db[i].dict)中任意選擇數據淘汰
no-enviction(驅逐):禁止驅逐數據
redis 肯定驅逐某個鍵值對後,會刪除這個數據並,並將這個數據變動消息發佈到本地(AOF 持久化)和從機(主從鏈接)。
lru: 最近最少使用 -- 經常使用 (統計次數)
ttl: 將要過時中淘汰 --也能夠 (統計時間)
random:隨機數據 --這個數據就沒有那麼重要 (隨機)