Redis:前端
關係型數據庫(SQL):MySQL、Oraclemysql
特色:數據與數據之間,表與字段之間,表與表之間是存在關係的c++
優勢:
一、數據之間有關係,進行數據的增刪改查時很是方便。
二、關係型數據庫,有事物操做。保證數據的完整性。redis
缺點:
一、由於數據和數據之間有關係,是由底層大量算法保證的。大量算法會拉低系統運行速度。大量算法會消耗系統資源
二、海量數據的增刪改查時,會顯的無能爲力。在作某些操做時,極可能會宕機(卡死)
三、在海量數據環境下對數據表進行維護/擴展,也會變得無能爲力。適合處理通常量級的數據。保證的是安全。算法
非關係性數據庫(NOSQL):Redis、mongoDBsql
爲了處理海量數據,須要將關係型數據庫的關係 去掉。非關係型數據庫設計之初,是爲了替代關係型數據庫的。數據庫
優勢:
一、海量數據的增刪改查,很是輕鬆。
二、海量數據的維護/擴展,也會很是輕鬆。後端
缺點:
一、由於數據與數據之間沒有關係,因此不能一目瞭然。
二、非關係型數據庫,沒有關係,沒有強大的事物來保證數據的完整和安全。緩存
適合處理海量數據,保證的是效率。不必定安全。安全
NoSql數據庫的四大分類:
一、鍵值(Key-Value)存儲數據庫。
相關產品:Tokyo Cabinet/Tyrant、Redis、Voldemort、Berkeley DB
典型應用:內容緩存,主要用於處理大量數據的高訪問負載
數據模型:一系列的鍵值對。
優點:優秀的快速查詢,穩定性強。
劣勢:存儲的數據缺乏結構化。
二、列存儲數據庫
相關產品:Cassandra、HBase、Riak
典型應用:分佈式的文件系統。
數據模型:以列簇式存儲,將同一列數據存儲在一塊兒。
優點:查找速度快,可擴展性強,更容易進行分佈式擴展
劣勢:功能相對侷限,使用極大的內存纔可調配,且系統處理算法時將有數秒,甚至更長時間的不可用,致使大量處理超時。
三、文檔型數據庫(淘汰)
相關產品:CouchDB、MongoDB
典型應用:Web應用(與Key-Value相似,Value時結構化的)
數據模型:一系列鍵值對
優點:數據結構要求不嚴格
劣勢:查詢性能不高,並且缺少統一的查詢語法。
四、圖形(Graph)數據庫:
相關產品:Neo4J、InfoGrid、Infinite Graph
典型應用:社交網絡(關係網)
數據模型:圖結構
優點:利用圖結構相關算法。
劣勢:須要對整個圖作計算才能得出結果,不容易作分佈式的集羣方案。侷限性過強。
Redis使用環境:
一、能夠做爲關係型數據庫的緩存存在。
二、能夠作任務隊列。
三、能夠作大量數據運算。
四、能夠作大量數據的排行榜。
Linux系統 Redis 安裝:
redis是C語言開發,安裝redis須要先將官網下載的源碼進行編譯,編譯依賴gcc環境。若是沒有gcc環境,須要安裝gcc:yum install gcc-c++
一、上傳redis.tar.gz的安裝包。並解壓到當前目錄:tar -zxvf redis-3xxxxx.tar.gz
二、編譯redis(編譯,將.c文件編譯爲.o文件)
進入解壓文件夾:cd redis-3xxxxx
執行 make
若是沒有安裝gcc,編譯將出現錯誤提示。(安裝失敗,必須刪除文件夾,從新解壓)
三、安裝:make PREFIX=/usr/local/redis install
PREFIX指定的目錄能夠隨意指定。
安裝完後,在/usr/local/redis/bin下有幾個可執行文件:
redis-benchmark >> 性能測試工具
redis-check-aof >> AOF文件修復工具
redis-check-dump >> RDB文件檢查工具(快照持久化文件)
redis-cli >> 命令行客戶端
redis-server >> redis服務器啓動命令
四、回到根目錄:cd ~ 進入redis-3xx 文件中,
Copy複製redis.conf文件到/usr/local/redis目錄下(和bin同級目錄中)
注:若沒有配置文件redis也能夠啓動,不過將啓動默認配置,不方便修改端口號等信息。
Redis啓動:對應默認端口號6379
前端啓動:進入/usr/local/redis文件夾下:./bin/redis-server 啓動
啓動客戶端:./bin/redis-cli 或 ./bin/redis-cli -h IP地址 -p 6379
缺點:沒法部署集羣。
後端啓動:修改redis.conf配置文件,將daemonize改成yes之後端模式啓動
啓動時,指定配置文件:進入/usr/local/redis:cd /usr/local/redis
啓動:./bin/redis-server ./redis.conf
Redis關閉:
一、查詢PID,kill -9 pid 殺死進程。
至關於斷電,非正常關閉,極可能會形成數據丟失。
二、正常關閉:正常關閉,數據保存
./bin/redis-cli shutdown
Redis數據類型:
redis使用的時鍵值對 保存數據。至關於Map 。
key:都是字符串。key名都是自定義的。
value:對應五種數據類型
一、String字符串
二、hash:數據格式相似於JSON
例:{uname:"zs",age:"18"}
三、list集合: 至關於Java中的LinkedList鏈表。添加/刪除效率極高。
例:[1,2,3,4]
四、set:至關於Java中的HashSet
例:['a','b','c']
五、有序的set集合:
例:[1000 'a',100 'b' 10 'c']
String:
字符串類型時Redis中最爲基礎、經常使用的數據存儲類型。字符串在Redis中二進制安全的。這意味者該類型存入和獲取的數據相同。在Redis中字符串類型的Value最多能夠容納的數據長度爲512M。
二進制安全和數據安全是沒有關係的。
MySQL關係型數據庫,二進制不安全。由於存儲的編碼和取出的編碼格式不一致,會形成亂碼而丟失數據。
一、頻繁的編解碼會浪費大量的系統性能。
二、頻繁的編解碼極可能由於碼錶不一樣致使亂碼。
因此二進制不安全。
Redis非關係型數據庫,二進制安全。
一、編解碼都是在客戶端完成的。沒有頻繁編解碼,執行效率高。
二、沒有頻繁編解碼,不會出現亂碼。
因此二進制數據安全。
賦值(增、改):
set key value :設定key只有指定的字符串value
若是該key存在則進行覆蓋(修改)操做。老是返回"OK"
取值(查):
get key:獲取key的value。若該key的關聯的value不是String類型,redis將返回錯誤信息,由於get命令只能用於獲取String類型的value;若該key不存在,返回(nil)。
刪:
del key :刪除指定key。返回值是數字類型。表示刪除幾條數據。
擴展:
getset key value:先獲取該key的值,再設置該key的值。
incr key:將指定的key的value原子性的遞增1。
若該key不存在,其初始值爲0,再incr以後其值爲1。
若value的值不能轉成整型,該操做將執行失敗並返回相應的錯誤信息。
decr key:將指定的key的value原子性的遞減1。
若該key不存在,其初始值爲0,再decr以後其值爲-1。
若value的值不能轉成整型,該操做將執行失敗並返回相應的錯誤信息。
append key value:拼湊字符串。
若該key存在,則在原來的value後追加該值。
若該key不存在,則從新建立一個key,並賦值value。
incrby key increment:將指定的key的value原子性增長increment。
若該key不存在,其初始值爲0,在incrby後,其值爲increment。
若該值不能轉成整型,則失敗並返回錯誤信息。
decrby key decrement:將指定的key的value原子性減小decrement。
若該key不存在,其初始值爲0,在decrby後,其值爲decrement。
若該值不能轉成整型,則失敗並返回錯誤信息。
String的使用環境:主要用於保存JSON格式的字符串。
hash:
Redis中的Hash類型能夠堪稱具備String key和String value的map容器。每個Hash能夠存儲4294967295個鍵值對。
賦值:
hset key field value :爲指定的key設定field/value對(鍵值對)。至關於 增。
hmset key field value field1 value1...:爲指定的key設定多個field/value對(鍵值對)。
取值:
hget key field:獲取指定的key的field值。
hmget key field field1...:獲取指定key的多個field值。
hgetall key:獲取key中的全部field-value。
刪除:
hdel key field field1...:刪除一個或多個field字段。
del key:刪除正個hash。
擴展:
hincrby key field increment :設置key中field的值增長increment。
hexists key field :判斷指定的key中filed是否存在。
hlen key :獲取key所包含的field的數量。
hkeys key :獲取全部的字段。
hvals key :獲取全部的value。
list:
鏈表LinkList。Redis操做中,最多的操做是進行元素的增刪。
使用環境:
一、作大數據集合的增刪
二、作任務隊列
賦值:
lpush key values[value1 value2...]:在指定的key所關聯的list頭部插入全部的values。
若該key不存在,該命令在插入的以前建立一個與該key關聯的空鏈表,以後再向該鏈表的頭部插入數據。插入成功,返回元素的個數。
例:lpush list1 a b c d
rpush key values[value1 value2...]:在該list的尾部添加元素。
例:rpush list2 a b c d
取值:
lrange key start end:獲取鏈表中從start到end的元素的值。start、end從0開始計數;也可爲負數。
若爲-1 則表示鏈表尾部的元素;-2 則表示倒數第二個元素;以此類推...
例:取所有元素:lrange key 0 -1
刪除:
lpop key:返回並彈出指定的key關聯的鏈表中的第一個元素,即頭部元素。
若該key不存在,返回nil;
若該key存在,則返回鏈表的頭部元素。
rpop key:從尾部彈出元素。
擴展:
llen key:返回指定的key關聯的鏈表中的元素的數量。
lrem key count value:刪除某種元素。效率極爲低下。刪除count個值爲value的元素。
若count大於0,從頭向尾遍歷並刪除count個值爲value的元素。
若count小於0,則從尾向頭遍歷並刪除正數count個值爲value的元素。
若count等於0,則刪除鏈表中全部等於value的元素。
例:lrem list1 0 a 表示從左刪除list1中全部的a
lrem list1 2 a 表示從頭刪除list1中的2個a
lrem list1 -2 a 表示從尾刪除list1中的2個a
lset key index value:經過索引替換元素。效率不高。設置鏈表中的index的角標的元素值。0表明鏈表的頭元素,-1表明鏈表的尾元素。操做鏈表的角標不存在則拋異常。
linsert key before/after prvot value:從索引前/後插入元素。效率不高。在pivot元素前或後插入value這個元素。
rpoplpush resource destination:將鏈表中的尾部元素彈出並添加到頭部。[循環操做]
例:rpoplpush list1 list2 倆隊排列
rpoplpush list1 list1 循環隊列
set:
set集合中不容許出現重複的元素。
做用:在Redis操做中,涉及到倆個大數據集合的並集、交集、差集的運算。
賦值:
sadd key values[value一、value2...]:向set中添加數據,若該key的值已存在則不會重複添加
例:sadd set1 a b c d
取值:
smembers key :獲取set中全部元素。
例:smembers set1
sismember key member:判斷參數中指定的成員是否在該set中。1 表示存在,0 表示不存在或該key自己就不存在。不管集合中有多少元素均可以極快的返回結果。
例:sismember set1 a 判斷集合set1中是否有a元素
刪除:
srem key values[value一、value2...]:刪除set中指定的元素
例:srem set1 a c
差集運算:
sdiff key1 key2...:返回key1與key2中相差的元素,並且與key的順序有關。即返回差集。
交集運算:
sinter key1 key2 key3...:返回交集
並集運算:
sunion key1 key2 key3...:返回並集
擴展:
scard key:獲取set中元素的數量。
srandmember key :隨機返回set中的一個元素。
sdiffstore destination key1 key2...:將key一、key2相差的元素存儲在destination上
例:sdiffstore set1 set2 set3 將set2與set3的差集元素存儲到set1中。
sinterstore destination key[key...]:將返回的交集存儲在destination上
例:siterstore set1 set2 set3 將set2與set3的交集元素存儲到set1中。
sunionstore destination key[key...]:將返回的並集存儲在destination中
例:sunionstore set1 set2 set3 將set2與set3的並集元素存儲到set1中。
有序set集合:
有序且不重複。有序set集合專門用來作排行榜。
賦值:
zadd key score member score2 member2...:將全部元素以及該元素的分數存放到sorted-set中。若該元素已經存在,則會用新的分數替換原有的分數。返回值是新加入到集合中的元素個數,不包含以前已經存在的元素。
例:zadd set1 1000 zhangsan 100 lisi 10 王五
查看:
zscore key member:返回指定元素的分數。
例:zscore set1 zhangsan
zcard key : 獲取集合中的元素數量
例:zcard set1
zrange key start end[withscores]:範圍查詢。獲取集合中腳標爲start-end的元素,[withscores]參數代表返回的元素包含分數。
例:zrange set1 0 -1 查詢全部元素。正序排列。由小到大
zrange set1 0 -1 withscores 查詢全部元素。而且帶有各自的分數。正序。由小到大
zrevrange key start end[withscores]:範圍查詢。獲取集合中腳標爲start-end的元素,[withscores]參數代表返回的元素包含分數。
例:zrevrange set1 0 -1 查詢全部元素。倒序排列。由大到小
zrevrange set1 0 -1 withscores 查詢全部元素。而且帶有各自的分數。倒序。由大到小
刪除:
zrem key member[member...]:刪除集合中指定元素。能夠指定多個。
例:zrem set1 zhangsan lisi
zremrangebyrank key start stop:按照排名範圍刪除元素。
例:zremrangebyrank set1 0 1 刪除前倆名
zremrangebyscore key min max:按照分數範圍刪除元素。
例:zremrangebyscore set1 50 500 刪除分數在50到500之間的元素
擴展:
zrangebyscore key min max[withscores][limit offset count]:返回分數在min-max的元素並按照分數從低到高排序。[withscores]:顯示分數;[limit offset count]:offset,代表從腳標爲offset的元素開始,並返回count個元素。
例:zrangebyscore set1 50 500 返回分數在50-500之間的元素。
zrangebyscore set1 50 500 withscores 返回分數在50-500之間的元素。加上分數。
zrangebyscore set1 50 500 withscores limit 0 1 返回分數在50-500之間的元素。加上分數。而且只查前1個元素。
zincrby key increment member:設置指定成員的增長分數。返回更改後的分數
例:zincrby set1 10 zhangsan 給zhangsan增長10分。
zcount key min max: 獲取分數在min-max之間的元素。
例:zcount set1 50 500 計算50-500分數之間的元素由多少
zrank key member:返回成員在集合中的排名。索引(從小到大)
例:zank set1 zhangsan 返回zhangsan的排名。
zrevrank key member:返回元素在集合中的排名。索引(從大到小)
例:zrevrank set1 zhangsan 返回zhangsan的排名。
通用命令:
keys pattern:獲取全部與pattern匹配的key,返回全部與該key匹配的keys。
通配符:
*:表示任意一個或多個字符。
?:表示任意一個字符。
例:keys * 查詢全部的key
keys ???? 查詢key長度是四位的key名。
keys *name* 查詢key名包含name的key名。
del key1 key2...:刪除指定的key。能夠指定多個。
exites key:判斷該key是否存在,1表明存在。0表明不存在。
rename key newkey:爲當前的key重命名。
type key:獲取指定key的類型。該命令將以字符串的格式返回。返回的字符串爲string、list、set、hash和zset。若是key不存在,則返回none。
設置key有效時間:
expire key:設置過時時間。單位:秒
ttl key:獲取該key所剩的超時時間,若沒有設置超時,返回-1。若返回-2,表示超時不存在。
消息訂閱與發佈:
subscribe channel:訂閱頻道。
例:subscribe mychat 訂閱mychat這個頻道。
psubscribe channel*:批量訂閱頻道。
例:psubscribe s* 訂閱以s開頭的頻道。
publish channel content:在指定的頻道中發佈消息。
例:publish mychat 'abcdefg'
多數據庫:
Redis的數據庫已經提早建立好了,默認有16個數據庫。數據庫的名字是0,1,2...15號數據庫。在redis上所作的全部數據操做,都是默認在0號數據上操做的。數據庫與數據庫之間,是不能共享鍵值對的。
切換數據庫:select 數據庫名(1,2,3...15)
把某個鍵值對進行數據庫的移植:move key 1:將key鍵移植到1號數據庫中。
清空當前數據庫:flushdb
清空全部的數據庫內容:flushall
事物:
mysql的事物是爲了保證數據完整性,安全。
Redis的事物是爲了進行redis語句的批量化執行。
multi:開啓事物,用於標記事物的開始,其後執行的命令都將被存入命令隊列,知道執行EXEC時,這些命令纔會被原子的執行。
相似與關係型數據庫中的:begin transaction
exec:提交事物,相似與關係型數據庫中的:commit
discard:事物回滾,相似與關係型數據庫中的:rollback
瞭解命令:
ping:返回PONG爲已成功連通
echo:在命令行打印一些內容 echo hehe
select:切換數據庫 select 1
quit:退出客戶端。等同於:Ctrl+C
dbsize:返回當前數據庫中key的數量。
info:獲取服務器的信息和統計。
持久化:把數據保存在硬盤上。
關係型數據庫MySQL-持久化:
任何的增刪改語句,都是在硬盤上作的操做。
斷電之後,硬盤上的數據仍是存在。
非關係型數據庫Redis-持久化:
默認狀況下,全部的增刪改,數據都是在內存中進行操做。
斷電之後,內存中的數據不存在。redis的部分數據會丟失,丟失的數據時保存在內存中的數據。因此Redis是存在持久化操做的。
Redis有倆種持久化策略:
RDB:是Redis的默認持久化機制。RDB至關於照快照,保存的是一種狀態。
優勢:
一、快照保存數據速度極快,還原數據速度極快。
二、適用於災難備份。
缺點:
一、小內存機器不適合使用。由於RDB機制符合要求就會照快照。(隨時隨地啓動)會佔用部分系統資源(忽然的佔用),極可能內存不足直接宕機。
適用於:內存比較充裕的計算機。
RDB什麼時候進行照快照:
一、服務器正常關閉時,照快照。
二、key知足必定條件時,照快照。
配置說明:
一、save 900 1:每900秒至少有一個key發生變化,則dump內存快照。
二、save 300 10:每300秒至少有10個key發生變化,則dump內存快照。
三、save 60 10000:每60秒至少10000個key發生變化,則dump內存快照。
AOF:
使用日誌功能保存數據的操做。適用於:內存比較小的計算機。
每秒同步(默認):每秒進行一次AOF保存數據。安全性低,但比較節省系統資源。
每修改同步:只要有key變化語句,就進行AOF保存數據。比較安全,但極爲浪費系統資源。
不一樣步:不進行任何持久化操做。不安全。
AOF操做:
只會保存致使key變化的語句。
AOF配置:
AOF默認時關閉的。
開啓AOF:
一、appendonly yes
二、放開 appendfsync always
always:每次有數據修改發生時都會寫入AOF文件。
everysec:每秒同步一次,該策略爲AOF的缺省策略。
no:從不一樣步,高效但數據不會被持久化。
優勢:
持續性佔用極少許的內存資源。
缺點:
一、日誌文件會特別大,不適用於災難恢復。
二、恢復效率遠遠低於RDB。
Jedis:
全部的Redis命令,Jedis都有對應的方法。
Java中鏈接Redis數據庫須要開啓Linux中Redis對應的端口號:
/shin/iptables -I INPUT -p tcp --dport 6379 -j ACCEPT
/etc/rc.d/init.d/iptables save
單實例鏈接Redis數據庫:Jedis jedis=new Jedis("IP",6379);
Jedis鏈接池:
JedisPoolConfig config = new JedisPoolConfig();//設置鏈接池的配置對象 //能夠不設置池的參數 config.setMaxTotal(int);//設置池中最大鏈接數 config.setMaxIdle(int);//設置空閒時池中包有的最大鏈接數 JedisPool pool = new JedisPool(config,"IP",6379);//設置鏈接池對象 Jedis jedis=pool.getResource();//從池中獲取鏈接對象。 jedis.get("name"); jedis.close();//鏈接歸還池JedisPool中
JedisUtils:
public class JedisUtils{ //定義一個鏈接池對象 private final static JedisPool POOL; static{//初始化操做 JedisPoolConfig config = new JedisPoolConfig(); config.setMaxTotal(int); config.setMaxIdle(int); POOL = new JedisPool(config,"IP",6379); } //從池中獲取鏈接 public static Jedis getJedis(){ return POOL.getResource(); } }