前言:
redis是一個key-value的存儲系統,value支持string、list、set、zset、hash五種類型,且支持數據的本地存儲
一、安裝redis
1、linux下安裝redis
前提:linux下需要安裝了make、gcc、tcl 8.5。
下載地址:http://download.redis.io/releases/redis-3.0.6.tar.gz
進入要安裝的位置,直接下載下來就,然后解壓,進行編譯即可。(我是在/opt下新建了一個目錄redis,然后下載到這個目錄里)
下載命令:wget http://download.redis.io/releases/redis-3.0.6.tar.gz
解壓命令:tar -zxvf redis-3.0.6.tar.gz
具體命令如下:
cd /opt
mkdir redis
cd redis
wget http://download.redis.io/releases/redis-3.0.6.tar.gz
tar -zxvf redis-3.0.6.tar.gz
cd redis-3.0.6
make
cd src
make install
如果遇到沒有安裝gcc或者tcl8.5的問題,可以參照下面兩篇博客,注:我用的是Ubuntu系統
2、mac下安裝redis
brew install redis
查看redis所在目錄:brew list redis
二、redis結構,配置redis
1.redis結構,redis的可執行文件有如下四個:
redis-server:redis服務器的daemon啟動程序,默認在前台啟動
redis-cli:redis命令行操作工具
redis-benchmark:redis性能測試工具
redis-stat:redis狀態監測工具(這個我裝的默認不帶這個工具,需要自己去單獨安裝)
2.redis啟動
2.1啟動redis-server (默認daemonize為no ,會在前台執行,可更改redis.conf文件來修改配置)
redis-server
2.2啟動redis-cli,啟動成功后可以進行命令行操作了
redis-cli
說明:redis-server默認是在前台啟動的,是根據配置文件redis.conf中的配置進行啟動的,這是要啟動redis-cli就需要再開一個終端進行操作,所以可以修改redis.conf的daemonize為yes
3.redis.conf配置文件
1.redis.conf文件位置
安裝redis的目錄下
2.redis.conf的主要配置項
- daemonize:是否以后台daemon方式運行
- pidfile:pid文件位置
- port:監聽的端口號
- timeout:請求超時時間
- loglevel:log信息級別
- logfile:log文件位置
- databases:開啟數據庫的數量
- save * *:保存快照的頻率,第一個*表示多長時間,第三個*表示執行多少次寫操作。在一定時間內執行一定數量的寫操作時,自動保存快照。可設置多個條件。
- rdbcompression:是否使用壓縮
- dbfilename:數據快照文件名(只是文件名,不包括目錄)
- dir:數據快照的保存目錄(這個是目錄)
- appendonly:是否開啟appendonlylog,開啟的話每次寫操作會記一條log,這會提高數據抗風險能力,但影響效率。
- appendfsync:appendonlylog如何同步到磁盤(三個選項,分別是每次寫都強制調用fsync、每秒啟用一次fsync、不調用fsync等待系統自己同步)
將daemonize參數改為yes,這樣就可以在后台運行server,而不用再開一個終端去執行./redis-cli了

修改配置文件后的server啟動命令:./redis-server ../redis.conf
說明:./redis-server(進入src目錄,執行當前目錄下的redis-server),然后使用上一目錄下的redis.confi配置文件啟動

也可以設置啟動腳本去啟動redis,這個可以自行去百度
三、redis.cli命令
啟動redis-server后,才可以啟動redis-cli
啟動命令:redis-cli
針對redis的命令:
(redis可以有多個數據庫,每個數據庫有索引編號,從0開始)
命令 | 意義 |
keys * | 查看redis下所有的key(*可以是一個正則表達式) |
exists key | redis下是否存在key |
type key | 獲得key的value的類型(string等) |
del key | 刪除key |
rename oldkey newkey | 將oldkey更名為newkey(如果newkey存在,則先將newkey刪除) |
dbsize | 返回redis下key的數量 |
select index | 切換數據庫(默認是0,如果切換1等后面會多一個【1】的標識) |
move key index | 將當前數據庫下的key移動到索引為index的數據庫下 |
flushdb | 刪除當前數據庫中的所有key |
flushall | 刪除所有數據庫中的key |
string類型的操作:
如果想刪除string類型的,就直接刪除key就可以了
操作 | 命令 | 例子 | 例子結果 |
增加或更改key,value | set key value | set key1 value1 | key1的值是value1 |
獲得key的值 | get key | get key1 | value1 |
批量返回多個key的value | mget key1 key2 | 同命令 | 獲得key1和key2的值 |
批量給多個key復制 | mset key1 value1 key2 value2 | 同命令 | 分別賦給key1、key2的value為value1、value2 |
給為數值的value+1 | incr key | key為1時,使用左側命令 | 2 |
給為數值的value增加n(n為數字) | incrby key n | key為2時,incry key 2 | 4 |
給為數值的value-1 | decr key | key為2時,使用左側命令 | 1 |
給為數值的value減去n(n為數字) | decrby key n | key為4時,decrby key 2 | 2 |
在string的value后追加內容 | append key value | key為abc時,append key de | key的value變為abcde |
獲得value的子串 | substr key start end | key為1234567,substr key 1 3 | 獲得key的子串234(子串索引從0開始計算) |
list類型的操作:
(list的索引是從0開始計算的)list底層用的是鏈表
操作 | 命令 | 例子 | 例子結果 |
向list型的value尾部增加一個值 | rpush key value1 value2 | rpush key1 abc | key1的尾部增加了一個子項“abc” |
向list型的value頭部增加一個值 | lpush key value1 value2 | lpush key1 123 | key1的頭部增加了一個子項“123” |
查詢list的長度 | llen key | key1有3個子項,llen key1 | 3 |
查詢key的值 | lrange key start end | key有3個子項“123”,“abc”,“cde” lrange key 0 -1 |
將全部子項都查詢出來了,也可以用0 2的區間等查詢部分結果 |
截取key的值,保留部分區間的值(索引) | ltrim key start end | ltrim key 0 1 | 只保留了key的0位和1位的值,截取了 |
獲得某個索引位置的值 | lindex key index | lindex key 1 | 獲得了索引為1位置的值 |
修改某索引位置的值 | lset key index value | lset key 1 abcdef | 將索引為1位置的值替換成了“abcdef” |
刪除key下的某一個value | lrem key count value | lrem key 1 value | 刪除count個值為value的數據,如果count為0,則所有為value的數據都刪除 |
刪除list值中的首元素 | lpop key | 同命令 | 第一個元素被刪除 |
刪除list值中的尾元素 | rpop key | 同命令 | 最后一個元素被刪除 |
刪除key1中的尾元素,並插到key2中頭部 | rpoplpush key1 key2 | 同命令 | key1的尾元素被刪除,並添加到了key2的頭元素位置 |
set類型的操作:
是一種集合,是無序的集合,沒有先后順序,可以進行交集、並集、差集等操作,set類型的元素不會出現重復元素,元素唯一。
操作 | 命令 | 例子 | 例子結果 |
增加或更改set的key,value | sadd key value1 value2 | sadd key1 1 2 3 | key1的值是1,2,3(可以寫多個值) |
返回set的所有元素 | smembers key | 同命令 | 返回key為key的所有元素 |
查詢set下是否存在某一個元素 | sismember key member | sismember key1 5 | 查詢key1下是否有5(返回的是1和0,1表示存在) |
刪除set中的一個member | srem key member | srem key1 5 | 刪除key1下為5的元素 |
隨機刪除set下的一個元素,並返回這個值 | spop key | 同命令 | 隨機刪除key下的一個元素 |
返回key下的元素個數 | scard key | 同命令 | 返回key為key的元素個數 |
從一個set下把某一元素移動到另一set下 | smove key2 key3 member | 同命令 | 將key2下的member移動到key3下 |
求多個set的交集 | sinter key1 key2 | 同命令 | 顯示key1和key2下的交集 |
將多個set的交集存儲到一個set下 | sinterstore key3 key1 key2 | 同命令 | 求key1和key2的交集並存儲到key3下 |
求多個set的並集 | sunion key1 key2 | 同命令 | 顯示key1和key2的並集 |
將多個set的並集存儲到一個set下 | sunionstore key3 key1 key2 | 同命令 | 求key1和key2的並集並存儲到key3下 |
求多個set的差集 | sdiff key1 key2 | 同命令 | 顯示key1和key2的差集 |
求多個set的差集存儲到一個set下 | sdiffstore key3 key1 key2 | 同命令 | 求key1和key2的差集並存儲到key3下 |
隨機返回set下的一個元素 | srandmember key | 同命令 | 隨機返回key下的一個元素 |
zset類型的操作:
有序集合,每個元素都關聯一個序號,元素去重。zset的命令都是以z開頭的。zset的value由score(序號)和值兩部分組成
操作 | 命令 | 例子 | 例子結果 |
增加zset的key和value | zadd key score member | zadd key 1 abc | 增加key下的序號為1的值為abc |
返回zset下某一member的index (元素按score從小到大排序) |
zrank key member | zrank key abc | 返回元素名為abc的索引(索引是從0開始計算的,所以比自己加的score少1) |
返回zset下某一member的index (元素按score從大到小排序) |
zrevrank key member | zrevrank key abc | 返回元素名為abc的索引(索引是從0開始計算的,所以比自己加的score少1) |
返回zset下某一區間的值 (元素按score從小到大排序0 |
zrange key start end | zset key 0 -1 | 返回zset下區間start到end的值(0 -1是全部) 元素從小到大排序 |
返回zset下某一區間的值 (元素按score從小到大排序) |
zrevrange key start end | zset key 0 -1 | 返回zset下區間start到end的值(0 -1是全部) 元素從小到大排序 |
刪除zset下的某一個member | zrem key member | 同命令 | 刪除key下的member |
返回zset某一元素的score | zscore key member | 同命令 | 返回key下元素member的score |
返回zset某一score區間的元素 | zrangebyscore key start end | zrangebyscore key 1 4 | 返回key下的score為1到4的元素 |
刪除zset某一score區間的元素 | zremrangebyscore key start end | zremrangebyscore key 1 2 | 刪除key下score區間為1到2的元素 |
zset還支持並集、交集、差集的計算,會根據最后的aggregate來決定score是sum還是min或max
hash類型的操作:
hash就是哈希,可以理解為map,一個key對value的類型。hash類型的數據組成key:{field:value}
hash的命令都是以h開頭的,后面跟着redis的key,再后面的參數與string類型的操作類似,可以將hash的field想象成string的key。
操作 | 命令 | 例子 | 例子結果 |
hash插入數據 | hset key field value | hset key1 age 20 | 在key1下增加了一個age:20的hash值 |
獲得hash中某一個field對應的value值 | hget key field | hget key age | 獲得key下的age的值 |
批量獲得hash的多個field對應的值 | hmget key field1 field2 | hmget key name age | 批量獲得key下的name和age的值 |
hash批量插入數據 | hmset key field1 value1 field2 value2 | hmset key name tom age 20 | 批量插入key的value,name:tom age:20 |
查看hash的某一個key下是否存在field | hexists key field | hexists key name | 查看key下是否存在field叫做name的項 |
返回hash的元素個數 | hlen key | 同命令 | 返回key的元素個數 |
根據field,刪除hash的某一個元素 | hdel key field | 同命令 | 刪除key下鍵為field的元素 |
顯示hash中所有的鍵及對應的值 | hgetall key | 同命令 | 顯示key下所有的鍵及對應的值(但是是分行顯示的) |
返回hash的所有元素的鍵 | hkeys key | 同命令 | 返回key下的所有元素的鍵(field) |
顯示hash中所有鍵對應的值 | hvals key | 同命令 | 返回key下的所有鍵對應的值,不包含鍵 |
將hash下某一鍵的值增加一定數值 | hincrby key field integer | hincrby key field 10 | 將key的field的值增加10(如果值是數值會直接加10; 如果不是數值,該鍵的值會直接變為100 |
其他:redis還有很多其他的命令,如果有需要可以再去百度一下。redis還支持持久化的本地存儲,和主從的搭建等。這些以后我有時間了會再補充一下。這篇就先暫時寫到這里了