redis总结笔记
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
1、Redis的介紹和安裝部署NOSQL =》 Not Only SQL
NOSQL以key-value形式存儲
特點(diǎn):非關(guān)系型、分布式、開源的、水平可擴(kuò)展
NOSQL: ?數(shù)據(jù)高并發(fā)讀寫
對海量數(shù)據(jù)的高效率存儲和訪問
對數(shù)據(jù)的搞可擴(kuò)展性和高可用性
Redis是一個開源的先進(jìn)的key-value存儲。他被稱為數(shù)據(jù)結(jié)構(gòu)服務(wù)器,因為鍵包含字符串、哈希、鏈表、集合和有序集合
所有數(shù)據(jù)存儲在內(nèi)存中,可以周期性的把更新數(shù)據(jù)寫入磁盤或者修改操作寫入追加到記錄文件
一般兩種方式:
application 直接訪問寫讀redis主從服務(wù)【有一定的數(shù)據(jù)隱患】
application 訪問redis,訪問redis失敗后,再讀寫取數(shù)據(jù)庫mysql
【應(yīng)用程序讀寫redis時候,redis會同步到mysql中,確保redis集群和mysql集群數(shù)據(jù)同步,確保數(shù)據(jù)安全】
redis應(yīng)用場景:
適合海量數(shù)據(jù)
1、取最小的N個數(shù)據(jù)的操作
2、排行榜應(yīng)用,取Top N 的操作
3、需要精確設(shè)置過期時間的應(yīng)用
4、計數(shù)器應(yīng)用
5、Uniq操作,獲取某段時間所有數(shù)據(jù)排重值
6、實(shí)時系統(tǒng),反垃圾系統(tǒng)
7、Pub/Sub構(gòu)建實(shí)時消息系統(tǒng)
8、構(gòu)建隊列系統(tǒng)
9、緩存
reids和MYSQL相同點(diǎn)和不同點(diǎn),都有數(shù)據(jù)庫的概念,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服務(wù)
-- /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
-- redis默認(rèn)的端口6379
客戶端連接
-- /usr/local/redis/bin/redis-cli
停止Redis服務(wù)
-- /usr/local/redis/bin/redis-cli shutdown
or
-- pkill redis-server
--后臺啟動redis
-- redis.conf daemonize 修改成yes
-- 查看端口 netstate -tunpl | grep 6379
2、redis數(shù)據(jù)類型
String 類型,一個Key對應(yīng)一個value,string類型是二進(jìn)制安全的,redis的string可以包含任何數(shù)據(jù),比如圖片二進(jìn)制
set方法 設(shè)置key對應(yīng)的值為string類型的value
eg:添加name=cxq的鍵值對
>>> set name cxq
get方法 獲取key對應(yīng)的值
>>> get name
setnx方法 設(shè)置可以對應(yīng)的值為string類型的value,如果key已經(jīng)存在返回0,nx標(biāo)識no exist的意思.不存在則設(shè)置一個新值
>>> set name chenxiangqi
>>> get name
setex方法 設(shè)置key對應(yīng)的值為string類型的value,并指定此鍵值對應(yīng)的有效期
>>> setex haircolor 10 red //設(shè)置haircolor鍵對應(yīng)的值為red 有效期10s
setrange方法 設(shè)置指定key的value值的子字符串
>>> get name
"cxq@126.com"
>>> setrange name 4 gmail.com //從[0開始]第4個字符往后替換
(integer) 13
>>> get name
mset方法 一次設(shè)置多個key的值,成功返回ok表示所有的值都設(shè)置了失敗返回0表示所有的值都沒有設(shè)置
>>> mset key1 cxq key2 chenxiangqi
msetnx方法 一次設(shè)置多個key的值,成功返回OK表示所有的值都設(shè)置了,失敗返回0表示沒有任何值被設(shè)置,但不會覆蓋已經(jīng)存在的key
>>> msetex key1 cxq key2 chenxiangqi
getset方法 設(shè)置key的值并返回key的舊值
>>> getset name 20
"30"
getrange方法 設(shè)置key的子字符串
>>> getrange name 0 5 //從name的值的第0個字符到第5個字符返回
mget方法 批量獲取
>>> mget key1 key2 key3
incr方法 對key的值進(jìn)行遞增,并返回遞增的值
>>> incr name?
“31”
incrby方法 同incr類似,加指定值,如果對應(yīng)的可以不存在則加入新值,原來的值為0
>>> incrby key6 5 ?//讓key6的值增加5
>>> incrby key6 -5 //讓key6的值減少5
decr方法 對key的值進(jìn)行自減操作
descrby方法 對key的值進(jìn)行指定值減少
>>> decr key6?
>>> desrby key6 5
>>> desrby key6 -5 //讓key6增加5
append方法 ?給指定key的字符串追加value,返回新字符串的長度
>>> append name .net
strlen方法 ?取指定key的值的字符串長度
Hash數(shù)據(jù)類型 ?是一個string類型的field和value的映射表,它可以添加刪除操作都是01,hash特別適合存儲對象,將一個對象存儲在hash類型會占用更少的內(nèi)存,并且更方便的存取整個對象
hset方法 ?設(shè)置hash field為指定值,如果key不存在則先創(chuàng)建
>>> hset myhash field1 Hello
>>> hset user:001 name chenxiangqi
>>> hget user:0001 name
hsetnx方法 設(shè)置hash field為指定值,如果key不存在則先創(chuàng)建
>>> hsetnx myhash field "HELLO"
(integer) 1
>>> hsetnx myhash field "HELLO"
(integer) 0
hmset方法 同時設(shè)置多個 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所有的鍵數(shù)
>>> 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數(shù)據(jù)類型 List是一個鏈表結(jié)構(gòu)、主要功能push、pop獲取一個范圍里面的值,List類型其實(shí)就是每個元素都是String類型的雙向鏈表
lpush方法 對鏈表從頭部壓入一個元素
>>> lpush mylist world
>>> lpush mylist hello
lrang方法 對指定list取得指定區(qū)間的元素
>>> lrange mylist 0 -1 //從鏈表中取出從第一個元素取到最后一個元素
rpush方法 對list從尾部壓入一個元素
>>> rpush mylist2 hello
>>> rpush mylist2 world
>>> lrange mylist2 0 -1
linsert方法 在key對應(yīng)的list的特定位置前或后添加字符串
>>> rpush list:003 world
>>> linsert list:003 before world hello //在world前面插入hello
>>> lrange 0 -1
lset方法 設(shè)置list中指定下標(biāo)的元素替換掉
>>> lpush list5 one
>>> lpush list5 two
>>> lpush list5 three
>>> lset list5 0 four ?//設(shè)置下標(biāo)為0的元素更改成four
>>> lrange list5 0 -1
lrem方法 從key對應(yīng)的list中刪除n個和value相同的值[n<0從未刪除 n=0全部刪除],返回的值為刪除的個數(shù)
>>> lpush list6 one
>>> lpush list6 one
>>> lpush list6 one
>>> lrem list6 1 "one" //從list6中刪除一個和one相同的值
ltrim方法 保留指定key的值范圍內(nèi)的數(shù)據(jù)
>>> lpush list8 "one"
>>> lpush list8 "two"
>>> lpush list8 "three"
>>> ltrim list8 1 -1 //保留下標(biāo)從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對應(yīng)的list的長度
>>> llen list7
Set數(shù)據(jù)類型 集合,實(shí)際是String類型的無序集合,set通過hashtable實(shí)現(xiàn)。添加刪除查找復(fù)雜度都是0(1)
sadd方法 向名稱為key的set添加元素
>>> sadd set1 hello
>>> sadd set1 world
>>> sadd set1 world
srem方法 刪除名稱為key的set中的元素
>>> srem set1 world
spop方法 隨機(jī)返回并刪除名稱為key的set中一個元素
>>> spop set2 "one" //無法指定的 error
>>> spop set2 "two" //無法指定的 error
>>> spop set2 ? ? ? //success?
sdiff方法 返回給定key與第一個key的差集【兩個集合的差集,誰在前以誰為標(biāo)準(zhǔn)】
>>> sdiff set1 set2 //以set1為標(biāo)準(zhǔn)返回set1中對比set2中不同的元素
sdiffstore方法 返回索引給定key與第一個可以的差集,并將差集存儲到指定的集合中
>>> smembers set1
>>> smembers set2
>>> sdifstore set1 set2 set3 ?//將set1和set2差集存儲到set3中
sinter方法 返回給點(diǎn)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的元素個數(shù)
>>> scard set2
sismember方法 測試某一個元素是否是 指定key對應(yīng)的set的元素
>>> sismember set2 two //判斷two是否是set2的元素
srandmember方法 隨機(jī)返回名稱為key的set的一個元素但不刪除
>>> srandmember set2
smembers方法 展示指定集合的所有元素
>>>smembers set1
storted sets類型 是set的一個升級版本,他在set的基礎(chǔ)上增加了一個順序?qū)傩?#xff0c;在添加修改刪除元素的時候可以指定,每次指定后,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中已經(jīng)存在元素member,則該元素的score增加increment否則項該集合中添加該元素,其score的值為increment
>>> zincry zset3 1 "one"
>>> zincry zset3 2 "two"
>>> zincry zset3 3 "three"
zrank方法 返回名稱為key的zset中member的排名(按score從小到大排序)即下標(biāo)
>>> zrank zset3 tow
zrevrank方法 返回名稱為key的zset中member的排名(按score從大到小排序)即下標(biāo)
>>> zrevrank zset3 two
zrangebyscore方法 返回指定socre的范圍的元素
>>> zrangebyscore zset3 2 3 withsocres
zcount 返回指定score的給定區(qū)間的數(shù)量
>>> zcount zset3 2 4
zcard方法 返回給點(diǎn)key的zset的所有元素個數(shù)
zremrangebyrank方法 刪除zset中排名在給定區(qū)間的元素
>>> zremrangebyrank zset3 1 1 //刪除zset3的根據(jù)下表排名的 索引1到1的元素
zremrangebyscore方法 刪除集合中的指定score的區(qū)間的元素
>>> zremrangebyscore方法 zset3 3 4
3、redis常用命令及高級應(yīng)用
鍵值相關(guān)命令
keys 返回滿足給定pattern的所有的key
>>> keys *
>>> keys r*
exists 確認(rèn)一個key是否存在 0不存在 1 存在
>>> exists name
>>> exists age
del ?刪除一個key ?1 成功?
>>> del age
expire 設(shè)置一個key的過期時間
ttl 獲取一個key的有效時長
>>> expire age 10
>>> ttl age
move 將當(dāng)前數(shù)據(jù)庫的key移轉(zhuǎn)到其他庫中
select ?選擇數(shù)據(jù)庫
>>> 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 隨機(jī)返回key空間的一個key
>>> randomkey
rename 重命名key
>>> rename set2 set_r_2
type 測試key返回值類型
>>> type set2
>>> type set_r_2
服務(wù)器相關(guān)命令
ping 測試鏈接是否存活 PONG存活 ?否則連接失敗
>>> ping
echo 在命令行打印一些內(nèi)容
select 選擇數(shù)據(jù)庫【redis數(shù)據(jù)庫編號從0~15】
quit 退出連接
dbsize 返回當(dāng)前數(shù)據(jù)庫中key的數(shù)目
>>> dbsize ?
>>> select 1
>>> dbsize
info 獲取redis服務(wù)器相關(guān)的信息
>>> info
config get 實(shí)時轉(zhuǎn)儲收到的請求 、返回相關(guān)配置的數(shù)據(jù)
>>> config get dir
>>> config get *
>>> config get timeout
flushdb 刪除當(dāng)前數(shù)據(jù)庫中的所有key
>>> dbsize
>>> flushdb
>>> dbsize
flushall 刪除所有數(shù)據(jù)庫的所有鍵
4、Redis高級應(yīng)用
安全性:
設(shè)置客戶端來年結(jié)婚進(jìn)行任何其他指定前需要使用的密碼,
警告:因為redis速度非常快,所以設(shè)置密碼要求很強(qiáng),否則1s中能允許15萬次的密碼嘗試
//在配置文件中配置requirepass 密碼
#requirepass foobared
requirepass beijing?
客戶端登錄后 auth 密碼;
登錄時候 redis-cli -a 密碼
主從復(fù)制:
主從復(fù)制允許多個slave server 擁有和master server相同的數(shù)據(jù)庫副本
redis主從復(fù)制特點(diǎn)
1)master可以用于多個slave【副服務(wù)器】
2)多個slave可以連接同一個master外,還可以鏈接到其他slave
3)主從復(fù)制不會阻塞master,在同步數(shù)據(jù)時,master可以繼續(xù)處理client請求
4)提高系統(tǒng)的伸縮擴(kuò)展性【原理:當(dāng)一個主機(jī)當(dāng)機(jī),其他另外一個slave立馬變成主機(jī)(依靠心跳感應(yīng))】
redis主從復(fù)制過程:
slave與master建立連接,發(fā)送sync同步命令
master啟動后臺進(jìn)程,將數(shù)據(jù)庫快照保存到文件中,同時master主進(jìn)程會開始手機(jī)新的寫命令并緩存
后臺完成保存后,將此文件發(fā)送給slave
slave將此文件保存到硬盤上
配置主從服務(wù)器
配置slave服務(wù)器很簡單,只需要在slave的配置文件加入以下配置
slaveof 192.168.1.1 6379 #指定master的ip和端口
masterauth beijing #這是主機(jī)密碼
事務(wù)處理:
支持事務(wù)比較簡單,redis織女呢個保證一個client發(fā)起的事務(wù)中的命令
可以連續(xù)只寫,而中間不會插入其他命令,
當(dāng)一個茨愣頭在一個連接中發(fā)出multi命令時,這個連接會進(jìn)入一個事務(wù)上下文,
該連接后續(xù)的命令不會立即執(zhí)行,而是先放到一個隊列中,
當(dāng)只寫exec命令時候,redis會順序只寫隊列中的所有命令
multi 打開事務(wù)上下文
discard 取消事務(wù),事務(wù)回滾
exec 執(zhí)行事務(wù)
>>> get age
>>> multi
>>> set age 10
>>> set age 20
>>> exec?
>>> getage
注意;當(dāng)執(zhí)行事務(wù)上下文的時候,假如事務(wù)隊列里面的命令有錯誤,執(zhí)行后會發(fā)現(xiàn)事務(wù)不能回滾。此為redis的事務(wù)處理很簡單
樂觀鎖:基于數(shù)據(jù)庫版本的提供一個version字段,記錄數(shù)據(jù)更新版本。
redis樂觀鎖 : 假如有一個age的key 打開2個session對age進(jìn)行賦值吵嘴哦,我們看一下結(jié)果如何
1) session 1
>>> get age
>>> watch age //監(jiān)控age是否修改
>>> multi
2)session 2
>>> set age 30
>>> get age
3) session 1 在開啟事務(wù)后
>>> set age 40
>>> exec
>>> get age
持久化機(jī)制:
Redis支持兩種持久化方式:
1、snapshotting(快照)也是默認(rèn)方式
2、Append-Only(縮寫aof)的方式
快照方式;
將內(nèi)存中的數(shù)據(jù)以快照的方式寫到二進(jìn)制文件。默認(rèn)文件名dump.rdb
可以通過配置設(shè)置自動做快照持久化的方式.
可以配置redis在n秒內(nèi)如果超過m個key被修改就自動做快照
save 900 1 #900秒內(nèi)如果超過1個key被修改,則發(fā)起快照保存
save 300 10 #300秒內(nèi)如果超過10個可以被修改,則發(fā)起快照保存
save 60 10000
Aof方式:
由于快照方式有一定的時間建個,aof比快照方式有更好的持久化性,
由于使用aof時候,redis會將每一個接受到的寫命令通過write函數(shù)追加到文件中,
當(dāng)redis重啟后后通過重新執(zhí)行文件中保存的寫命令來在內(nèi)存中重建整個數(shù)據(jù)庫內(nèi)容。
由于os會在內(nèi)核中write做的修改,所以不是立即寫到磁盤上,通過配置文件告訴redis
通過fsync函數(shù)強(qiáng)制os寫入磁盤的時機(jī)
appendonly yes //啟用aof持久化方式
#appendfsync always //收到寫命令立即寫入磁盤、最慢、但是保證完整的持久化
appendfsync everysec //每秒鐘寫入磁盤一次,在性能和持久化方面做了很好的折中
#appendfsync no //完全依賴os,性能最好,持久化沒保證
發(fā)布訂閱消息:
pub/sub是一種消息通信模式,主要目的解除消息發(fā)布者和消息訂閱者之間的耦合,
Redis作為pub/sub的server,在訂閱者和發(fā)布者之間起到消息路由的功能。
訂閱者可以通過subscribe和psubscribe命令項redis server訂閱自己感興趣的消息類型
Redis將消息類型稱為通道 channel,當(dāng)發(fā)布者通過publish命令向 redis Server 發(fā)送特定類型的信息時候,
該信息類型的全部client都會收到此消息。
虛擬內(nèi)存的使用:
Redis的虛擬內(nèi)存,將不經(jīng)常使用的數(shù)據(jù)從內(nèi)存交換到磁盤中。
配置 VM:
vm-enabled yes ? ? # 開啟VM功能
vm-swap-file ?/temp/redis.swap # 交換出來的value保存的文件路徑
vm-max-memory 1000000 # redis使用的最大內(nèi)存上限
vm-page-size 32 #每個頁面的大小32字節(jié)
vm-pages 134217728 #最高使用多少頁面
vm-max-threads 4 #用于執(zhí)行value對象換入換出的工作線程數(shù)量
轉(zhuǎn)載于:https://my.oschina.net/exit/blog/353021
總結(jié)
- 上一篇: 支付网关清算及退款流程
- 下一篇: android之实现各个组件点击事件处理