NoSql數據庫之--Redis

 

什麼是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 : 從表頭開始向表尾搜索,移除與 value 相等的元素,數量爲 count 。count : 從表尾開始向表頭搜索,移除與 value 相等的元素,數量爲 count 的絕對值。count : 移除表中全部與 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)

相關文章
相關標籤/搜索