1. 簡介
Redis 全稱:Remote Dictionary Server(遠程字典服務(wù)器),是一款開源的,遵守 BSD 協(xié)議,使用 C 語言開發(fā)的 key-value 存儲系統(tǒng)。簡單的說,它是一款跨平臺的非關(guān)系型數(shù)據(jù)庫,支持優(yōu)先內(nèi)存存儲,并提供多種語言的 API 客戶端
雖然開源軟件市場上也有很多優(yōu)秀的緩存服務(wù)中間件,比如 Memcache,但是和 Redis 對比起來,Redis 還是顯得格外的突出,優(yōu)勢如下:
- 性能極高:Redis 能讀的速度是 110000 次/s,寫的速度是 81000次/s
- 數(shù)據(jù)類型豐富:支持 String,Hash,List,Set,Sorted Set 等數(shù)據(jù)類型的操作
- 支持原子性操作:Redis 的每條命令操作都是原子性的,Redis 的操作之所以是原子性的,是因為每條命令的執(zhí)行都是單線程的,不存在線程競爭問題
- 存儲方式多樣化:memecache 把數(shù)據(jù)全部存在內(nèi)存之中,斷電后會掛掉;redis 支持數(shù)據(jù)的持久化,同時也支持數(shù)據(jù)的備份,即 master-slave 模式的數(shù)據(jù)備份
- 功能豐富:Redis 還支持 publish/subscribe,通知,key 過期等等特性
在分布式的架構(gòu)環(huán)境下,Redis 基本上是缺一不可的緩存中間件,它能很好的解決服務(wù)與服務(wù)之間數(shù)據(jù)共享的問題,并且性能不受影響
2. 服務(wù)安裝
因為 Redis 目前官方只支持 LINUX 系統(tǒng),因此沒有 Windows 版本的軟件包,但是好在微軟團隊維護了開源的 windows 版本,雖然更新不算及時,但是對于普通測試使用足夠了。
Redis Windows 版下載地址
windows 版安裝教程
3. Redis 的常用操作命令
3.1 公共命令
// 1.客戶端連接 redis
redis-cli -h localhost -p 6379
// 2.切換數(shù)據(jù)庫
select 3
// 3.查看 DB 大小
DBSIZE
// 4.查看 DB 中所有的 key
keys *
// 5.清空當(dāng)前數(shù)據(jù)庫
flushdb
// 6. 清空全部數(shù)據(jù)庫內(nèi)容
flushdb
3.2 Key 的命令
keys * # 查看所有的 key
exists key # 判斷某個 key 是否存在
move key 1 # 移除某個 key 1 表示當(dāng)前數(shù)據(jù)庫
expire key 10 # 給 key 設(shè)置過期時間(10s)
persist key # 移除 key 的過期時間
ttl key # 查看 key 的過期時間(s)
type key # 查看 key 對應(yīng)的 value 的類型
3.3 String 命令
set key value # 給 key 設(shè)置 value
get key # 獲取 key 對應(yīng)的 value
exists key # 判斷key 是否存在
append key value # 如果 key 存在,則追加;否則,相當(dāng)于 set 命令
strlen key
incr key # 自增 1
decr key # 自減
incrby key step # 設(shè)置步長
decrby key step
getrange key startIndex stopIndex # 截取字符串(下標從0開始)
setrange key index value # 將索引對應(yīng)的值替換成value
setex key time value # 設(shè)置key為value,并且設(shè)置過期時間time(s)
setnx key value # 如果 key 不存在,就設(shè)置
mset k1 v1 k2 v2 # 批量設(shè)置
mget k1 k2 # 批量獲取
msetnx # 批量設(shè)置(原子操作)
getset key value # 先 get,再 set
String 的應(yīng)用場景:
- 計數(shù)器
- 統(tǒng)計數(shù)量
- 粉絲數(shù)
- 對象緩存
3.4 List 命令
lpush list value1 [value2] # 將一個值(或多個值)添加到 list 的頭部(左)
lpop list # 移除 list 頭部的值(左)
lrange list lIndex rIndex # 獲取 list 中的某個范圍的值
lindex list index # 通過下標獲取值(左)
llen list # 獲取 list 的長度
lrem list count value # 移除 list 中 count 個 value
ltrim list lIndex rIndex # 通過下標返回部分 list
rpoplpush list list2 # 移除 list 中最后一個元素,并將它添加到 list2 中去
exists list # 判斷 list 是否存在
lset list index value # 將 list 中下標為 index 的值修改為 value
linsert list before|after pivot value # 往 list 中在某個元素 pivot 之前|后插入value
?
rpush list value # 將一個值(或多個值)添加到 list 的尾部(右)
rpop list # 移除 list 尾部的值(右)
list 實際上是一個鏈表:before Node after,left、right 都可以插值
兩邊插入或修改,效率最高
消息隊列(lpush、rpop)、棧(lpush、lpop)
3.5 Set 命令
sadd set value1 [value2] # 給 set 設(shè)置值
smembers set # 查看 set 中的成員
sismember set value # 查看 set 中是否有 value
scard set # 獲取 set 中元素的個數(shù)
srem set value # 移除 set 中指定的 value
srandmember set count # 隨機抽選出 count 個元素
spop set # 隨機刪除 set 中的元素
sdiff set1 set2 # 返回 set1、set2 的差集
sinter set1 set2 # 返回 set1、set2 的交集(共同好友)
sunion set1 set2 # 返回 set1、set2 的并集
3.6 Hash 命令
hset hash key value # 設(shè)置 hash 的一個 key-value
hget hash key # 根據(jù) hash 的一個 key,獲取 value
hmset hash key1 value1 key2 value2 # 設(shè)置 hash 的多個 key-value
hmget hash key1 key2 # 根據(jù)多個 key 來獲取多個 value
hgetall hash # 獲取所有的 key-value
hdel hash key # 刪除 hash 中指定的 key
hlen hash # 獲取 hash 的長度(有多少個 key-value)
exists hash key # 判斷 hash 中某個 key 是否存在
hkeys hash # 只獲取 hash 中的所有的 key
hvals hash # 只獲取 hash 中的所有的 value
hincrby hash key count # 給 hash 中的 key 加 count
hsexnx hash key value # 如果 key 存在,則,可以設(shè)置;如果不存在,則,不可以設(shè)置
hash 用來存儲經(jīng)常變更的數(shù)據(jù):user (name、age)
hash 更加適合對象的存儲,string 更加適合字符串的存儲
3.7 ZSet 命令
zadd zset score value # 添加一個值
zrangebyscore zset -inf +inf # 顯示全部數(shù)據(jù)(負無窮-正無窮)
zrangebyscore zset -inf +inf withsocres # 顯示全部數(shù)據(jù)并且附帶 score
zrange zset 0 -1 withsocres # 顯示所有成員及其 score 值
zrange zset 0 -1 # 顯示全部(正序)
zrevrange zset 0 -1 # 顯示全部(倒序)
zrem zset value # 移除某個 value
zcard zset # 返回 zset 中的元素個數(shù)
zcount zset value1 value2 # 獲取指定成員之間的數(shù)量
zrank zset value # 返回有序集中指定成員的排名(從小到大)
zset 應(yīng)用于帶權(quán)重的,如:排行榜。
3.8 事務(wù)操作
Redis 也支持事務(wù)操作,Redis 事務(wù)可以一次執(zhí)行多個命令, 并且?guī)в幸韵氯齻€重要的保證:
- 批量操作在發(fā)送 EXEC 命令前被放入隊列緩存
- 收到 EXEC 命令后進入事務(wù)執(zhí)行,事務(wù)中任意命令執(zhí)行失敗,其余的命令依然被執(zhí)行
- 在事務(wù)執(zhí)行過程,其他客戶端提交的命令請求不會插入到事務(wù)執(zhí)行命令序列中
一個事務(wù)從開始到執(zhí)行會經(jīng)歷以下三個階段:
- 開始事務(wù):MULTI
- 命令入隊:QUEUE
- 執(zhí)行/丟棄事務(wù):EXEC 或者 DISCARD
以某個事務(wù)操作為例:我們先以 MULTI 開始一個事務(wù), 然后將多個命令入隊到事務(wù)中, 最后由 EXEC 命令觸發(fā)事務(wù), 一并執(zhí)行事務(wù)中的所有命令。過程如下:
特別注意的地方是:單個 Redis 命令的執(zhí)行是原子性的,但 Redis 沒有在事務(wù)上增加任何維持原子性的機制,所以 Redis 事務(wù)的執(zhí)行并不是原子性的
事務(wù)可以理解為一個打包的批量執(zhí)行腳本,但批量指令并非原子化的操作,中間某條指令的失敗不會導(dǎo)致前面已做指令的回滾,也不會造成后續(xù)的指令不做。
3.9 Lua 腳本操作
在上面我們也介紹到了,Redis 事務(wù)的執(zhí)行并不能完全保證原子性,那么如何將一批命令操作做到原子性操作呢?
==Redis 支持通過 Lua 腳本來實現(xiàn)一批命令原子性操作,==執(zhí)行腳本的常用命令為 EVAL
。
Eval 命令的基本語法如下:
EVAL script numkeys key [key ...] arg [arg ...]
參數(shù)含義:
- script:Lua 5.1版本的腳本,這個腳本并不需要定義一個 Lua 函數(shù)或者說是不應(yīng)該這樣做。它可以僅僅是一個 Lua 語法,這個語法運行在 Redis 服務(wù)器上下文
- numkeys:Redis鍵的數(shù)量,Lua采用基于數(shù)組形式(KEYS全局變量)訪問這些參數(shù)(KEYS[1]、KEYS[2] …)
- arg:不代表redis鍵,它們可以通過ARGV全部變量定義的數(shù)組訪問,與KEYS數(shù)組設(shè)置類似,形式為 ARGV[1]、ARGV[2] …
如:
EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second
lua 腳本中調(diào)用 redis 命令
案例1:
給指定的 key 設(shè)置指定值 value,并且設(shè)置過期時間 60 秒,實現(xiàn)原子性操作,如果操作成功就返回 1,否則返回 0
EVAL "if redis.call('setnx', KEYS[1], ARGV[1]) == 1 then return redis.call('expire', KEYS[1], ARGV[2]) else return 0 end" 1 key1 hello 60
案例2:
獲取指定 key 的值,如果存在就刪除 key,實現(xiàn)原子性操作,如果操作成功就返回 1,否則返回 0文章來源:http://www.zghlxwxcb.cn/news/detail-658250.html
EVAL "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) else return 0 end" 1 key1 hello
4. 可視化客戶端
對于開發(fā)者來說,使用客戶端命令來操作 redis 非常不便捷,因此誕生了很多的基于 redis 的可視化客戶端。如下:文章來源地址http://www.zghlxwxcb.cn/news/detail-658250.html
- Redis Desktop Manager 下載地址
- medis2(mac 系統(tǒng))下載地址
- AnotherRedisDesktopManager Gitee 下載地址 | Github 下載地址
- Redis Insight 下載地址
- QuickRedis Gitee 下載地址 | Github 下載地址
到了這里,關(guān)于【Redis】Redis 的學(xué)習(xí)教程(一)入門基礎(chǔ)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!