Nosql-redis介紹和操作
技術的分類
- 解決功能性的問題:Java、Jsp、 RDBMS Tomcat、HTML、Linux、 Jdbc、SVN
- 解決擴充套件性的問題:Struts、Spring、SpringMVC、Hibernate、Mybatis
- 解決效能的問題:NoSQL、Java執行緒、Hadoop、 Nginx、MQ、 ElasticSearch
解決應伺服器的cpu和記憶體壓力:
解決IO的壓力
NoSQL資料庫概述
- NoSQL(NoSQL = Not Only SQL ),意即“不僅僅是SQL”,泛指非關係型的資料庫。 NoSQL 不依賴業務邏輯方式儲存,而以簡單的key-value模式儲存。因此大大的增加了資料庫的擴充套件能力。
- 不遵循SQL標準。
- 不支援ACID
- 遠超於SQL的效能。
NoSQL適用場景:
對資料高併發的讀寫 海量資料的讀寫 對資料高可擴充套件性的
NoSQL不適用場景:
需要事務支援 基於sql的結構化查詢儲存,處理複雜的關係,需要即席查詢。
用不著sql的和用了sql也不行的情況,請考慮用NoSql
redis介紹:
Redis是一個開源的key-value儲存系統。和Memcached類似,它支援儲存的value型別相對更多,包括string(字串)、list(連結串列)、set(集合)、zset(sorted set --有序集合)和hash(雜湊型別)。這些資料型別都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,Redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是快取在記憶體中。區別的是Redis會週期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。
Redis應用場景:
1、配合關係型資料庫做快取記憶體
- 高頻次,熱門訪問的資料,降低資料庫IO
- 分散式架構,做session共享
2、由於其擁有持久化能力,利用其多樣的資料結構儲存特定的資料。
- 最新N個數據 ---->> 通過List實現按自然時間排序的資料
- 排行榜 ,Top N,---->> 利用zset(有序集合)
- 時效性的資料,比如手機驗證碼 ---->> Expire 過期
- 計數器,秒殺 ---->> 原子性,自增方法INCR、DECR
- 去除大量資料中的重複資料 ---->>利用Set集合
- 構建佇列 ---->>利用list集合
- 釋出訂閱訊息系統 ---->>pub/sub模式
redis埠和資料庫:
- 埠6379
- 預設16個數據庫,類似陣列下標從0開始,初始預設使用0號庫,使用命令 select <dbid> 來切換資料庫。如: select 8
- 統一密碼管理,所有庫都是同樣密碼,要麼都OK要麼一個也連線不上。
Redis—單執行緒:
Redis是單執行緒+多路IO複用技術
多路複用是指使用一個執行緒來檢查多個檔案描述符(Socket)的就緒狀態,比如呼叫select和poll函式,傳入多個檔案描述符,如果有一個檔案描述符就緒,則返回,否則阻塞直到超時。得到就緒狀態後進行真正的操作可以在同一個執行緒裡執行,也可以啟動執行緒執行(比如使用執行緒池)。
序列 vs 多執行緒+鎖(memcached) vs 單執行緒+多路IO複用(Redis)
Redis資料型別:
操作:
keys *
查詢當前庫的所有鍵
exists <key>
判斷某個鍵是否存在
type <key>
檢視鍵的型別
del <key>
刪除某個鍵
expire <key> <seconds>
為鍵值設定過期時間,單位秒。
ttl <key>
檢視還有多少秒過期,-1表示永不過期,-2表示已過期
move <key> <db>
把鍵移動到另一個庫下
dbsize
檢視當前資料庫的key的數量
flushdb
清空當前庫
flushall
通殺全部庫
String:
- String是Redis最基本的型別,一個key對應一個value。
- String型別是二進位制安全的。意味著Redis的string可以包含任何資料。比如jpg圖片或者序列化的物件 。
- String型別是Redis最基本的資料型別,一個Redis中字串value最多可以是512M
操作:
get <key>
查詢對應鍵值
set <key> <value>
新增鍵值對
append <key> <value>
將給定的<value> 追加到原值的末尾
strlen <key>
獲得值的長度
setnx <key> <value>
只有在 key 不存在時設定 key 的值
incr <key>
將 key 中儲存的數字值增1
只能對數字值操作,如果為空,新增值為1
decr <key>
將 key 中儲存的數字值減1
只能對數字值操作,如果為空,新增值為-1
incrby / decrby <key> <步長>
將 key 中儲存的數字值增減。自定義步長。
getrange <key> <起始位置> <結束位置>
獲得值的範圍,類似java中的substring
setrange <key> <起始位置> <value>
用 <value> 覆寫<key> 所儲存的字串值,從<起始位置>開始。
mset <key1> <value1> <key2> <value2> .....
同時設定一個或多個 key-value對
mget <key1> <key2> <key3> .....
同時獲取一個或多個 value
msetnx <key1> <value1> <key2> <value2> .....
同時設定一個或多個 key-value 對,當且僅當所有給定 key 都不存在。
setex <key> <過期時間> <value>
設定鍵值的同時,設定過期時間,單位秒。
getset <key> <value>
以新換舊,設定了新值同時獲得就值。
原子性:
所謂原子操作是指不會被執行緒排程機制打斷的操作;這種操作一旦開始,就一直執行到結束,中間不會有任何 context switch (切換到另一個執行緒)。
(1) 在單執行緒中, 能夠在單條指令中完成的操作都可以認為是" 原子操作",因為中斷只能發生於指令之間。
(2)在多執行緒中,不能被其它程序(執行緒)打斷的操作就叫原子操作。
Redis單命令的原子性主要得益於Redis的單執行緒
List:
- 單鍵多值
- Redis 列表是簡單的字串列表,按照插入順序排序。你可以新增一個元素導列表的頭部(左邊)或者尾部(右邊)。
- 它的底層實際是個雙向連結串列,對兩端的操作效能很高,通過索引下標的操作中間的節點效能會較差。
操作:
lpush/rpush <key> <value1> <value2> <value3> ....
從左邊/右邊插入一個或多個值。
lpop/rpop <key>
從左邊/右邊吐出一個值。
值在鍵在,值光鍵亡。
rpoplpush <key1> <key2>
從<key1>列表右邊吐出一個值,插到<key2>列表左邊。
lrange <key> <index>
按照索引下標獲得元素(從左到右)
lindex <key> <index>
按照索引下標獲得元素(從左到右)
llen <key>
獲得列表長度
linsert <key> before <value> <newvalue>
在<value>的後面插入<newvalue> 插入值
lrem <key> <n> <value>
從左邊刪除n個value(從左到右)
set:
- Redis set對外提供的功能與list類似是一個列表的功能,特殊之處在於set是可以自動排重的,當你需要儲存一個列表資料,又不希望出現重複資料時,set是一個很好的選擇,並且set提供了判斷某個成員是否在一個set集合內的重要介面,這個也是list所不能提供的。
- Redis的Set是string型別的無序集合。它底層其實是一個value為null的hash表,所以新增,刪除,查詢的複雜度都是O(1)。
操作:
sadd <key> <value1> <value2> .....
將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略。
smembers <key>
取出該集合的所有值。
sismember <key> <value>
判斷集合<key>是否為含有該<value>值,有返回1,沒有返回0
scard <key>
返回該集合的元素個數。
srem <key> <value1> <value2> ....
刪除集合中的某個元素。
spop <key>
隨機從該集合中吐出一個值。
srandmember <key> <n>
隨機從該集合中取出n個值。
不會從集合中刪除
smove <key1> <key2> <value>
將key1集合裡的<value>值移到key2集合裡
sinter <key1> <key2>
返回兩個集合的交集元素。
sunion <key1> <key2>
返回兩個集合的並集元素。
sdiff <key1> <key2>
返回兩個集合的差集元素。
hash:
- Redis hash 是一個鍵值對集合。
- Redis hash是一個string型別的field和value的對映表,hash特別適合用於儲存物件。
- 類似Java裡面的Map<String,Object>
操作:
hset <key> <field> <value>
給<key>集合中的 <field>鍵賦值<value>
hget <key1> <field>
從<key1>集合<field> 取出 value
hmset <key1> <field1> <value1> <field2> <value2>...
批量設定hash的值
hexists key <field>
檢視雜湊表 key 中,給定域 field 是否存在。
hkeys <key>
列出該hash集合的所有field
hvals <key>
列出該hash集合的所有value
hincrby <key> <field> <increment>
為雜湊表 key 中的域 field 的值加上增量 increment
hsetnx <key> <field> <value>
將雜湊表 key 中的域 field 的值設定為 value ,當且僅當域 field 不存在 .
zset (sorted set):
- Redis有序集合zset與普通集合set非常相似,是一個沒有重複元素的字串集合。不同之處是有序集合的沒有成員都關聯了一個評分(score) ,這個評分(score)被用來按照從最低分到最高分的方式排序集合中的成員。集合的成員是唯一的,但是評分可以是重複了 。
- 因為元素是有序的, 所以你也可以很快的根據評分(score)或者次序(position)來獲取一個範圍的元素。訪問有序集合的中間元素也是非常快的,因此你能夠使用有序集合作為一個沒有重複成員的智慧列表。
zadd <key> <score1> <value1> <score2> <value2>...
將一個或多個 member 元素及其 score 值加入到有序集 key 當中。
zrange <key> <start> <stop> [WITHSCORES]
返回有序集 key 中,下標在<start> <stop>之間的元素
帶WITHSCORES,可以讓分數一起和值返回到結果集。
zrangebyscore key min max [withscores] [limit offset count]
返回有序集 key 中,所有 score 值介於 min 和 max 之間(包括等於 min 或 max )的成員。有序整合員按 score 值遞增(從小到大)次序排列。
zrevrangebyscore key max min [withscores] [limit offset count]
同上,改為從大到小排列。
zincrby <key> <increment> <value>
為元素的score加上增量
zrem <key> <value>
刪除該集合下,指定值的元素
zcount <key> <min> <max>
統計該集合,分數區間內的元素個數
zcard <key>
獲取集合中元素個數
zrank <key> <value>
返回該值在集合中的排名,從0開始。