Redis基礎(chǔ)

什么是Redis

Redis 是完全開源免費(fèi)的,遵守BSD協(xié)議,是一個(gè)高性能的key-value數(shù)據(jù)庫
Redis 與其他 key - value 緩存產(chǎn)品有以下三個(gè)特點(diǎn):

  • Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用
  • Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲
  • Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份

Redis 優(yōu)勢

  • 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s
  • 豐富的數(shù)據(jù)類型 – Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功執(zhí)行要么失敗完全不執(zhí)行。單個(gè)操作是原子性的。多個(gè)操作也支持事務(wù),即原子性,通過MULTI和EXEC指令包起來
  • 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性

Redis連接

遠(yuǎn)程連接redis客戶端: redis-cli -h host -p port -a password
設(shè)置redis密碼 config set requirepass password

命令 描述
auth password 驗(yàn)證密碼是否正確
echo message 打印字符串
ping 查看服務(wù)是否運(yùn)行
quit 關(guān)閉當(dāng)前連接
select index 切換到指定的數(shù)據(jù)庫

Redis keys 命令

命令 描述
del key 在key存在時(shí)刪除key
dump key 用于序列化給定 key ,并返回被序列化的值
exists key 檢測key是否存在 存在則返回1不存在則返回0
expire key seconds 為給定 key 設(shè)置過期時(shí)間
expireat key timestamp 左右和expirel類似,不同 的是expireat設(shè)置的參數(shù)是時(shí)間戳
pexpire key milliseconds 為給定 key 設(shè)置過期時(shí)間 設(shè)置的參數(shù)是毫秒
pexpireat key milliseconds-timestamp 設(shè)置 key 過期時(shí)間的時(shí)間戳(unix timestamp) 以毫秒計(jì)
key pattern 用于查找所有符合給定模式 pattern 的 key
move key db 將當(dāng)前數(shù)據(jù)庫的key轉(zhuǎn)移到另一個(gè)數(shù)據(jù)庫
persist key 移除 key 的過期時(shí)間,key 將持久保持
ttl key 以秒為單位,返回給定 key 的剩余生存時(shí)間
pttl 以毫秒為單位返回 key 的剩余的過期時(shí)間
randomkey 從當(dāng)前數(shù)據(jù)庫中隨機(jī)返回一個(gè) key
rename key newkey 修改 key 的名稱
renamenx key newkey 僅當(dāng) newkey 不存在時(shí),將 key 改名為 newkey
type key 返回key值的數(shù)據(jù)類型

Redis 字符串(String)

命令 描述
set key value 設(shè)置指定 key 的值
get key 獲取對應(yīng)key的值
getrange key start end 獲取key指定偏移量的值
getset key value 設(shè)定指定key的值并返回該key之前的值
setnx key value 僅當(dāng)key不存在時(shí)設(shè)置其值
setex key second value 設(shè)置key的值和過期時(shí)間
setrange key offset value 將key的值從偏移量為offset的位置覆蓋為value
strlen key 返回指定key值的長度
mset [key value...] 設(shè)置一個(gè)或多個(gè) key-value 對
msetnx [key value...] 同時(shí)設(shè)置一個(gè)或多個(gè) key-value 對,當(dāng)且僅當(dāng)所有給定 key 都不存在
incr key 將key的數(shù)值自增1
incrby key increment 將 key 所儲存的值加上給定的增量值(increment)
incrbyfloat key increment 將 key 所儲存的值加上給定的浮點(diǎn)增量值(increment)
decr key 將key值自減1
decrby key increment key 所儲存的值減去給定的減量值(decrement)
append key value 如果 key 已經(jīng)存在并且是一個(gè)字符串, APPEND 命令將 指定value 追加到改 key 原來的值(value)的末尾

Redis 哈希(Hash)

Redis hash 是一個(gè)string類型的field和value的映射表,hash特別適合用于存儲對象
Redis 中每個(gè) hash 可以存儲 232 - 1 鍵值對(40多億)

命令 描述
hset key field value 為哈希表中的字段賦值
hget key filed 返回哈希表指定字段的值
hgetall 返回哈希表中,所有的字段和值
hexists key field 查看哈希表 key 中,指定的字段是否存在
hdel key [field...] 刪除指定哈希表指定字段
hincrby key field increment 為哈希表 key 中的指定字段的整數(shù)值加上增量 increment
hincrbyfloat key field increment 為哈希表 key 中的指定字段的浮點(diǎn)數(shù)值加上增量 increment
hkeys key 返回哈希表所有字段
hlen key 返回哈希表字段的數(shù)量
hmget key [field...] 獲取哈希表多個(gè)字段的值
hmset key[key value...] 同時(shí)設(shè)置哈希表多個(gè)字段值
hsetnx key [key value...] 僅當(dāng)哈希表字段不存在值設(shè)置多個(gè)字段值
hvals key 返回哈希表所有值

Redis 列表(List)

Redis列表是簡單的字符串列表,按照插入順序排序。你可以添加一個(gè)元素到列表的頭部(左邊)或者尾部(右邊)
一個(gè)列表最多可以包含 232 - 1 個(gè)元素 (4294967295, 每個(gè)列表超過40億個(gè)元素)

命令 描述
lpush key [value...] 將一個(gè)或多個(gè)值插入到列表頭部
lpushx key [value...] 將一個(gè)值插入到已存在的列表頭部
lrange key start end 回列表中指定區(qū)間內(nèi)的元素,區(qū)間以偏移量 START 和 END 指定
llen key 返回列表長度
lpop key 移出并獲取列表的第一個(gè)元素
lrem key count value 根據(jù)參數(shù) COUNT 的值,移除列表中與參數(shù) VALUE 相等的元素
lset key index value 通過索引來設(shè)置元素的值
ltrim key start end 對一個(gè)列表進(jìn)行修剪(trim),就是說,讓列表只保留指定區(qū)間內(nèi)的元素,不在指定區(qū)間之內(nèi)的元素都將被刪除
lindex key 通過索引獲取列表中的元素
linsert key before or after private value 在指定元素的前或者后面插入元素
blpop key timeout 移出并獲取列表的第一個(gè)元素, 如果列表沒有元素會阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止
brpop key timeout 移出并獲取列表的最后一個(gè)元素, 如果列表沒有元素會阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止
brpoplpush source destination timeout 從列表中彈出一個(gè)值,將彈出的元素插入到另外一個(gè)列表中并返回它; 如果列表沒有元素會阻塞列表直到等待超時(shí)或發(fā)現(xiàn)可彈出元素為止
rpush key value 在列表中添加一個(gè)或多個(gè)值(尾部)
rpop 移除并獲取列表最后一個(gè)元素
rpoplpush source destination 移除列表的最后一個(gè)元素,并將該元素添加到另一個(gè)列表并返回
rpushx key value 為已存在的列表添加值

Redis 集合(Set)

Redis 的 Set 是 String 類型的無序集合。集合成員是唯一的,這就意味著集合中不能出現(xiàn)重復(fù)的數(shù)據(jù)。
Redis 中集合是通過哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是 O(1)
集合中最大的成員數(shù)為 232 - 1 (4294967295, 每個(gè)集合可存儲40多億個(gè)成員)

命令 描述
sadd key [value...] 將一個(gè)或多個(gè)成員元素加入到集合中,已經(jīng)存在于集合的成員元素將被忽略
scard key 獲取集合的成員數(shù)
sdiff key1[key2] 返回給定所有集合的差集
sdiffstore destination key1[key2] 返回給定所有集合的差集并存儲在 destination 中
sinter key1[key2] 返回給定所有集合的交集
sinterstore destination key1[key2] 返回給定所有集合的交集并存儲在 destination 中
sismember key value 判斷 member 元素是否是集合 key 的成員
smembers key 返回集合中的所有成員
smove source destination value 將 member 元素從 source 集合移動到 destination 集合
spop key 移除并返回集合中的一個(gè)隨機(jī)元素
srandmember key [count] 返回集合中一個(gè)或多個(gè)隨機(jī)數(shù)
screm key [value...] 移除集合中一個(gè)或多個(gè)成員
sunion key1[key2] 返回所有給定集合的并集
sunionstore destination key1[key2] 所有給定集合的并集存儲在 destination 集合中
SSCAN key cursor [MATCH pattern] 迭代集合中的元素

Redis 有序集合(sorted set)

Redis 有序集合和集合一樣也是string類型元素的集合,且不允許重復(fù)的成員。
不同的是每個(gè)元素都會關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù)。redis正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序。
有序集合的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)。
集合是通過哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是O(1)。 集合中最大的成員數(shù)為 232 - 1 (4294967295, 每個(gè)集合可存儲40多億個(gè)成員)

命令 描述
zadd key score1 member1[score2 member2] 向有序集合添加一個(gè)或多個(gè)成員,或者更新已存在成員的分?jǐn)?shù)
zscard key 獲取有序集合的成員數(shù)
zcount key min max 計(jì)算在有序集合中指定區(qū)間分?jǐn)?shù)的成員數(shù)
zincrby key increment member 有序集合中對指定成員的分?jǐn)?shù)加上增量 increment

Redis 發(fā)布訂閱

Redis 發(fā)布訂閱(pub/sub)是一種消息通信模式:發(fā)送者(pub)發(fā)送消息,訂閱者(sub)接收消息。
Redis 客戶端可以訂閱任意數(shù)量的頻道。
下圖展示了頻道 channel1 , 以及訂閱這個(gè)頻道的三個(gè)客戶端 —— client2 、 client5 和 client1 之間的關(guān)系:


image.png

當(dāng)有新消息通過 PUBLISH 命令發(fā)送給頻道 channel1 時(shí), 這個(gè)消息就會被發(fā)送給訂閱它的三個(gè)客戶端:


image.png
命令 描述
PSUBSCRIBE pattern [pattern ...] 訂閱一個(gè)或多個(gè)符合給定模式的頻道。
PUBSUB subcommand [argument [argument ...]] 查看訂閱與發(fā)布系統(tǒng)狀態(tài)。
PUBLISH channel message 將信息發(fā)送到指定的頻道
PUNSUBSCRIBE [pattern [pattern ...]] 退訂所有給定模式的頻道
[SUBSCRIBE channel [channel ...] 訂閱給定的一個(gè)或多個(gè)頻道的信息
UNSUBSCRIBE [channel [channel ...]] 指退訂給定的頻道

Redis 事務(wù)

Redis 事務(wù)可以一次執(zhí)行多個(gè)命令, 并且?guī)в幸韵聝蓚€(gè)重要的保證:

  • 批量操作在發(fā)送 EXEC 命令前被放入隊(duì)列緩存
  • 收到 EXEC 命令后進(jìn)入事務(wù)執(zhí)行,事務(wù)中任意命令執(zhí)行失敗,其余的命令依然被執(zhí)行
  • 在事務(wù)執(zhí)行過程,其他客戶端提交的命令請求不會插入到事務(wù)執(zhí)行命令序列中

一個(gè)事務(wù)從開始到執(zhí)行會經(jīng)歷以下三個(gè)階段:

  • 開始事務(wù)
  • 命令入隊(duì)
  • 執(zhí)行事務(wù)
命令 描述
multi 開啟事物
exec 提交事物
discard 取消事物
watch [key...] 監(jiān)視一個(gè)(或多個(gè)) key ,如果在事務(wù)執(zhí)行之前這個(gè)(或這些) key 被其他命令所改動,那么事務(wù)將被打斷
unwatch 取消 WATCH 命令對所有 key 的監(jiān)視
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 超強(qiáng)、超詳細(xì)Redis入門教程 轉(zhuǎn)載2017年03月04日 16:20:02 16916 轉(zhuǎn)載自: http://...
    邵云濤閱讀 17,638評論 3 313
  • 【本教程目錄】 1.redis是什么2.redis的作者3.誰在使用redis4.學(xué)會安裝redis5.學(xué)會啟動r...
    徐猿猿閱讀 1,923評論 0 35
  • 概念 Redis是一個(gè)開源的使用C語言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value內(nèi)存數(shù)據(jù)庫,...
    jiangmo閱讀 726評論 0 3
  • 重點(diǎn)參考鏈接: http://www.cnblogs.com/wangyuyu/p/3786236.html Re...
    Kevin_Junbaozi閱讀 2,268評論 0 21
  • 《童言童語(一)》 1 兒子指著桌子上的抽紙問我:“媽媽,紙是什么東西做的?” 我答:“是木頭,大樹?!?他質(zhì)疑:...
    米蘇聞閱讀 598評論 3 3

友情鏈接更多精彩內(nèi)容