時間:2017年05月21日星期日
說明:本文部份內容均來自慕課網。@慕課網:http://www.imooc.com
教學示例源碼:無
我的學習源碼:https://github.com/zccodere/s...git
課程介紹github
NoSQL的概述 Redis的概述 Redis的安裝和使用 Jedis的入門 Redis的數據類型 Keys的通用操做 Redis的特性 Redis的持久化
什麼是NoSQLredis
NoSQL = Not Only SQL 非關係型數據庫
爲何須要NoSQL算法
High performance 高併發讀寫 Huge Storage 海量數據的高效率存儲和訪問 High Scalability && High Availability 高可擴展性和高可用性
主流的NoSQL產品docker
NoSQL數據庫的四大分類數據庫
鍵值對(Key-Value)存儲:Redis 優:快速查詢 劣:存儲的數據缺乏結構化 列存儲:HBase 優:快速查詢、擴展性強 劣:功能相對侷限 文檔數據庫:MongoDB 優:數據結構要求不是很嚴格 劣:查詢性能不高、缺乏統一的查詢語法 圖形數據庫:InfoGrid 優:利用圖結構相關算法 劣:須要對整個圖作計算才能得出結果、不容易作分佈式集羣方案
四類NoSQL數據庫比較數組
NoSQL的特色緩存
易擴展 靈活的數據模型 大數據量、高性能 高可用
Redis高性能鍵值對數據庫,支持的鍵值數據類型:安全
字符串類型 列表類型 有序集合類型 散列類型 集合類型
Redis的應用場景bash
緩存 任務隊列 網站訪問統計 數據過時處理 應用排行榜 分佈式集羣架構中的session分離
Windows安裝Redis搭建環境
虛擬機:VMware 10.0.2 Linux系統:CentOS-6.5 SSH客戶端:SecureCRT 7.3 , SecureFX 7.3
推薦使用在Linux系統下docker安裝Redis,需先安裝docker
下載鏡像 docker pull hub.c.163.com/library/redis:latest 運行鏡像 docker run --name myredis -d -p 6379:6379 hub.c.163.com/library/redis 進入容器 docker exec -it CONTAINERID /bin/bash 鏈接Redis redis-cli 172.17.0.1:6379 或 redis-cli 發送命令 發送ping,回覆PONG即表明Redis安裝成功
Jedis介紹
Jedis是Redis官方首選的Java客戶端開發包 https://github.com/xetorthio/jedis
測試項目環境搭建
使用gradle做爲構建工具。詳情見源碼。
代碼演示:
package com.myimooc.jedis; import org.junit.Test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; /** * Jedis的測試 * Created by ChangComputer on 2017/5/21. */ public class JedisDemo1 { /** * 單實例的測試 */ @Test public void demo1(){ // 1.設置IP地址和端口 Jedis jedis = new Jedis("192.168.77.128",6379); // 2.保存數據 jedis.set("name","myimooc"); // 3.獲取數據 String value = jedis.get("name"); System.out.println(value); // 4.釋放資源 jedis.close(); } /** * 使用鏈接池方式鏈接 */ @Test public void demo2(){ // 得到鏈接池的配置對象 JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); // 設置最大鏈接數 jedisPoolConfig.setMaxTotal(30); // 設置最大空閒鏈接數 jedisPoolConfig.setMaxIdle(10); // 得到鏈接池 JedisPool jedisPool = new JedisPool(jedisPoolConfig,"192.168.77.128",6379); // 經過鏈接池得到鏈接 Jedis jedis = jedisPool.getResource(); // 設置數據 jedis.set("name","張三"); // 獲取數據 String value = jedis.get("name"); System.out.println(value); // 釋放資源 jedis.close(); // 釋放鏈接池 jedisPool.close(); } }
五種數據類型:
字符串(String) 哈希(hash) 字符串列表(list) 字符串集合(set) 有序字符串集合(sorted set) 字符串集合(set)
Key定義的注意點:
不要過長:最好不要超過1024個字節 不要太短:過短不利於閱讀,如a 統一的命令規範
存儲String
二進制安全的,存入和獲取的數據相同 Value最多能夠容納的數據長度是512M
存儲String經常使用命令
賦值:set key value 取值:get key 獲取值:getset key value 刪除:del key 數值增減:incr key decr key 擴展命令:incrby key number decrby key number 追加命令:append key str
存儲Hash
String Key和String Value的map容器 每個Hash能夠存儲4294967295個鍵值對
存儲Hash經常使用命令:
賦值:hset name key value hmset name key value key value 取值:hget name key hmget name key key hgetall name 刪除:hdel name key del name 增長數字:hincrby name key number 自學命令:hexists name key hlen name hkeys name hvals name
存儲list
ArrayList使用數組方式 LinkedList使用雙向連接方式 雙向鏈表中增長數據 雙向鏈表中刪除數據
存儲list經常使用命令
兩端添加
lpush key value1 value2 value3 將value1和value2和value3放入爲key的鏈表,當key不存在時,會自動建立該鏈表。 當key對應的鏈表存在時,從左側插入數據。 rpush key value1 value2 value 3 從右側插入數據。
查看列表
lrange key start end 查看爲key的鏈表,從指定start開始,到end結束
兩端彈出
lpop key 左邊彈出,返回並彈出指定的key所關聯鏈表的頭部(第一個)元素 rpop key 右邊彈出,返回並彈出指定的key所關聯鏈表的尾部(最後一個)元素
獲取列表元素個數
llen key 返回指定key所關聯鏈表的長度,當key不存在時,返回0
擴展命令
lpushx key value 僅當指定的key關聯鏈表存在時,在頭部插入value rpushx key value 僅當指定的key關聯鏈表存在時,在尾部插入value lrem key count value 在指定的key關聯的鏈表中,刪除count個value 當count小於0時,從尾到頭刪除 當count等於0時,刪除全部 當count大於0時,從頭至尾刪除 lset key index value 在指定的key關聯的鏈表中,修改下標爲index的值爲value linsert key before value newvalue 在指定的key關聯的鏈表中,在value以前插入newvalue linsert key after value newvalue 在指定的key關聯的鏈表中,在value以後插入newvalue rpoplpush key1 key2 將key1裏面的第一個值彈出壓入key2頭部
rpoplpush使用場景
存儲Set
和List類型不一樣是,Set集合中不容許出現重複的元素 Set可包含的最大元素數量是4294967295
添加元素
sadd key value1 value2 value3 將value1和value2和value3添加到key的set集合
刪除元素
srem key value1 value2 刪除爲key的set集合裏面的value1和value2
得到集合中的元素
smembers key 獲取爲key的set集合中的元素 sismember key value1 判斷value1是否存在於key的set集合中。一、存在;0、不存在
集合中的差集運算
sdiff key1 key2 獲取在key1中存在,在key2中不存在的元素。跟key的順序相關
集合中的交集運算
sinter key1 key2 獲取在key1和key2中都存在的元素
集合中的並集運算
sunion key1 key2 獲取key1中和key2中的全部元素,元素重複時,會去掉一個重複的元素
擴展命令
scard key 得到爲key的set集合中成員的數量 srandmember key 隨機返回爲key的set集合中的某個成員 sdiffstore newKey key1 key2 將兩個集合key1和key2差集的元素存儲到另外一個集合newKey中 sinterstore newKey key1 key2 將兩個集合key1和key2交集的元素存儲到另外一個集合newKey中 sunionstore newKey key1 key2 將兩個集合key1和key2並集的元素存儲到另外一個集合newKey中
使用場景
跟蹤一些具備惟一性的數據。好比訪問某個博客的惟一IP地址的信息,僅須要在每次訪問該博客的時候,將訪問者的IP存入redis當中。充分利用set類型的服務器端聚合操做的方便、高效的特性,能夠用於維護數據對象之間的關聯關係。好比:全部購買某一電子設備的客戶的ID,被存儲到一個指定的set當中,而購買另一種電子產品客戶的ID,被存儲到另一個set當中,若是此時想得到有哪些客戶同時購買了這兩種商品,那麼這時候,可使用它們的交集操做便可。
Sorted-Set概述
Sorted-Sets和Sets類型極爲類似,它們都是字符串的集合,都不容許重複的成員出如今一個Set中。它們之間的主要差異是Sorted-Sets中的每個成員都會有一個分數(score)與之關聯,Redis正是經過分數來爲集合中的成員進行從小到大的排序。然而須要額外指出的是,儘管Sorted-Sets中的成員必須是惟一的,可是分數(score)倒是能夠重複的。在Sorted-Set中添加、刪除或更新一個成員都是很是快速的操做,其時間複雜度爲集合中成員數量的對數。因爲Sorted-Sets中的成員在集合中的位置是有序的,所以,即使是訪問位於集合中部的成員也仍然是很是高效的。事實上,Redis所具備的這一特徵在不少其它類型的數據庫中是很難實現的,換句話說,在該點上要想達到和Redis一樣的高效,在其它數據庫中進行建模是很是困難的。
Sorted-Set經常使用命令
添加元素
zadd key score1 value1 score2 value2 score3 value3 添加三個元素到名爲key的Sorted-Set集合中。每個元素都有一個分數score和值value
得到元素
zscore key value 得到名爲key的Sorted-Set集合中value對應的分數score zcard key 得到名爲key的Sorted-Set集合中成員的數量
刪除元素
zrem key value1 value2 刪除名爲key的Sorted-Set集合中的值value1和value2元素
範圍查詢
zrange key start end 查找在start和end之間的元素,默認由分數從小到大排序 zrange key start end withscores 查找在start和end之間的元素,並顯示元素的分數 zrevrange key start end withscores 查找在start和end之間的元素,並顯示元素的分數,分數從大到小排序 zremrangebyrank key start end 按照指定範圍刪除元素 zremrangebyscore key startscore endscore 按照指定分數的範圍刪除元素
擴展命令
zrangebyscore key startscore endscore withscore limit startindex count 返回分數在指定範圍之間的元素,分數從小到大排序,從下標爲startindex開始,顯示count個 zincrby key addscore value 給指定value元素的分數score增長addscore分 zcount key startscore endscore 獲取分數在某個範圍之間元素的個數
使用場景
在遊戲的排名上。大型遊戲的積分排行榜,每當玩家的分數發生變化時, 能夠執行zadd命令去更新玩家的分數 微博上的熱點話題 構建索引數據
Keys通用操做
keys * 得到全部的key keys my? 得到全部以my開頭的key del key1 key2 key3 刪除key1和key2和key3 exists key 查看key是否存在,一、存在;0、不存在 rename oldkey newkey 重命名key,將oldkey重命名爲newkey expire key 1000 設置過時時間。單位:秒 ttl key 查看key所剩超時的時間,若是key沒有設置過時時間,則返回-1 type key 得到指定key的數據類型
相關特性
多數據庫 Redis事務
多數據庫
一個Redis實例能夠包含多個數據庫,客戶端能夠指定鏈接哪一個數據庫。一個Redis實例最多能夠提供16個數據庫,下標從0到15,客戶端默認鏈接0號數據庫。經過select選擇鏈接到哪一個數據庫。
多數據庫相關命令
select 1 鏈接到1號數據庫 move key 1 將key移動到1號數據庫
Redis事務相關命令
multi 開啓事務,後面執行的命令會被存到命令隊列當中,直到執行提交事務命令 exec 提交事務,命令隊列裏面的命令會被原子化執行 discard 回滾事務
持久化使用的方式
RDB持久化:默認支持,不須要進行配置。在指定的時間間隔內,將內存中的數據及快照寫入到磁盤 AOC持久化:將以日誌形式,記錄服務器所處理的每個操做,在redis服務器啓動之初, 會讀取該文件,從新構建數據庫,保證啓動後數據的完整性 無持久化:經過配置來禁用redis服務器持久化的功能,這時候,redis就是一個緩存機制 同時使用RDB和AOF
RDB方式持久化優點
只包含一個文件,方便文件備份 對於災難恢復而言,RDB是一個很是不錯的選擇 性能最大化,由子進程完成持久化操做 相比AOF,大數據集啓動效率更高
RDB方式持久化缺點
若是想保證數據的高可用性,即最大限度的避免數據的丟失,RDB將不是一個很好的選擇。當系統在定時持久化以前出現宕機,還將來得及往硬盤寫入數據,那數據就丟失了。當數據集過大時,可能會致使服務器中止幾百毫秒甚至是1秒鐘。
RDB方式持久化配置
redis.conf save 900 1:每900秒,至少有1個key發生變化,會持久化一次 save 300 10:每300秒,至少有10個key發生變化,會持久化一次 save 60 10000:每60秒,至少有10000個key發生變化,會持久化一次 dbfilename:配置持久化文件名稱 dir:配置持久化文件保存路徑,默認./配置文件當前路徑
AOF方式持久化優點
帶來更高的數據安全性,每秒同步或每修改同步或不一樣步 對於日誌文件寫入操做採用追加模式,當寫入過程當中出現宕機時,不會破壞已經存在的內容 若是日誌過大,redis會自動啓動重寫機制 AOF包含格式清晰、易於理解的日誌文件記錄全部的修改操做,經過該文件可完成數據重建
AOF方式持久化劣勢
對於相同數據集而言,AOF的文件要比RDB的文件大一些 根據同步策略的不一樣,運行效率要低於RDB
AOF方式持久化配置
redis.conf appendonly:配置AOF持久化是否啓用,默認no:不啓用 appendfilename:配置AOC持久化文件名稱 appendfsync always:每修改一次同步一次,默認不啓用,爲了更安全,推薦使用 appendfsync everysec:每秒同步一次,默認啓用 appendfsync no:不一樣步,默認不啓用
課程總結
介紹了什麼是NoSQL 介紹了什麼是Redis Redis的安裝以及簡單使用 Jedis的入門,重點掌握,須要經過程序去操做Redis 介紹了Redis經常使用的數據類型,主要:字符串和哈希 瞭解keys的通用操做 瞭解Redis的多數據庫和事務 瞭解Redis的持久化
最主要的仍是:要會使用程序操做Redis