redis總結筆記

來源:互聯網
上載者:User

標籤:des   io   ar   color   os   使用   sp   for   on   

1、Redis的介紹和安裝部署
NOSQL =》 Not Only SQL
NOSQL以key-value形式儲存
特點:非關係型、分布式、開源的、水平可擴充
NOSQL:  資料高並發讀寫
對海量資料的高效率儲存和訪問
對資料的搞可擴充性和高可用性
Redis是一個開源的先進的key-value儲存。他被稱為資料結構伺服器,因為鍵包含字串、雜湊、鏈表、集合和有序集合
所有資料存放區在記憶體中,可以周期性的把更新資料寫入磁碟或者修改操作寫入追加到記錄檔案

一般兩種方式:
application 直接存取寫讀redis主從服務【有一定的資料隱患】
application 訪問redis,訪問redis失敗後,再讀寫取資料庫mysql
【應用程式讀寫redis時候,redis會同步到mysql中,確保redis叢集和mysql叢集資料同步,確保資料安全】


redis應用情境:
適合海量資料
1、取最小的N個資料的操作
2、熱門排行榜應用,取Top N 的操作
3、需要精確設定到期時間的應用
4、計數器應用
5、Uniq操作,擷取某段時間所有資料排重值
6、即時系統,反垃圾系統
7、Pub/Sub構建即時訊息系統
8、構建隊列系統
9、緩衝

reids和MYSQL相同點和不同點,都有資料庫的概念,reids無表無欄位無序列,mysql有表和欄位

reids安裝:
解壓檔案
-- tar -xzvf redis-2.8.17.tar.gz
-- cd redis-2.8.17
編譯和安裝
-- make
-- cd src && make install
移動檔案便於管理
-- mkdir -p /usr/local/redis/bin
-- mkdir -p /usr/local/redis/etc
-- mv ~/redis-2.8.17/redis.conf /usr/local/redis/etc
-- cd ~/redis-2.8.17/src
-- mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server /usr/local/redis/bin
啟動Redis服務
-- /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
-- redis預設的連接埠6379
用戶端串連
-- /usr/local/redis/bin/redis-cli
停止Redis服務
-- /usr/local/redis/bin/redis-cli shutdown
or
-- pkill redis-server

--後台啟動redis
-- redis.conf daemonize 修改成yes
-- 查看連接埠 netstate -tunpl | grep 6379

2、redis資料類型
String 類型,一個Key對應一個value,string類型是二進位安全的,redis的string可以包含任何資料,比片二進位
set方法 設定key對應的值為string類型的value
eg:添加name=cxq的索引值對
>>> set name cxq
get方法 擷取key對應的值
>>> get name
setnx方法 設定可以對應的值為string類型的value,如果key已經存在返回0,nx標識no exist的意思.不存在則設定一個新值
>>> set name chenxiangqi
>>> get name
setex方法 設定key對應的值為string類型的value,並指定此索引值對應的有效期間
>>> setex haircolor 10 red //設定haircolor鍵對應的值為red 有效期間10s
setrange方法 設定指定key的value值的子字串
>>> get name
"[email protected]"
>>> setrange name 4 gmail.com //從[0開始]第4個字元往後替換
(integer) 13
>>> get name
mset方法 一次設定多個key的值,成功返回ok表示所有的值都設定了失敗返回0表示所有的值都沒有設定
>>> mset key1 cxq key2 chenxiangqi
msetnx方法 一次設定多個key的值,成功返回OK表示所有的值都設定了,失敗返回0表示沒有任何值被設定,但不會覆蓋已經存在的key
>>> msetex key1 cxq key2 chenxiangqi
getset方法 設定key的值並返回key的舊值
>>> getset name 20
"30"
getrange方法 設定key的子字串
>>> getrange name 0 5 //從name的值的第0個字元到第5個字元返回
mget方法 批量擷取
>>> mget key1 key2 key3
incr方法 對key的值進行遞增,並返回遞增的值
>>> incr name 
“31”
incrby方法 同incr類似,加指定值,如果對應的可以不存在則加入新值,原來的值為0
>>> incrby key6 5  //讓key6的值增加5
>>> incrby key6 -5 //讓key6的值減少5
decr方法 對key的值進行自減操作
descrby方法 對key的值進行指定值減少
>>> decr key6 
>>> desrby key6 5
>>> desrby key6 -5 //讓key6增加5
append方法  給指定key的字串追加value,返回新字串的長度
>>> append name .net
strlen方法  取指定key的值的字串長度

Hash資料類型  是一個string類型的field和value的映射表,它可以添加刪除操作都是01,hash特別適合儲存物件,將一個Object Storage Service在hash類型會佔用更少的記憶體,並且更方便的存取整個對象
hset方法  設定hash field為指定值,如果key不存在則先建立
>>> hset myhash field1 Hello
>>> hset user:001 name chenxiangqi
>>> hget user:0001 name
hsetnx方法 設定hash field為指定值,如果key不存在則先建立
>>> hsetnx myhash field "HELLO"
(integer) 1
>>> hsetnx myhash field "HELLO"
(integer) 0
hmset方法 同時設定多個 hash 的多個field
>>> hmset myhash field "HELLO" field2 world
hget方法  
>>> hget user:003 name
hmget方法 擷取hash 指定的多個索引值
>>> hmget user:003 name sex age
hincrby方法 給指定的 hash field加上指定值
>>> hincrby user:003 age 5
hexists方法 測試指定的field是否存在
>>> hexists user:003 name
>>> hexists user:003 hhhhh
hlen方法 返回hash field所有的鍵數
>>> hlen user:001
>>> hlen user:003
hdel方法 刪除指定hash的field
>>> hdel myhash age
hkeys方法 返回hash裡面所有的field
>>> hkeys user:003
hvals方法 返回hash裡面的索引value
>>> hvals user:003
hgetall方法  擷取某個hash裡面的所有的field和value
>>> hgetall user:003

List資料類型 List是一個鏈表結構、主要功能push、pop擷取一個範圍裡面的值,List類型其實就是每個元素都是String類型的雙向鏈表
lpush方法 對鏈表從頭部壓入一個元素
>>> lpush mylist world
>>> lpush mylist hello
lrang方法 對指定list取得指定區間的元素
>>> lrange mylist 0 -1 //從鏈表中取出從第一個元素取到最後一個元素
rpush方法 對list從尾部壓入一個元素
>>> rpush mylist2 hello
>>> rpush mylist2 world
>>> lrange mylist2 0 -1
linsert方法 在key對應的list的特定位置前或後添加字串
>>> rpush list:003 world
>>> linsert list:003 before world hello //在world前面插入hello
>>> lrange 0 -1
lset方法 設定list中指定下標的元素替換掉
>>> lpush list5 one
>>> lpush list5 two
>>> lpush list5 three
>>> lset list5 0 four  //設定下標為0的元素更改成four
>>> lrange list5 0 -1
lrem方法 從key對應的list中刪除n個和value相同的值[n<0從未刪除 n=0全部刪除],返回的值為刪除的個數
>>> lpush list6 one
>>> lpush list6 one
>>> lpush list6 one
>>> lrem list6 1 "one" //從list6中刪除一個和one相同的值
ltrim方法 保留指定key的值範圍內的資料
>>> lpush list8 "one"
>>> lpush list8 "two"
>>> lpush list8 "three"
>>> ltrim list8 1 -1 //保留下標從1到-1【最後】的元素,刪除其他元素
lpop方法 從list的頭部刪除一個元素,並返回被刪除的元素
>>> lpop list8
rpop方法 從list的尾部刪除一個元素,並返回被刪除的元素
>>> rpop list8
rpoplpush方法 從第一個list的尾部移除元素並添加到第二個list的頭部
>>> rpoplpush list7 list8 //從list7中尾部移除一個元素並將該元素從頭部壓入list8
lindex方法返回名稱key的list中index位置的元素
>>> lindex list5 1 //返回list5中元素索引下表為1[index]的元素
llen方法 返回key對應的list的長度
>>> llen list7


Set資料類型 集合,實際是String類型的無序集合,set通過hashtable實現。添加刪除尋找複雜度都是0(1)
sadd方法 向名稱為key的set添加元素
>>> sadd set1 hello
>>> sadd set1 world
>>> sadd set1 world
srem方法 刪除名稱為key的set中的元素
>>> srem set1 world
spop方法 隨機返回並刪除名稱為key的set中一個元素
>>> spop set2 "one" //無法指定的 error
>>> spop set2 "two" //無法指定的 error
>>> spop set2       //success 
sdiff方法 返回給定key與第一個key的差集【兩個集合的差集,誰在前以誰為標準】
>>> sdiff set1 set2 //以set1為標準返回set1中對比set2中不同的元素
sdiffstore方法 返回索引給定key與第一個可以的差集,並將差集儲存到指定的集合中
>>> smembers set1
>>> smembers set2
>>> sdifstore set1 set2 set3  //將set1和set2差集儲存到set3中
sinter方法 返回給點key的交集
>>> sinter set1 set2 //返set1和set2的交集
sinterstore方法 返回指定交集並將交集儲存到指定集合裡面
>>> sinterstore set1 set2 set4
sunion方法 返回所有key的集合的並集
>>> sunion set1 set2
sunionstore方法
>>> sunionstore set1 set2 set5
smove方法 從給定的第一個key的集合移除某一個元素添加到第二個key指定的集合裡面
>>> smove set1 set2 three //將set1中的three移除並添加到set2中
scard方法 返回名稱為key的set的元素個數
>>> scard set2
sismember方法 測試某一個元素是否是 指定key對應的set的元素
>>> sismember set2 two //判斷two是否是set2的元素
srandmember方法 隨機返回名稱為key的set的一個元素但不刪除
>>> srandmember set2
smembers方法 展示指定集合的所有元素
>>>smembers set1

storted sets類型 是set的一個升級版本,他在set的基礎上增加了一個順序屬性,在添加修改刪除元素的時候可以指定,每次指定後,zset會自動為你排序
zadd方法 添加一個有序集合的元素,score 用於排序
>>> zadd zset1 1 "one" //項zset1中添加一個元素,指定順序為1
>>> zadd zset1 2 "two"
>>> zadd zset1 3 "two"
zrange方法 取得有序集合裡面的元素【指定範圍,withscores輸出順序號】
>>> zrange zset1 0 -1 withscores //輸出zset1中索引為0到-1 的元素,並輸出順序號
zrem方法 刪除名稱為key的zset的元素member
>>> zrem zset1 two  //刪除zset1中的two
zincry方法 如果在名稱為key的zset中已經存在元素member,則該元素的score增加increment否則項該集合中添加該元素,其score的值為increment
>>> zincry zset3 1 "one"
>>> zincry zset3 2 "two"
>>> zincry zset3 3 "three"
zrank方法 返回名稱為key的zset中member的排名(按score從小到大排序)即下標
>>> zrank zset3 tow
zrevrank方法 返回名稱為key的zset中member的排名(按score從大到小排序)即下標
>>> zrevrank zset3 two
zrangebyscore方法 返回指定socre的範圍的元素
>>> zrangebyscore zset3 2 3 withsocres
zcount 返回指定score的給定區間的數量
>>> zcount zset3 2 4
zcard方法 返回給點key的zset的所有元素個數
zremrangebyrank方法 刪除zset中排名在給定區間的元素
>>> zremrangebyrank zset3 1 1 //刪除zset3的根據下表排名的 索引1到1的元素
zremrangebyscore方法 刪除集合中的指定score的區間的元素
>>> zremrangebyscore方法 zset3 3 4


3、redis常用命令及進階應用程式
索引值相關命令
keys 返回滿足給定pattern的所有的key
>>> keys *
>>> keys r*
exists 確認一個key是否存在 0不存在 1 存在
>>> exists name
>>> exists age
del  刪除一個key  1 成功 
>>> del age
expire 設定一個key的到期時間
ttl 擷取一個key的有效時間長度
>>> expire age 10
>>> ttl age
move 將當前資料庫的key移轉到其他庫中
select  選擇資料庫
>>> select 0
>>> set age 30
>>> get age 
>>> move age 1
>>> get age 
>>> select 1 
>>> get age
persist 移除給定key的到期時間
>>> expire age 3000
>>> ttl age
>>> perisist age
>>> ttl age
randomkey 隨機返回key空間的一個key
>>> randomkey
rename 重新命名key
>>> rename set2 set_r_2
type 測試key傳回值類型
>>> type set2
>>> type set_r_2

伺服器相關命令
ping 測試連結是否存活 PONG存活  否則串連失敗
>>> ping
echo 在命令列列印一些內容
select 選擇資料庫【redis資料庫編號從0~15】
quit 退出串連
dbsize 返回當前資料庫中key的數目
>>> dbsize  
>>> select 1
>>> dbsize
info 擷取redis伺服器相關的資訊
>>> info
config get 即時轉儲收到的請求 、返回相關配置的資料
>>> config get dir
>>> config get *
>>> config get timeout
flushdb 刪除當前資料庫中的所有key
>>> dbsize
>>> flushdb
>>> dbsize
flushall 刪除所有資料庫的所有鍵

4、Redis進階應用程式
安全性:
設定用戶端來年結婚進行任何其他指定前需要使用的密碼,
警告:因為redis速度非常快,所以設定密碼要求很強,否則1s中能允許15萬次的密碼嘗試
//在設定檔中配置requirepass 密碼
#requirepass foobared
requirepass beijing 

用戶端登入後 auth 密碼;
登入時候 redis-cli -a 密碼


主從複製:
主從複製允許多個slave server 擁有和master server相同的資料庫副本
redis主從複製特點
1)master可以用於多個slave【副伺服器】
2)多個slave可以串連同一個master外,還可以連結到其他slave
3)主從複製不會阻塞master,在同步資料時,master可以繼續處理client請求
4)提高系統的伸縮擴充性【原理:當一個主機當機,其他另外一個slave立馬變成主機(依靠心跳感應)】

redis主從複製過程:
slave與master建立串連,發送sync同步命令
master啟動後台進程,將資料庫快照集儲存到檔案中,同時master主進程會開始手機新的寫命令並緩衝
後台完成儲存後,將此檔案發送給slave
slave將此檔案儲存到硬碟上

配置主從伺服器
配置slave伺服器很簡單,只需要在slave的設定檔加入以下配置
slaveof 192.168.1.1 6379 #指定master的ip和連接埠
masterauth beijing #這是主機密碼

交易處理:
支援事務比較簡單,redis織女呢個保證一個client發起的事務中的命令
可以連續唯寫,而中間不會插入其他命令,
當一個茨愣頭在一個串連中發出multi命令時,這個串連會進入一個事務上下文,
該串連後續的命令不會立即執行,而是先放到一個隊列中,
當唯寫exec命令時候,redis會順序唯寫隊列中的所有命令
multi 開啟事務上下文
discard 取消事務,交易回復
exec 執行事務
>>> get age
>>> multi
>>> set age 10
>>> set age 20
>>> exec 
>>> getage
注意;當執行事務內容相關的時候,假如事務隊列裡面的命令有錯誤,執行後會發現事務不能復原。此為redis的交易處理很簡單

樂觀鎖:基於資料庫版本的提供一個version欄位,記錄資料更新版本。
redis樂觀鎖 : 假如有一個age的key 開啟2個session對age進行賦值吵嘴哦,我們看一下結果如何
1) session 1
>>> get age
>>> watch age //監控age是否修改
>>> multi
2)session 2
>>> set age 30
>>> get age
3) session 1 在開啟事務後
>>> set age 40
>>> exec
>>> get age
持久化機制:
Redis支援兩種持久化方式:
1、snapshotting(快照)也是預設
2、Append-Only(縮寫aof)的方式

快照方式;
將記憶體中的資料以快照的方式寫到二進位檔案。預設檔案名稱dump.rdb
可以通過配置設定自動做快照持久化的方式.
可以配置redis在n秒內如果超過m個key被修改就自動做快照
save 900 1 #900秒內如果超過1個key被修改,則發起快照儲存
save 300 10 #300秒內如果超過10個可以被修改,則發起快照儲存
save 60 10000

Aof方式:
由於快照方式有一定的時間建個,aof比快照方式有更好的持久化性,
由於使用aof時候,redis會將每一個接受到的寫命令通過write函數追加到檔案中,
當redis重啟後後通過重新執行檔案中儲存的寫命令來在記憶體中重建整個資料庫內容。

由於os會在核心中write做的修改,所以不是立即寫到磁碟上,通過設定檔告訴redis
通過fsync函數強制os寫入磁碟的時機
appendonly yes //啟用aof持久化方式
#appendfsync always //收到寫命令立即寫入磁碟、最慢、但是保證完整的持久化
appendfsync everysec //每秒鐘寫入磁碟一次,在效能和持久化方面做了很好的折中
#appendfsync no //完全依賴os,效能最好,持久化沒保證

發布訂閱訊息:
pub/sub是一種訊息通訊模式,主要目的解除訊息發行者和訊息訂閱者之間的耦合,
Redis作為pub/sub的server,在訂閱者和發行者之間起到訊息路由的功能。
訂閱者可以通過subscribe和psubscribe命令項redis server訂閱自己感興趣的訊息類型
Redis將訊息類型稱為通道 channel,當發行者通過publish命令向 redis Server 發送特定類型的資訊時候,
該資訊類型的全部client都會收到此訊息。



虛擬記憶體的使用:
Redis的虛擬記憶體,將不經常使用的資料從記憶體交換到磁碟中。
配置 VM:
vm-enabled yes     # 開啟VM功能
vm-swap-file  /temp/redis.swap # 交換出來的value儲存的檔案路徑
vm-max-memory 1000000 # redis使用的最大記憶體上限
vm-page-size 32 #每個頁面的大小32位元組
vm-pages 134217728 #最高使用多少頁面
vm-max-threads 4 #用於執行value對象換入換出的背景工作執行緒數量



redis總結筆記

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.