天天看點

2-1 redis資料類型

redis單機安裝

上傳至 /data

tar xzf redis-xxx.tar.gz

mv redis-xxx redis

安裝:

yum -y install gcc automake autoconf libtool make

cd redis

make

環境變量:

vim /etc/profile

export PATH=/data/redis/src:$PATH

source /etc/profile

啟動:

redis-server &

配置檔案:(需要關注的參數)

vim redis.conf

daemonize yes #開啟背景運作模式

port 6379 #端口号

bind ip #綁定指定ip

logfile /data/redis-log/redis.log #指定日志生成路徑和檔案名字

dir /data/6379 #指定應用持久化路徑

dbfilename dump.rdb #預設的持久化檔案名字,根據運作路徑決定它的位置。也可以寫絕對路徑指定。

requirepass 123456 #開啟密碼驗證,生産建議複雜密碼。

redis 登入方式

redis-cli -p 6379 -a root123 # 使用密碼端口登入指令
redis-cli         # 無密碼端口登入指令
redis-cli -h hostip -p port -a password  # 在遠端登入redis      

redis持久化---------(就是把記憶體資料儲存到磁盤)

Redis 的資料全部在記憶體裡,如果突然當機,資料就會全部丢失,是以必須有一種機制來保證 Redis 的資料不會因為故障而丢失,這種機制就是 Redis 的持久化機制。

Redis 的持久化機制有兩種,

第一種是RDB快照,

第二種是 AOF 日志。

快照是一次全量備份,AOF 日志是連續的增量備份。快照是記憶體資料的二進制序列化形式,在存儲上非常緊湊,而 AOF 日志記錄的是記憶體資料修改的指令記錄文本。

》》》》》》》》詳見總結類1

redis的資料類型:

介紹

String : 字元類型

Hash: 字典類型

List: 清單

Set: 集合

Sorted set: 有序集合

基本操作

KEYS * keys a keys a* 檢視已存在所有鍵的名字 ​

TYPE 傳回鍵所存儲值的類型 ​

EXPIRE\ PEXPIRE xx 10 以秒\毫秒設定xx的生存時間 ***

TTL\ PTTL xx 以秒\毫秒為機關檢視xx還剩下的生存時間 ***

PERSIST 取消生存時間設定 ***

DEL 删除一個key

EXISTS 檢查 鍵 是否存在 0---不存在 1---存在

RENAME 變更KEY名

SET 建立一個鍵值對

GET 鍵 檢視 某一個鍵 對應的值

【注意】

keys * ------檢視所有鍵 (相當于全表掃描 生産中不要使用)

用scan指令來代替

可以在 redis.conf 中禁用 某些指令

重命名指令名為空

rename-command keys ""

Strings-----------------字元類型

應用場景

session 共享

正常計數:微網誌數,粉絲數,訂閱、禮物

key:value

set name zhangsan

MSET id 101 name zhangsan age 20 gender m

等價于以下操作:

SET id 101

set name zhangsan

set age 20

set gender m

計數器----incr decr incrby decrby

incr key -------從1開始 執行一次 加一

incrby key 200 --------給key 加200

decr key ----------執行一次 key 值 減一

decrby key 200 ------執行一次 key值 減200

增删改查

set mykey "test" 為鍵設定新值,并覆寫原有值

getset mycounter 0 設定值,取值同時進行

setex mykey 10 "hello" 設定指定 Key 的過期時間為10秒,在存活時間可以擷取value

setnx mykey "hello" 若該鍵存在,則為鍵設定新值

mset key3 "zyx" key4 "xyz" 批量設定鍵

del mykey 删除已有鍵

append mykey "hello" 若該鍵并不存在,傳回目前 Value 的長度

該鍵已經存在,傳回追加後 Value的長度

incr mykey 值增加1,若該key不存在,建立key,初始值設為0,增加後結果為

decrby mykey 5 值減少5

setrange mykey 20 dd 把第21位鍵值,替換為dd, 超過value長度,自動補位數

get

scan

keys

exists mykey 判斷該鍵是否存在,存在傳回 1,否則傳回0

get mykey 擷取Key對應的value

strlen mykey 擷取指定 Key 的字元長度

ttl mykey 檢視一下指定 Key 的剩餘存活時間(秒數)

getrange mykey 1 20 擷取第2到第20個位元組,若20超過value長度,則截取第2個和後面所有的

mget key3 key4 批量擷取鍵

hash類型

應用場景:

存儲部分變更的資料,如使用者資訊等。

最接近mysql表結構的一種類型

主要是可以做資料庫緩存。

存資料:

hmset stu id 101 name zhangsan age 20 gender m

hmset stu1 id 102 name zhangsan1 age 21 gender f

取資料:

HMGET stu id name age gender

HMGET stu1 id name age gender

hset myhash field1 "s"

若字段field1不存在,建立該鍵及與其關聯的Hashes, Hashes中,key為field1 ,并設value為s ,若存在會覆寫原value

hsetnx myhash field1 s

若字段field1不存在,建立該鍵及與其關聯的Hashes, Hashes中,key為field1 ,并設value為s, 若字段field1存在,則無效

hmset myhash field1 "hello" field2 "world 一次性設定多個字段

hdel myhash field1 删除 myhash 鍵中字段名為 field1 的字段

del myhash 删除鍵

hincrby myhash field 1 給field的值加1

hget myhash field1 擷取鍵值為 myhash,字段為 field1 的值

hlen myhash 擷取myhash鍵的字段數量

hexists myhash field1 判斷 myhash 鍵中是否存在字段名為 field1 的字段

hmget myhash field1 field2 field3 一次性擷取多個字段

hgetall myhash 傳回 myhash 鍵的所有字段及其值

hkeys myhash 擷取myhash 鍵中所有字段的名字

hvals myhash 擷取 myhash 鍵中所有字段的值

LIST(清單)

應用場景

消息隊列系統

比如sina微網誌

在Redis中我們的最新微網誌ID使用了常駐緩存,這是一直更新的。

但是做了限制不能超過5000個ID,是以擷取ID的函數會一直詢問Redis。

隻有在start/count參數超出了這個範圍的時候,才需要去通路資料庫。

系統不會像傳統方式那樣“重新整理”緩存,Redis執行個體中的資訊永遠是一緻的。

SQL資料庫(或是硬碟上的其他類型資料庫)隻是在使用者需要擷取“很遠”的資料時才會被觸發,

而首頁或第一個評論頁是不會麻煩到硬碟上的資料庫了。

微信朋友圈:

127.0.0.1:6379> LPUSH wechat "today is nice day !"

127.0.0.1:6379> LPUSH wechat "today is bad day !"

127.0.0.1:6379> LPUSH wechat "today is good day !"

127.0.0.1:6379> LPUSH wechat "today is rainy day !"

127.0.0.1:6379> LPUSH wechat "today is friday !"

127.0.0.1:6379> lrange wechat 0 0

\1) "today is friday !"

127.0.0.1:6379> lrange wechat 0 1

\1) "today is friday !"

\2) "today is rainy day !"

127.0.0.1:6379> lrange wechat 0 2

\1) "today is friday !"

\2) "today is rainy day !"

\3) "today is good day !"

127.0.0.1:6379> lrange wechat 0 3

127.0.0.1:6379> lrange wechat -2 -1

\1) "today is bad day !"

\2) "today is nice day !"

【注意】 負 表示 倒數 -2 -1 表示倒數第2 到 倒數第一

lpush mykey a b 若key不存在,建立該鍵及與其關聯的List,依次插入a ,b, 若List類型的key存在,則插入value中

lpushx mykey2 e 若key不存在,此指令無效, 若key存在,則插入value中

linsert mykey before a a1 在 a 的前面插入新元素 a1

linsert mykey after e e2 在e 的後面插入新元素 e2

rpush mykey a b 在連結清單尾部先插入b,在插入a

rpushx mykey e 若key存在,在尾部插入e, 若key不存在,則無效

rpoplpush mykey mykey2 将mykey的尾部元素彈出,再插入到mykey2 的頭部(原子性的操作)

del mykey 删除已有鍵

lrem mykey 2 a 從頭部開始找,按先後順序,值為a的元素,删除數量為2個,若存在第3個,則不删除

ltrim mykey 0 2 從頭開始,索引為0,1,2的3個元素,其餘全部删除

lset mykey 1 e 從頭開始, 将索引為1的元素值,設定為新值 e,若索引越界,則傳回錯誤資訊

rpoplpush mykey mykey 将 mykey 中的尾部元素移到其頭部

lrange mykey 0 -1 取連結清單中的全部元素,其中0表示第一個元素,-1表示最後一個元素。

lrange mykey 0 2 從頭開始,取索引為0,1,2的元素

lrange mykey 0 0 從頭開始,取第一個元素,從第0個開始,到第0個結束

lpop mykey 擷取頭部元素,并且彈出頭部元素,出棧

lindex mykey 6 從頭開始,擷取索引為6的元素 若下标越界,則傳回nil

集合 set

案例:在微網誌應用中,可以将一個使用者所有的關注人存在一個集合中,将其所有粉絲存在一個集合。

Redis還為集合提供了求交集、并集、差集等操作,可以非常友善的實作如共同關注、共同喜好、二度好友等功能,

對上面的所有集合操作,你還可以使用不同的指令選擇将結果傳回給用戶端還是存集到一個新的集合中。

127.0.0.1:6379> sadd lxl pg1 jnl baoqiang gsy alexsb

(integer) 5

127.0.0.1:6379> sadd jnl baoqiang ms bbh yf wxg

(integer) 5

127.0.0.1:6379> SUNION lxl jnl

\1) "gsy"

\2) "yf"

\3) "alexsb"

\4) "bbh"

\5) "jnl"

\6) "pg1"

\7) "baoqiang"

\8) "ms"

\9) "wxg"

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379> SINTER lxl jnl

\1) "baoqiang"

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379> SDIFF jnl lxl----------Jnl中有但是lxl中沒有的

\1) "wxg"

\2) "yf"

\3) "bbh"

\4) "ms"

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379>

127.0.0.1:6379> SDIFF lxl jnl-----------------誰在前面就是以誰為基準求差集(前面有但是後面沒有的)

\1) "jnl"

\2) "pg1"

\3) "gsy"

\4) "alexsb"

sadd myset a b c

smove myset myset2 a 将a從 myset 移到 myset2,

sismember myset a 判斷 a 是否已經存在,傳回值為 1 表示存在。

smembers myset 檢視set中的内容

scard myset 擷取Set 集合中元素的數量

srandmember myset 随機的傳回某一成員

sdiff myset1 myset2 myset3 1和2得到一個結果,拿這個集合和3比較,獲得每個獨有的值

sdiffstore diffkey myset myset2 myset3 3個集和比較,擷取獨有的元素,并存入diffkey 關聯的Set中

sinter myset myset2 myset3 獲得3個集合中都有的元素

sinterstore interkey myset myset2 myset3 把交集存入interkey 關聯的Set中

sunion myset myset2 myset3 擷取3個集合中的成員的并集

sunionstore unionkey myset myset2 myset3 把并集存入unionkey 關聯的Set中

SortedSet(有序集合)

應用場景:

排行榜應用,取TOP N操作

這個需求與上面需求的不同之處在于,前面操作以時間為權重,這個是以某個條件為權重,比如按頂的次數排序,

每次隻需要執行一條ZADD指令即可。

127.0.0.1:6379> zadd topN 0 smlt 0 fskl 0 fshkl 0 lzlsfs 0 wdhbx 0 wxg

(integer) 6

127.0.0.1:6379> ZINCRBY topN 100000 smlt

"100000"

127.0.0.1:6379> ZINCRBY topN 10000 fskl

"10000"

127.0.0.1:6379> ZINCRBY topN 1000000 fshkl

"1000000"

127.0.0.1:6379> ZINCRBY topN 100 lzlsfs

"100"

127.0.0.1:6379> ZINCRBY topN 10 wdhbx

"10"

127.0.0.1:6379> ZINCRBY topN 100000000 wxg

"100000000"

127.0.0.1:6379> ZREVRANGE topN 0 2

\1) "wxg"

\2) "fshkl"

\3) "smlt"

127.0.0.1:6379> ZREVRANGE topN 0 2 withscores

\1) "wxg"

\2) "100000000"

\3) "fshkl"

\4) "1000000"

\5) "smlt"

\6) "100000"

127.0.0.1:6379>

zadd myzset 2 "two" 3 "three" 添加兩個分數分别是 2 和 3 的兩個成員

zrem myzset one two 删除多個成員變量,傳回删除的數量

zincrby myzset 2 one 将成員 one 的分數增加 2,并傳回該成員更新後的分數

zrange myzset 0 -1 WITHSCORES 傳回所有成員和分數,不加WITHSCORES,隻傳回成員

zrank myzset one 擷取成員one在Sorted-Set中的位置索引值。0表示第一個位置

zcard myzset 擷取 myzset 鍵中成員的數量

zcount myzset 1 2 擷取分數滿足表達式 1 <= score <= 2 的成員的數量

zscore myzset three 擷取成員 three 的分數

zrangebyscore myzset 1 2 擷取分數滿足表達式 1 < score <= 2 的成員

#-inf 表示第一個成員,+inf最後一個成員

#limit限制關鍵字

#2 3 是索引号

zrangebyscore myzset -inf +inf limit 2 3 傳回索引是2和3的成員

zremrangebyscore myzset 1 2 删除分數 1<= score <= 2 的成員,并傳回實際删除的數量

zremrangebyrank myzset 0 1 删除位置索引滿足表達式 0 <= rank <= 1 的成員

zrevrange myzset 0 -1 WITHSCORES 按位置索引從高到低,擷取所有成員和分數

#原始成員:位置索引從小到大

one 0

two 1

#執行順序:把索引反轉

位置索引:從大到小

one 1

two 0

#輸出結果: two

one

zrevrange myzset 1 3 擷取位置索引,為1,2,3的成員

#相反的順序:從高到低的順序

zrevrangebyscore myzset 3 0 擷取分數 3>=score>=0的成員并以相反的順序輸出

zrevrangebyscore myzset 4 0 limit 1 2 擷取索引是1和2的成員,并反轉位置索引

釋出訂閱

PUBLISH channel msg

将資訊 message 發送到指定的頻道 channel

SUBSCRIBE channel [channel ...]

訂閱頻道,可以同時訂閱多個頻道

UNSUBSCRIBE [channel ...]

取消訂閱指定的頻道, 如果不指定頻道,則會取消訂閱所有頻道

PSUBSCRIBE pattern [pattern ...]

訂閱一個或多個符合給定模式的頻道,每個模式以 * 作為比對符,比如 it* 比對所 有以 it 開頭的頻道( it.news 、 it.blog 、 it.tweets 等等), news.* 比對所有 以 news. 開頭的頻道( news.it 、 news.global.today 等等),諸如此類

PUNSUBSCRIBE [pattern [pattern ...]]

退訂指定的規則, 如果沒有參數則會退訂所有規則

PUBSUB subcommand [argument [argument ...]]

檢視訂閱與釋出系統狀态

注意:使用釋出訂閱模式實作的消息隊列,當有用戶端訂閱channel後隻能收到後續釋出到該頻道的消息,之前發送的不會緩存,必須Provider和Consumer同時線上。

釋出訂閱例子:

視窗1:

127.0.0.1:6379> SUBSCRIBE baodi

視窗2:

127.0.0.1:6379> PUBLISH baodi "jin tian zhen kaixin!"

訂閱多頻道:

視窗1:

繼續閱讀