一、Redis安裝
1:去官網(wǎng)下載最新的版本:http://redis.io/download
2:解壓后,進(jìn)入解壓好的文件夾
3:redis的安裝非常簡(jiǎn)單,因?yàn)橐呀?jīng)有現(xiàn)成的Makefile文件,所以直接先make,然后make install就
可以了
4:安裝的位置在/usr/local/bin ,有:
(1)redis-benchmark:性能測(cè)試工具,測(cè)試Redis在你的系統(tǒng)及配置下的讀寫性能
(2)redis-check-aof:用于修復(fù)出問(wèn)題的AOF文件
(3)redis-check-dump:用于修復(fù)出問(wèn)題的dump.rdb文件
(4)redis-cli:Redis命令行操作工具
(5)redis-sentinel:Redis集群的管理工具(哨兵機(jī)制實(shí)現(xiàn))
(6)redis-server:Redis服務(wù)器啟動(dòng)程序
5:?jiǎn)?dòng)Redis的時(shí)候,只有一個(gè)參數(shù),就是指定配置文件redis.conf的路徑。redis.conf在解壓的文
件夾里面有,復(fù)制一個(gè)出來(lái),按需修改即可,也可--port來(lái)指定端口
6:連接Redis并操作,使用redis-cli,如果有多個(gè)實(shí)例,可以redis-cli -h 服務(wù)器ip -p 端口
7:關(guān)閉Redis,redis-cli shutdown,如果有多個(gè)實(shí)例,可以指定端口來(lái)關(guān)閉:redis-cli -p 6379
shutdown
Redis的服務(wù)器程序采用的是單進(jìn)程模型來(lái)處理客戶端的請(qǐng)求。對(duì)讀寫等事件的響應(yīng)
是通過(guò)對(duì)epoll函數(shù)的包裝來(lái)做到的。
Redis的實(shí)際處理速度完全依靠主進(jìn)程的執(zhí)行效率,假如同時(shí)有多個(gè)客戶端并發(fā)訪問(wèn)
服務(wù)器,則服務(wù)器處理能力在一定情況下將會(huì)下降。假如你要提升服務(wù)器的并發(fā)能力,那
么可以采用在單臺(tái)機(jī)器部署多個(gè)redis進(jìn)程的方式。
二、Redis的數(shù)據(jù)存儲(chǔ)與結(jié)構(gòu)
Redis的數(shù)據(jù)庫(kù)簡(jiǎn)介:
1:Redis每個(gè)數(shù)據(jù)庫(kù)對(duì)外都是以從0開始遞增的數(shù)字來(lái)命名,默認(rèn)16個(gè)數(shù)據(jù)庫(kù),默認(rèn)使用0號(hào)數(shù)
? ? 據(jù)庫(kù),可以使用Select 數(shù)字來(lái)選擇要使用的數(shù)據(jù)庫(kù)
2:使用Dbsize可以查看當(dāng)前數(shù)據(jù)庫(kù)的key的數(shù)量
3:可以在多個(gè)數(shù)據(jù)庫(kù)間移動(dòng)數(shù)據(jù),使用move key 目的數(shù)據(jù)庫(kù)編號(hào) 就可以了
4:使用flushdb可以清除某個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)
5:Redis不支持自定義數(shù)據(jù)庫(kù)名字
6:Redis不支持為每個(gè)數(shù)據(jù)庫(kù)設(shè)置不同的訪問(wèn)密碼
7:多個(gè)數(shù)據(jù)庫(kù)之間并不是完全獨(dú)立的,F(xiàn)lushAll可以清空全部的數(shù)據(jù)
8:Redis的數(shù)據(jù)庫(kù)更像是一個(gè)命名空間
Redis的持久化方式:
Redis持久化分成兩種方式:RDB(Redis DataBase)和AOF(Append Only File)
1:RDB是在不同的時(shí)間點(diǎn),將Redis某一時(shí)刻的數(shù)據(jù)生成快照并存儲(chǔ)到磁盤上
2:AOF是只允許追加不允許改寫的文件,是將Redis執(zhí)行過(guò)的所有寫指令記錄下來(lái),在下次
Redis重新啟動(dòng)時(shí),只要把這些寫指令從前到后再重復(fù)執(zhí)行一遍,就可以實(shí)現(xiàn)數(shù)據(jù)恢復(fù)了
3:RDB和AOF兩種方式可以同時(shí)使用,在這種情況下,如果Redis重啟的話,則會(huì)優(yōu)先采用AOF
方式來(lái)進(jìn)行數(shù)據(jù)恢復(fù),這是因?yàn)锳OF方式的數(shù)據(jù)恢復(fù)完整度更高
4:可以關(guān)閉RDB和AOF,這樣的話,Redis將變成一個(gè)純內(nèi)存數(shù)據(jù)庫(kù),就像Memcache一樣
5:通過(guò)配置redis.conf中的appendonly為yes就可以打開AOF功能
RDB
RDB方式,Redis會(huì)單獨(dú)創(chuàng)建(fork)一個(gè)子進(jìn)程來(lái)進(jìn)行持久化,會(huì)先將數(shù)據(jù)寫入到
一個(gè)臨時(shí)文件中,待持久化過(guò)程都結(jié)束了,再用這個(gè)臨時(shí)文件替換上次持久化好的文件。
整個(gè)過(guò)程中,主進(jìn)程是不進(jìn)行任何IO操作的,這就確保了極高的性能
如果需要進(jìn)行大規(guī)模數(shù)據(jù)的恢復(fù),且對(duì)于數(shù)據(jù)恢復(fù)的完整性不是非常敏感,那RDB方
式要比AOF方式更加的高效。RDB的缺點(diǎn)是最后一次持久化后的數(shù)據(jù)可能丟失。
RDB的問(wèn)題
1:fork一個(gè)進(jìn)程時(shí),內(nèi)存的數(shù)據(jù)也被復(fù)制了,即內(nèi)存會(huì)是原來(lái)的兩倍
2:每次快照持久化都是將內(nèi)存數(shù)據(jù)完整寫入到磁盤一次,并不是增量的只同步臟數(shù)
據(jù)。如果數(shù)據(jù)量大的話,而且寫操作比較多,必然會(huì)引起大量的磁盤io操作,可
能會(huì)嚴(yán)重影響性能。
Redis的數(shù)據(jù)結(jié)構(gòu)
1:String:字符串,可以存儲(chǔ)String、Integer、Float型的數(shù)據(jù)?
2:List:字符串List,底層實(shí)現(xiàn)是鏈表(linkedList/zipList),增刪快,查找慢
3:Set:字符串Set,無(wú)序不可重復(fù),是通過(guò)HashTable實(shí)現(xiàn)的
4:Hash:按Hash方式來(lái)存放字符串,底層是HashTable/ZipList,數(shù)據(jù)量小使用ZipList
5:ZSet:字符串Set,有序且不可重復(fù),根據(jù)Score來(lái)排序。底層使用散列表和跳躍
? ? 表來(lái)實(shí)現(xiàn),所以讀取中間部分?jǐn)?shù)據(jù)也很快
三、Redis的常用命令
1:Keys:獲得符合規(guī)則的鍵名列表,格式是keys [pattern]? 支持glob風(fēng)格通配符格式:keys act*
(1)? 匹配一個(gè)字符
(2)* 匹配任意個(gè)字符
(3)[] 匹配中括號(hào)內(nèi)的任一字符,可以用-來(lái)表示一個(gè)范圍
(4)\x 匹配字符x,用于轉(zhuǎn)義符號(hào)
2:exists:判斷鍵值是否存在,格式是exists key
3:del:刪除key,格式是del key。
小技巧:Del命令不支持通配符,可以結(jié)合linux管道和xargs命令來(lái)自定義刪除,示例如下:redis-cli keys k* | xargs redis-cli del
4:type:獲得鍵值的數(shù)據(jù)類型,格式是type key
5:rename:改名,格式是rename oldKey newKey
6:renamenx:如果不存在則改名,格式是rename oldKey newKey
String類型的操作命令
1:get、set、del:獲取key的值、設(shè)置key和值、刪除key
2:incr、decr:遞增和遞減整數(shù)值,格式是incr key值
3:incrby、decrby:遞增和遞減整數(shù)值,可指定增減的數(shù)值,格式是incrby key值 正負(fù)數(shù)值
4:incrbyfloat:遞增和遞減浮點(diǎn)數(shù)值,格式是incrbyfloat key值 正負(fù)數(shù)值
5:append:在尾部追加值,格式是append key值 追加的值
6:getrange:獲取指定索引范圍內(nèi)的值,格式是getrange key值 起始索引 結(jié)束索引
7:setrange:從索引位置開始設(shè)置后面的值,格式是setrange key值 offset索引 值
8:strlen:返回鍵值的長(zhǎng)度,格式是strlen key值
9:mget:同時(shí)獲得多個(gè)鍵的值,格式是mget 多個(gè)key值
10:mset:同時(shí)設(shè)置多個(gè)鍵值對(duì),格式是mset key值 value , key和value可以多對(duì)
11:bitcount:獲取范圍內(nèi)為1的二進(jìn)制位數(shù),格式是bitcount key值 [start end]
12:getbit:獲取指定位置的二進(jìn)制位的值,格式是getbit key值 offset索引
13:setbit:設(shè)置指定位置的二進(jìn)制位的值,格式是setbit key值 offset索引 值
14:bitop:對(duì)多個(gè)二進(jìn)制值進(jìn)行位操作,格式是bitop 操作 目的key key值1 key值2,操作有and、or、xor、not,key值可以是多個(gè)
15:getset:原子的設(shè)置key的值,并返回key的舊值. 格式:getset key value
List類型的操作命令
1:lpush/rpush:將制定內(nèi)容添加到list 開頭/末尾 rpush key1 "last" 將last添加到列表末尾?
2:lrange:按索引范圍獲取值,格式是 lrange list的key 起始索引 終止索引,-1表示最后一個(gè)索引
3:lindex:獲取指定索引的值,格式是 lindex list的key 索引號(hào)
4:lpop/rpop:取出頭/尾部數(shù)據(jù)并刪除,格式是 lpop list的key
5:llen:獲取元素個(gè)數(shù),格式是llen list的key
6:lrem:刪除元素,格式是lrem list的key 數(shù)量 item項(xiàng)的值,數(shù)量可正負(fù),表示從左或右刪除
7:ltrim:保留指定索引區(qū)間的元素,格式是ltrim list的key 起始索引 結(jié)束索引
8:blpop/brpop:彈出值,格式是blpop list的key值 過(guò)期時(shí)間,key可以是多個(gè),如果沒(méi)有值,會(huì)一值等待有值,直到過(guò)期
對(duì)Set類型的操作命令
1:sadd:添加元素,格式是 sadd set的key item項(xiàng)的值,item項(xiàng)可以多個(gè)
2:smembers:獲取集合中所有元素,格式是 smembers set的key
3:sismember:判斷元素是否在集合眾,格式是 sismember set的key item項(xiàng)的值
4:srem:刪除元素,格式是 srem set的key item項(xiàng)的值
5:scard:獲取集合中元素個(gè)數(shù),格式是scard set的key
6:srandmember:隨機(jī)獲取集合中的元素,格式是srandmember set的key [數(shù)量],數(shù)量為正的時(shí)候,會(huì)隨機(jī)獲取這么多個(gè)不重復(fù)的元素;如果數(shù)量大于集合元素個(gè)數(shù),返回全部;如果數(shù)量為負(fù),會(huì)隨機(jī)獲得這么多個(gè)元素,可能有重復(fù)
7:spop:彈出元素,格式是spop set的key
8:smove:移動(dòng)元素,格式是smove 源set的key 目的set的key item項(xiàng)的值
9:sdiff:差集,返回在第一個(gè)set里面而不在后面任何一個(gè)set里面的項(xiàng),格式是sdiff set的key 用來(lái)比較的多個(gè)set的key
10:sdiffstore:差集并保留結(jié)果,格式是命令 存放結(jié)果的set的key set的key 用來(lái)比較的多個(gè)set的key
11:sinter:交集,返回多個(gè)set里面都有的項(xiàng),格式是sinter 多個(gè)set的key
12:sinterstore:交集并保留結(jié)果,格式是sinter 存放結(jié)果的set的key 多個(gè)set的key
13:sunion:并集,格式是sunion 多個(gè)set的key
14:sunionstore:并集并保留結(jié)果,格式是sunionstore 存放結(jié)果的set的key 多個(gè)set的key
Hash類型的操作命令
1:hset:設(shè)置值,格式是hset Hash的Key 項(xiàng)的key 項(xiàng)的值
2:hmset:同時(shí)設(shè)置多對(duì)值,格式是hmset Hash的Key 項(xiàng)的key 項(xiàng)的值,項(xiàng)的key和值可多對(duì)
3:hgetall:獲取該Key下所有的值,格式是hgetall Hash的Key
4:hget:獲取值,格式是hget Hash的Key 項(xiàng)的key
5:hmget:同時(shí)獲取多個(gè)值,格式是hmget Hash的Key 項(xiàng)的key,項(xiàng)的key可以是多個(gè)
6:hdel:刪除某個(gè)項(xiàng),格式是hdel Hash的Key 項(xiàng)的key
7:hlen:獲取Key里面的鍵值對(duì)數(shù)量,格式是hlen Hash的Key
8:hexists:判斷鍵值是否存在,格式是hexists Hash的Key 項(xiàng)的key
9:hkeys:獲取所有Item的key,格式是hkeys Hash的Key
10:hvals:獲取所有Item的值,格式是hvals Hash的Key
11:hincrby:增減整數(shù)數(shù)字,格式是hincrby Hash的Key 項(xiàng)的key 正負(fù)整數(shù)
12:hincrbyfloat:增減Float數(shù)值,格式是hincrbyfloat Hash的Key 項(xiàng)的key 正負(fù)float
13:hsetnx: 不存在則賦值,存在時(shí)什么都不做, 格式是hsetnx Hash的Key 項(xiàng)的key 項(xiàng)的值
ZSet類型的操作命令
1:zadd:添加元素,格式是zadd zset的key score值 項(xiàng)的值,Score和項(xiàng)可以是多對(duì),score可以是整數(shù),也可以是浮點(diǎn)數(shù),還可以是+inf表示正無(wú)窮大,-inf表示負(fù)無(wú)窮大
2:zrange:獲取索引區(qū)間內(nèi)的元素,格式是zrange zset的key 起始索引 終止索引 (withscores)
3:zrangebyscore:獲取分?jǐn)?shù)區(qū)間內(nèi)的元素,格式是zrangebyscore zset的key 起始score 終止score(withscores),默認(rèn)是包含端點(diǎn)值的,如果加上“(”表示不包含;后面還可以加上limit來(lái)限制
4:zrem:刪除元素,格式是zrem zset的key 項(xiàng)的值,項(xiàng)的值可以是多個(gè)
5:zcard:獲取集合中元素個(gè)數(shù),格式是zcard zset的key
6:zincrby:增減元素的Score,格式是zincrby zset的key 正負(fù)數(shù)字 項(xiàng)的值
7:zcount:獲取分?jǐn)?shù)區(qū)間內(nèi)元素個(gè)數(shù),格式是zcount zset的key 起始score 終止score
8:zrank:獲取項(xiàng)在zset中的索引,格式是zrank zset的key 項(xiàng)的值
9:zscore:獲取元素的分?jǐn)?shù),格式是zscore zset的key 項(xiàng)的值,返回項(xiàng)在zset中的score
10:zrevrank:獲取項(xiàng)在zset中倒序的索引,格式是zrevrank zset的key 項(xiàng)的值
11:zrevrange:獲取索引區(qū)間內(nèi)的元素,格式是zrevrange zset的key 起始索引 終止索引 (withscores)
12:zrevrangebyscore:獲取分?jǐn)?shù)區(qū)間內(nèi)的元素,格式是zrevrangebyscore zset的key 終止score 起始score (withscores)
13:zremrangebyrank:刪除索引區(qū)間內(nèi)的元素,格式是zremrangebyrank zset的key 起始索引 終止索引
14:zremrangebyscore:刪除分?jǐn)?shù)區(qū)間內(nèi)的元素,格式是命令 zset的key 起始score 終止score
15:zinterstore:交集,格式是ZINTERSTORE dest-key key-count key [key ...] [WEIGHTS weight
[weight ...]] [AGGREGATE SUM|MIN|MAX]
16:zunionstore:并集,格式是ZUNIONSTORE dest-key key-count key [key ...] [WEIGHTS weight[weight ...]] [AGGREGATE SUM|MIN|MAX]
處理過(guò)期keys的命令
1:expire:設(shè)置過(guò)期時(shí)間,格式是expire key值 秒數(shù)
2:expireat:設(shè)置過(guò)期時(shí)間,格式是expireat key值 到秒的時(shí)間戳
3:ttl:查看還有多少秒過(guò)期,格式是ttl key值,-1表示永不過(guò)期,-2表示已過(guò)期
4:persist:設(shè)置成永不過(guò)期,格式是persist key值,刪除key的過(guò)期設(shè)置;另外使用set或
? ? 者getset命令為鍵賦值的時(shí)候,也會(huì)清除鍵的過(guò)期時(shí)間
5:pttl:查看還有多少毫秒過(guò)期,格式是pttl key值
6:pexpire:設(shè)置過(guò)期時(shí)間,格式是pexpire key值 毫秒數(shù)
7:pexpireat:設(shè)置過(guò)期時(shí)間,格式是pexpireat key值 到毫秒的時(shí)間戳
四、Redis數(shù)據(jù)結(jié)構(gòu)的應(yīng)用場(chǎng)景
最簡(jiǎn)單的 String ,可以作為 Memcached 替代品,用作緩存系統(tǒng)
使用 SetNx 可以實(shí)現(xiàn)簡(jiǎn)單的分布式鎖
使用 list 的 Pop Push 功能可以作為阻塞隊(duì)列/非阻塞隊(duì)列
使用 SUBSCRIBE PUBLISH 可以實(shí)現(xiàn)發(fā)布/訂閱模型
對(duì)數(shù)據(jù)進(jìn)行實(shí)時(shí)分析,如可以累加統(tǒng)計(jì)等
使用 Set 做去重的計(jì)數(shù)統(tǒng)計(jì)
使用 SortedSet 可以做排行榜等排序場(chǎng)景
使用 getbit setbit bitcount 做大數(shù)據(jù)量的去重統(tǒng)計(jì),在允許誤差的情況下可使用HyperLogLog
使用 GEO 可以實(shí)現(xiàn)位置定位、附近的人