21.9 redis介紹mysql
21.10 redis安裝linux
21.11 redis持久化nginx
21.12 redis數據類型redis
21.9 redis介紹sql
1.Redis和Memcached相似,也屬於k-v數據存儲數據庫
功能也比memcachd要多。也支持在磁盤中存儲,就保證了數據有必定的安全性vim
2.Redis官網redis.io, 當前最新穩定版4.0.1安全
3.支持更多value類型,除了和string外,還支持hash、lists(鏈表)、sets(集合)和sorted sets(有序集合)app
4.redis使用了兩種文件格式(也叫持久化):全量數據(RDB)和增量請求(aof)。(就是咱們把數據存在磁盤裏,以上兩種格式)memcached
全量數據格式是把內存中的數據寫入磁盤,便於下次讀取文件進行加載。
就是K是什麼,V是什麼
增量請求文件則是把內存中的數據序列化爲操做請求,用於讀取文件進行replay獲得數據,這種相似於mysql binlog。
這是格式隨着使用的愈來愈長,容量也原來越大。能夠按期的作一些優化,由於隨着時間的過時,以前存儲的也就成垃圾文件了,他不會主動的清理
5.redis的存儲分爲內存存儲、磁盤存儲和log文件三部分
內存存儲相似於memcached,好比存一個K一個V,他就是存在內存裏的。
磁盤存儲就是RDB
log文件就是AOF
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21.10 redis安裝
1.下載最新穩定版
cd /usr/local/src/
wget http://download.redis.io/releases/redis-4.0.1.tar.gz
2.cd redis-4.0.1
3.make && make install
比較特殊,不須要./config那一步
4.cp redis.conf /etc/redis.conf
5.vim /etc/redis.conf //修改以下配置
daemonize yes #啓動的時候讓他在後臺運行
logfile "/var/log/redis.log" #定義日誌
dir /data/redis_data/ #定義dir
appendonly yes #打開appenonly
6.mkdir /data/redis_data
7.sysctl vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled
#這兩條加在 /etc/rc.local 裏,讓他一啓動就會執行這兩條
8.redis-server /etc/redis.conf #啓動
實例:
cd /usr/local/src/
wget http://download.redis.io/releases/redis-4.0.1.tar.gz
ls
tar zxf redis-4.0.1.tar.gz
ls
cd redis-4.0.1/
make
echo $?
make install
echo $?
[root@axinlinux-01 redis-4.0.1]# redis- #兩下tab會出來他的命令,出現一下就證實成功了
redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server
[root@axinlinux-01 redis-4.0.1]# which "redis-cli" #redis不像nginx等,能夠指定安裝路徑,他被安裝到了這個路徑下
/usr/local/bin/redis-cli
[root@axinlinux-01 redis-4.0.1]# cp redis.conf /etc/ #拷貝配置文件
# bind 192.168.1.100 10.0.0.1 #這是告訴你設置他的監聽IP,能夠寫多個,用空格分割
# bind 127.0.0.1 ::1
protected-mode yes #這裏是保護的模式,已經打開
port 6379 #這是監聽的端口
daemonize no(改成yes) #這裏的daemonize要改成yes!!啓動的時候不讓他在前臺啓動,啓動的時候咱們能夠去作其餘的事情,終端不會被佔用
pidfile /var/run/redis_6379.pid #這裏是pid文件,啓動完了以後確定要有這個pid的文件。默認就好
logfile ""(指定爲"/var/log/redis.log") #日誌的文件,要給他定義一下!!
databases 16 #Redis存在庫的概念,默認有16個庫,從0開始
save 900 1 #這裏是用來設置RDB的持久化的。下面會有介紹
save 300 10
save 60 10000
rdbcompression yes #是否要壓縮RDB的文件
dbfilename dump.rdb #他的文件的名字,RDB叫什麼
dir ./(改成/data/redis) #這裏的dir是RDB的文件把它放到哪裏去。包括AOF文件也會放到這裏!!
slave-read-only yes #這裏的slave是配置主從的時候用到的參數
appendonly no #這裏是用來開啓AOF日誌的。要改成yes!!改成yes就會在上面定義dir目錄裏成成一個appendonly.aof的文件
appendfilename "appendonly.aof" #在這定義aof文件的名字。默認就好
# appendfsync always
appendfsync everysec #這個是他何時去記錄日誌。everysec就表明每一秒記錄一下。也能夠爲上面的always,就是每一次有新的變動或增長了一個數據,那麼若是是always都會去記錄一條日誌,無論時間
timeout指的是設置客戶端鏈接時的超時時間,單位爲秒。當客戶端在這段時間內沒有發出任何指令,那麼關閉該鏈接
[root@axinlinux-01 redis-4.0.1]# mkdir /data/redis #建立dir目錄
[root@axinlinux-01 redis-4.0.1]# vim /etc/rc.local #如下兩條加在這個文件裏,一啓動就會執行這兩條
sysctl vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21.11 redis持久化
1.Redis提供了兩種持久化的方式,分別是RDB(Redis DataBase)和AOF(Append Only File)
若是把這兩種持久化所有關閉,redis就像memcached同樣,只存儲在內存裏。可是一旦重啓數據將會消失,因此必定要作一個持久化
2.RDB,簡而言之,就是在不一樣的時間點,將redis存儲的數據生成快照並存儲到磁盤等介質上。
RDB也就是把內存裏的數據鏡像一份到磁盤上,至於何時存到磁盤上,是:
vim /etc/redis.conf,這面這三個參數肯定的,三個知足任何一個就會存到磁盤上
# save "" #若是關閉持久化,把這行打開。下面三行註釋掉
save 900 1 #900秒發生了一次更改
save 300 10 #300秒發生了10次更改
save 60 10000 #60秒發生了10000次更改
以上,更改的意思是好比我增長一個K或更改了一個K或刪除了一個K。保持默認便可
3.AOF,則是換了一個角度來實現持久化,那就是將redis執行過的全部寫指令記錄下來,在下次redis從新啓動時,只要把這些寫指令從前到後再重複執行一遍,就能夠實現數據恢復了。
vim /etc/redis.conf 。根據下面三個參數控制寫入磁盤的時間
# appendfsync always #每次寫都記錄
appendfsync everysec #一秒寫入磁盤一次,更高效。建議選擇這個
# appendfsync no #根據系統的頻率寫入
AOF隨之時間愈來愈長,將會愈來愈大。能夠按期將過時的K刪除
4.其實RDB和AOF兩種方式也能夠同時使用,在這種狀況下,若是redis重啓的話,則會優先採用AOF方式來進行數據恢復,這是由於AOF方式的數據恢復完整度更高。
5.若是你沒有數據持久化的需求,也徹底能夠關閉RDB和AOF方式,這樣的話,redis將變成一個純內存數據庫,就像memcache同樣。
Redis持久化相關參數
1.save 900 1 #表示每15分鐘且至少有1個key改變,就觸發一次持久化
2.save 300 10 #表示每5分鐘且至少有10個key改變,就觸發一次持久化
3.save 60 10000 #表示每60秒至少有10000個key改變,就觸發一次持久
4.save 「」 #這樣能夠禁用rdb持久化
5.appendonly yes #若是是yes,則開啓aof持久化
6.appendfilename 「appendonly.aof」 # 指定aof文件名字
7.appendfsync everysec #指定fsync()調用模式,有三種no(不調用fsync),always(每次寫都會調用fsync),everysec(每秒鐘調用一次fsync)。第一種最快,第二種數據最安全,但性能會差一些,第三種爲這種方案,默認爲第三種。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21.12 redis數據類型
redis數據類型一共有五種
1.第一種類型string
string爲最簡單的類型,與Memcached同樣的類型,一個key對應一個value,其支持的操做與Memcached的操做相似,它的功能更豐富。設置能夠存二進制的對象。
示例:
# redis-cli
127.0.0.1:6379> set mykey "aminglinux.com"OK
127.0.0.1:6379> get mykey"aminglinux.com"
127.0.0.1:6379> mset key1 1 key2 a key3 c
127.0.0.1:6379> mget key1 key2 key3
1) "1"
2) "a"
3) "c"
2.第二種類型list
list是一個鏈表結構,主要功能是push、pop、獲取一個範圍的全部值等等。操做中key理解爲鏈表的名字。
使用 list 結構,咱們能夠輕鬆地實現最新消息排行等功能(好比新浪微博的 TimeLine )。list 的另外一個應用就是消息隊列,能夠利用 list 的 push操做,將任務存在 list 中,而後工做線程再用pop操做將任務取出進行執行。
示例:
# redis-cli
127.0.0.1:6379> LPUSH list1 "aminglinux"127.0.0.1:6379> LPUSH list1 "1 2 3"127.0.0.1:6379> LPUSH list1 "aaa bbb「
127.0.0.1:6379> LRANGE list1 0 -1
1) "aaa bbb"
2) "1 2 3"
3) "aminglinux「
127.0.0.1:6379> LPOP list1
3.第三種類型set
set是集合,和咱們數學中的集合概念類似,對集合的操做有添加刪除元素,有對多個集合求交併差等操做。操做中key理解爲集合的名字。好比在微博應用中,能夠將一個用戶全部的關注人存在一個集合中,將其全部粉絲存在一個集合。由於 Redis 很是人性化的爲集合提供了求交集、並集、差集等操做,那麼就能夠很是方便的實現如共同關注、共同喜愛、二度好友等功能,對上面的全部集合操做,你還可使用不一樣的命令選擇將結果返回給客戶端仍是存集到一個新的集合中。
能夠求出交集,把共同的集合存儲到另外一個新的集合當中
set示例
127.0.0.1:6379> SADD set1 a
127.0.0.1:6379> SADD set1 b
127.0.0.1:6379> SADD set1 c
127.0.0.1:6379> SADD set1 d
127.0.0.1:6379> SMEMBERS set1
1) "d"
2) "b"
3) "a"
4) "c"
127.0.0.1:6379> SREM set1 c//刪除元素
127.0.0.1:6379> SADD set2 a 2 b
127.0.0.1:6379> SINTER set1 set2 //交集
127.0.0.1:6379> SUNION set1 set2 //並集
127.0.0.1:6379> SDIFF set1 set2 //差集
4.第四種類型sort set
sorted set是有序集合,它比set多了一個權重參數score,使得集合中的元素可以按 score 進行有序排列,好比一個存儲全班同窗成績的 Sorted Sets,其集合 value 能夠是同窗的學號,而 score 就能夠是其考試得分,這樣在數據插入集合的時候,就已經進行了自然的排序。
127.0.0.1:6379> ZADD set3 12 abc127.0.0.1:6379> ZADD set3 2 "cde 123"127.0.0.1:6379> ZADD set3 24 "123-aaa"127.0.0.1:6379> ZADD set3 4 "a123a"127.0.0.1:6379> ZRANGE set3 0 -1
1) "cde 123"
2) "a123a"
3) "abc"
4) "123-aaa"
倒序
127.0.0.1:6379> ZREVRANGE set3 0 -1
1) "123-aaa"
2) "abc"
3) "a123a"
4) "cde 123"
5.第五種類型hash
1.在 Memcached 中,咱們常常將一些結構化的信息打包成 hashmap,在客戶端序列化後存儲爲一個字符串的值(通常是 JSON 格式),好比用戶的暱稱、年齡、性別、積分等。
可理解爲多個string的集合
2.示例
127.0.0.1:6379> hset hash1 name aming127.0.0.1:6379> hget hash1 name"aming"127.0.0.1:6379> hset hash1 age 30127.0.0.1:6379> hget hash1 age "30"
127.0.0.1:6379> hgetall hash11) "name"2) "aming"3) "age"4) "30"
實例:
1.
[root@axinlinux-01 ~]# redis-server /etc/redis.conf
[root@axinlinux-01 ~]# redis-cli
127.0.0.1:6379> set mykey "123" #寫一個string類型的數據。tab鍵能夠補全
OK
127.0.0.1:6379> get mykey
"123"
127.0.0.1:6379> mset key1 1 key2 2 key3 c #使用mset能夠同時寫多個數據
OK
127.0.0.1:6379> mget key1 mykey #mget能夠同時看多個KEY
1) "1"
2) "123"
2.
127.0.0.1:6379> LPUSH list1 "aminglinux" #lpush推動去數據,格式是這樣寫的
(integer) 1
127.0.0.1:6379> LPUSH list1 "axinlinux" #能夠推多個
(integer) 2
127.0.0.1:6379> LPUSH list1 "123"
(integer) 3
127.0.0.1:6379> LRANGE list1 0 -1 #lrange能夠查看這個list1。0表示開頭,-1表示結尾,也就是表明查看的時候是從開始到結尾的數據
1) "123"
2) "axinlinux"
3) "aminglinux" #最早推動去的是排在最後一個的
127.0.0.1:6379> lpop list1 #lpop把list1的數據取出來,取出來的是123,也就是最後lpush的那個數據
"123"
127.0.0.1:6379> LRANGE list1 0 -1 #再次查看就會發現,取出的那個數據就沒有了
1) "axinlinux"
2) "aminglinux"
3.
127.0.0.1:6379> sadd set1 a #sadd寫入一個集
(integer) 1
127.0.0.1:6379> SADD set1 b
(integer) 1
127.0.0.1:6379> sadd set1 c
(integer) 1
127.0.0.1:6379> SADD set1 d
(integer) 1
127.0.0.1:6379> SMEMBERS set1 #查看這個集
1) "b"
2) "a"
3) "d"
4) "c"
127.0.0.1:6379> sadd set2 a #在寫入第二個集
(integer) 1
127.0.0.1:6379> sadd set2 b
(integer) 1
127.0.0.1:6379> sadd set2 1
(integer) 1
127.0.0.1:6379> sadd set2 2
(integer) 1
127.0.0.1:6379> SINTER set1 set2 #求交集
1) "b"
2) "a"
127.0.0.1:6379> SUNION set1 set2 #求並集
1) "c"
2) "a"
3) "1"
4) "b"
5) "d"
6) "2"
127.0.0.1:6379> SDIFF set1 set2 #求差集
1) "d"
2) "c"
4.
127.0.0.1:6379> ZADD set3 12 abc #有序集合中,zadd爲寫入數據
(integer) 1
127.0.0.1:6379> ZADD set3 24 "123 abc" #能夠寫多個,用雙引號引發來
(integer) 1
127.0.0.1:6379> ZADD set3 2 "123-abc"
(integer) 1
127.0.0.1:6379> ZADD set3 66 "1234 abc"
(integer) 1
127.0.0.1:6379> ZRANGE set3 0 -1 #zrange爲升序排列
1) "123-abc" #會發現以score值得大小,升序排列。小的在上面依次排列
2) "abc"
3) "123 abc"
4) "1234 abc"
127.0.0.1:6379> ZREVRANGE set3 0 -1 #zrevrange爲倒序排列
1) "1234 abc" #以score值得大小,倒序排列。大的在上面
2) "123 abc"
3) "abc"
4) "123-abc"
5.
127.0.0.1:6379> HSET hash1 name axin #hset爲寫入一個數據
(integer) 1
127.0.0.1:6379> HSET hash1 age 28
(integer) 1
127.0.0.1:6379> HSET hash1 job it
(integer) 1
127.0.0.1:6379> hget hash1 name #hget爲查看
"axin"
127.0.0.1:6379> HGET hash1 age
"28"
127.0.0.1:6379> HGET hash1 job
"it"
127.0.0.1:6379> HGETALL hash1 #hgetall爲查看所有
1) "name" #奇數爲KEY
2) "axin" #偶數爲VALUE
3) "age"
4) "28"
5) "job"
6) "it"