什麼是NoSqlphp
概念mysql
SQL:web
結構化查詢語言 -- 用到關係型數據庫redis
NoSQL(NoSQL = Not Only SQL ),意即「不只僅是SQL」,它泛指非關係型的數據庫。隨着互聯網2003年以後web2.0網站的興起,傳統的關係數據庫在應付web2.0網站,特別是超大規模和高併發的交友類型的web2.0純動態網站已經顯得力不從心,暴露了不少難以克服的問題,而非關係型的數據庫則因爲其自己的特色獲得了很是迅速的發展。sql
關係型數據庫(mysql sqlserver oracle):以關係(由行和列組成二維表)來建模的數據庫.數據庫
Redis是什麼vim
Redis 是一個高性能的開源的、C語言寫的Nosql(非關係型數據庫),數據保存在內存中。數組
Redis 是以key-value形式存儲的Nosql,和傳統的關係型數據庫不同。不必定遵循傳統數據庫的一些基本要求,好比說,不遵循sql標準,事務,表結構等等,非關係型數據庫嚴格上不是一種數據庫,應該是一種數據結構化存儲方法的集合。緩存
數據結構:數組,list,set,map,tree等等安全
redis給咱們提供了一堆方法,調用特定方法就能把數據保存爲特定數據結構.
特色(優點)
1.數據保存在內存,存取速度快,併發能力強-- 做爲緩存數據庫
2.它支持存儲的value類型相對memcached更多,包括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羣
數據存儲:
存放到內存中,而且還能不按期持久化到硬盤.
Value類型:
相較於memcached支持Value更多
客戶端支持:
支持多種客戶端-跨語言
超大併發支持:
支持集羣
Mysql、Memcached和Redis的比較
|
mysql |
redis |
memcached |
類型 |
關係型 |
非關係型 |
非關係型 |
存儲位置 |
磁盤 |
磁盤和內存 |
內存 |
存儲過時 |
不支持 |
支持 |
支持 |
讀寫性能 |
低 |
很是高 |
很是高 |
存儲過時:存儲數據時設置一個有效期,時間到了就沒了.
場景:訂單,vip,短信驗證碼,遊戲道具,優惠券,紅包等等
Memcached和Redis的相同點和不一樣點? Memcached?
相同點:
都是key-value類型Nosql,都存放數據到內存中,讀寫效率高,並且都支持存儲過時.
不一樣點:
redis相較於Memcached還支持持久化到磁盤,數據安全更高.
redis相較於Memcached支持value類型更多.
使用場景
中央緩存(經常使用場景)
常常查詢數據,放到讀速度很快的空間(內存),以便下次訪問減小時間。減輕壓力,減小訪問時間.而redis就是存放在內存中的。
Hibernte(JPA)二級緩存,mybatis二級緩存,這些緩存默認都不支持在集羣環境使用.redis中央緩存就OK.
計數器應用
網站一般須要統計註冊用戶數,網站總瀏覽次數等等
新浪微博轉發數、點贊數--MQ消息中間件
實時防攻擊系統
暴力破解:(窮舉法)使用工具不間斷嘗試各類密碼進行登陸。防:ip(帳號)--->num,到達5次之後自動鎖定IP,30分鐘後解鎖
解決方案:
一、存數據庫
登陸操做的訪問量很是大
二、static Map<String,int> longinFailNumMap;
Map存儲空間有限,大批量就不行,而且斷電之後數據丟失。
問題:
一、每次查詢數據庫,查詢速度慢,屢次寫 內存
二、斷電會丟失數據,多個節點,不能共用 redis集羣,容量能夠無限大,能夠共享數據、而且支持過時
排行榜
總積分榜,今日積分榜,周積分,月積分,季度積分
方案:從數據庫中查出來計算.
問題:
一、實時查詢,查詢速度慢
二、還要進行各類計算。
設定有效期的應用
設定一個數據,到必定的時間失效。 自動解鎖,購物券 優惠劵 紅包
自動去重應用
Uniq 操做,獲取某段時間全部數據排重值 這個使用 Redis 的 set 數據結構最合適了,只須要不斷地將數據往 set 中扔就好了,set 意爲 集合,因此會自動排重。
隊列
MQ:解決高併發問題
構建隊列系統 使用 list 能夠構建隊列系統,使用 sorted set 甚至能夠構建有優先級的隊列系統。
秒殺 搶購:能夠把名額放到內存隊列(redis),內存就能處理高併發訪問。
RabbitMQ ActiveMQ Kafaka
消息訂閱系統
Pub/Sub 構建實時消息系統 Redis 的 Pub/Sub 系統能夠構建實時的消息系統,好比不少用 Pub/Sub 構建的實時聊天系統 的例子。
好比QQ羣消息
Linux下的安裝和使用(瞭解)-oneinstack
1下載redis源碼
wget http://download.redis.io/releases/redis-3.0.6.tar.gz
或者使用ftp上傳redis-3.0.6.tar.gz
2安裝redis
tar xf redis-3.0.6.tar.gz //解壓
cd redis-3.0.6
//不須要配置參數 不須要執行./configure
make && make install//編譯&&安裝
3將redis設置爲系統服務
cp (redis源碼目錄)utils/redis_init_script /etc/init.d/redis
vim /etc/init.d/redis //修改紅框處的代碼
4修改redis.conf配置文件
mkdir /etc/redis //建立/etc/redis目錄
cp redis.conf /etc/redis/redis.conf
vim /etc/redis.conf
//將redis配置文件複製到redis
//設置爲守護進程,之後臺方式運行
使用service redis start命令啓動redis服務.
5 將redis服務設置爲開機啓動
chkconfig –-add redis
chkconfig –level 35 redis on
使用redis-cli 客戶端操做redis
redis是一個key-value的Nosql,咱們能操做就只有String類型key以及各類類型value.可是必定要注意咱們添加的通常都是字符串,只是會組織爲特定數據結構.
set(key ,map,set)==>set(key ,1),set(key ,」2」)
對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 num//自增多少
decrBy key num//自減多少
對key的經常使用操做
keys * //獲取全部key列表
del key //刪除key
expire key xx //設置key的過時時間(xx秒後過時)
ttl key //查看key的過時時間
select 0-15 選擇庫 默認16個數據庫
flushall //清空整個redis服務器數據,全部的數據庫所有清空
flushdb //清除當前庫,redis中默認有16個數據庫,名稱分別爲0,1,2.。。15
對list集合的經常使用操做
redis怎麼實現棧和隊列?
FIFO FILO
都用list,控制一邊進同一邊出就是棧,一邊進另外一邊出就是隊列.
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 //對一個列表進行修剪
對set集合的經常使用操做
set集合是一個無序的不含重複值的隊列
sadd key member //將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略
srem key member//移除集合 key 中的一個或多個 member 元素,不存在的 member 元素會被忽略
smembers key //返回集合 key 中的全部成員。
對SortedSet(有序集合)的操做(瞭解)
對hash類型的經常使用操做
hash類型相似於php的數組
hset key name value//添加一個name=>value鍵值對到key這個hash類型
例如: HSET sit redis xx
hget key name //獲取hash類型的name鍵對應的值
例如:HGET sit redis
hmset key name1 key1 name2 key2 //批量添加name=>value鍵值對到key這個hash類型
hmget key name1 name2//批量獲取hash類型的鍵對應的值
hkeys //返回哈希表 key 中的全部鍵
hvals //返回哈希表 key 中的全部值
hgetall //返回哈希表 key 中,全部的鍵和值
咱們將user:1(name:zhangsan,age:18,sex:nv)的信息保存在hash表.
事務(瞭解)
強事務:所有成功所有失敗 -- >對數據要求很嚴格
弱事務:插入日誌
multi //標記一個事務塊的開始。
exec //執行全部事務塊內的命令。
discard //取消事務,放棄執行事務塊內的全部命令。
Redis的事務在執行exec指令時,才批量執行操做,沒有回滾操做
訂閱/發佈(瞭解)
SUBSCRIBE channel [channel ...] //訂閱給定的一個或多個頻道的信息。
PUBLISH channel message //將信息 message 發送到指定的頻道 channel 。
新開一個客戶端訂閱tv頻道
發佈nihao!消息到tv頻道
訂閱tv頻道的客戶端能夠收到nihao!消息
設置密碼(瞭解)
1. 經過命令動態調整密碼-臨時設置
CONFIG SET 命令能夠動態地調整 Redis 服務器的配置而無須重啓,重啓後失效
CONFIG SET requirepass 123456 //將密碼設置爲123456
CONFIG SET requirepass "" //清除密碼
AUTH 123456 //輸入密碼進行認證
2. 經過配置文件設置密碼-長久設置
在配置文件redis.conf中增長一行代碼
requirepass 123456
將密碼123456設置到配置文件中,redis啓動時加載該文件,便可啓用密碼
從新啓動服務端
鑑權
AUTH 123456 //輸入密碼進行認證
Redis持久化配置
簡介
Redis 提供了兩種不一樣級別的持久化方式:RDB和AOF,能夠經過修改redis.conf來進行配置.
RDB模式
RDB 持久化能夠在指定的時間間隔內生成數據集的時間點快照,默認開啓該模式.
如何關閉 rdb 模式:
save ""
# save 900 1 //至少在900秒的時間段內至少有一次改變存儲同步一次
# save xxx
# save 60 10000
save 1 1 ;
若是這種方式 在1S以內操做完,持久化就沒法作..可能要丟失1s的數據
AOF追加模式
AOF 持久化記錄服務器執行的全部寫操做命令,並在服務器啓動時,經過從新執行這些命令來還原數據集,默認關閉該模式。
如何開啓aof模式:
appendonly yes //yes 開啓,no 關閉
# appendfsync always //每次有新命令時就執行一次fsync
#這裏咱們啓用 everysec
appendfsync everysec //每秒 fsync 一次
# appendfsync no //從不fsync(交給操做系統來處理,可能好久才執行一次fsync)