21.09 Redis介紹 mysql
Redis和Memcached相似,也屬於k-v數據存儲redis
Redis官網redis.io, 當前最新穩定版4.0.1sql
支持更多value類型,除了和string外,還支持hash、lists(鏈表)、sets(集合)和sorted sets(有序集合)數據庫
redis使用了兩種文件格式:全量數據(RDB)和增量請求(aof)。vim
全量數據格式是把內存中的數據寫入磁盤,便於下次讀取文件進行加載。安全
增量請求文件則是把內存中的數據序列化爲操做請求,用於讀取文件進行replay獲得數據,這種相似於mysql binlog。bash
redis的存儲分爲內存存儲、磁盤存儲和log文件三部分 服務器
21.10 Redis 安裝 app
cd /usr/local/src/ wget http://download.redis.io/releases/redis-4.0.1.tar.gz tar zxvf redis-4.0.1.tar.gz cd redis-4.0.1 make && make install cp redis.conf /etc/redis.conf vim /etc/redis.conf #修改以下配置
#把ide
daemonize no
#改爲
daemonize yes
#no前臺啓動,yes後臺啓動
logfile "/var/log/redis.log" #定義日誌文件 dir /data/redis/ #redis文件存放路徑 appendonly yes #開啓aof,aof名字:apendonly.aof mkdir /data/redis
兩項內核參數,不必修改時保持默認
在rc.local添加此兩項參數,開啓時能夠啓動
sysctl vm.overcommit_memory=1 echo never > /sys/kernel/mm/transparent_hugepage/enabled
啓動Redis服務
redis-server /etc/redis.conf
檢查進程
ps uax |grep redis root 12428 0.0 0.1 145252 2168 ? Ssl 17:37 0:00 redis-server 127.0.0.1:6379 root 12457 0.0 0.0 112660 968 pts/0 R+ 17:38 0:00 grep --color=auto redis
21.11 Redis持久化
前言:數據存放在內存裏,不管是讀和寫都是很是快的,可是若是重啓服務器或者重啓服務,數據都會所以丟失。因此,數據較爲重要的話,須要實施數據持久化。
Redis提供了兩種持久化的方式,分別是RDB(Redis DataBase)和AOF(Append Only File)
RDB,簡而言之,就是在不一樣的時間點,將redis存儲的數據生成快照並存儲到磁盤等介質上。#簡單來講,就是把內存的數據作一個鏡像,而後完整映射存儲到磁盤上面。
存儲方式是經過redis.conf的save參數來定義存儲方式。
example,
# save ""
save 900 1
save 300 10
save 60 10000
知足這3個條件則會觸發持久化存儲
若是把持久化關閉,則把save參數條件都deleted,而後把#save "" 註釋去掉,改爲這樣
save ""
AOF,則是換了一個角度來實現持久化,那就是將redis執行過的全部寫指令記錄下來,在下次redis從新啓動時,只要把這些寫指令從前到後再重複執行一遍,就能夠實現數據恢復了。#數據隨着操做時間的增加而增加。
其實RDB和AOF兩種方式也能夠同時使用,在這種狀況下,若是redis重啓的話,則會優先採用AOF方式來進行數據恢復,這是由於AOF方式的數據恢復完整度更高。
AOF有三種方式
appendfsync always#一直寫,每次變動就寫
appendfsync everysec #每秒寫
appendfsync no#每隔一段時間寫,最不安全的
若是你沒有數據持久化的需求,也徹底能夠關閉RDB和AOF方式,這樣的話,redis將變成一個純內存數據庫,就像memcache同樣。
二者對比,AOF保存比較存儲比較安全。
21.12 Redis數據類型
Redis數據類型-string
string爲最簡單的類型,與Memcached同樣的類型,一個key對應一個value,其支持的操做與Memcached的操做相似,它的功能更豐富。設置能夠存二進制的對象。
示例:
# redis-cli #鏈接redis的命令,redis通用入口命令
set設置單個key-value
get單個值
127.0.0.1:6379> set key1 10 OK 127.0.0.1:6379> get key1 "10" #mset設置多個key-value #mget多個值 127.0.0.1:6379> mset key2 20 key3 30 OK 127.0.0.1:6379> mget key1 key2 key3 1) "10" 2) "20" 3) "30"
Redis數據類型-list
list是一個鏈表結構,主要功能是push、pop、獲取一個範圍的全部值等等。操做中key理解爲鏈表的名字。
使用 list 結構,咱們能夠輕鬆地實現最新消息排行等功能(好比新浪微博的 TimeLine )。
list 的另外一個應用就是消息隊列,能夠利用 list 的 push操做,將任務存在 list 中,而後工做線程再用pop操做將任務取出進行執行。
push與pop的是推擠特性,push將k-v推動list,而後pop把值排出來
示例:
# redis-cli
#lpush做用——定義kv
127.0.0.1:6379> LPUSH list1 111 (integer) 1 127.0.0.1:6379> LPUSH list1 222 (integer) 2 127.0.0.1:6379> LPUSH list1 333 (integer) 3 #LRANGE查值,0 -1表示倒序 127.0.0.1:6379> LRANGE list1 0 -1 1) "333" 2) "222" 3) "111" #LPOP取值,取值後,list會缺乏被取出的值 127.0.0.1:6379> LPOP list1 "333" 127.0.0.1:6379> LRANGE list1 0 -1 1) "222" 2) "111"
Redis數據類型-set
set是集合,和咱們數學中的集合概念類似,對集合的操做有添加刪除元素,有對多個集合求交併差等操做。操做中key理解爲集合的名字。好比在微博應用中,能夠將一個用戶全部的關注人存在一個集合中,將其全部粉絲存在一個集合。由於 Redis 很是人性化的爲集合提供了求交集、並集、差集等操做,那麼就能夠很是方便的實現如共同關注、共同喜愛、二度好友等功能,對上面的全部集合操做,你還可使用不一樣的命令選擇將結果返回給客戶端仍是存集到一個新的集合中。
set示例
#SADD 127.0.0.1:6379> SADD set1 1 (integer) 1 127.0.0.1:6379> SADD set1 2 (integer) 1 127.0.0.1:6379> SADD set1 3 (integer) 1 127.0.0.1:6379> SADD set1 a (integer) 1 127.0.0.1:6379> SADD set1 b (integer) 1 127.0.0.1:6379> SADD set2 2 (integer) 1 127.0.0.1:6379> SADD set2 3 (integer) 1 127.0.0.1:6379> SADD set2 4 (integer) 1 127.0.0.1:6379> SADD set2 a (integer) 1 127.0.0.1:6379> SADD set2 b (integer) 1 #SMEMBERS 查key值 127.0.0.1:6379> SMEMBERS set1 1) "1" 2) "a" 3) "3" 4) "2" 5) "b" #SMEMBERS 查key值 127.0.0.1:6379> SMEMBERS set2 1) "a" 2) "4" 3) "3" 4) "2" 5) "b" #SINTER 求交集 127.0.0.1:6379> SINTER set1 set2 1) "a" 2) "3" 3) "2" 4) "b" #SUNION 去重,並集 127.0.0.1:6379> SUNION set1 set2 1) "1" 2) "a" 3) "2" 4) "b" 5) "4" 6) "3" #SDIFF 求差集 127.0.0.1:6379> SDIFF set1 set2 1) "1" #SREM 刪除元素 127.0.0.1:6379> SREM set1 1 (integer) 1 127.0.0.1:6379> SMEMBERS set1 1) "a" 2) "3" 3) "2" 4) "b"
解釋:
127.0.0.1:6379> SINTER set1 set2 //交集,相同的交集一塊兒
127.0.0.1:6379> SUNION set1 set2 //並集,set1,set2去重合並
127.0.0.1:6379> SDIFF set1 set2 //差集,不一樣的元素
127.0.0.1:6379> SREM set1 c //刪除元素
127.0.0.1:6379> SADD set2 a 2 b
Redis數據類型-sort set
sorted set是有序集合,它比set多了一個權重參數score,使得集合中的元素可以按 score 進行有序排列,好比一個存儲全班同窗成績的 Sorted Sets,其集合 value 能夠是同窗的學號,而 score 就能夠是其考試得分,這樣在數據插入集合的時候,就已經進行了自然的排序。
127.0.0.1:6379> ZADD set3 10 a (integer) 1 127.0.0.1:6379> ZADD set3 20 "a-2" (integer) 1 127.0.0.1:6379> ZADD set3 30 b (integer) 1 127.0.0.1:6379> ZADD set3 40 b-2 (integer) 1 #順序 127.0.0.1:6379> ZRANGE set3 0 -1 1) "a" 2) "a-2" 3) "b" 4) "b-2" #倒序 127.0.0.1:6379> ZREVRANGE set3 0 -1 1) "b-2" 2) "b" 3) "a-2" 4) "a"
排序的時候,score值不會被顯示出來的
Redis數據類型-hash
在 Memcached 中,咱們常常將一些結構化的信息打包成 hashmap,在客戶端序列化後存儲爲一個字符串的值(通常是 JSON 格式),好比用戶的暱稱、年齡、性別、積分等。
示例
格式:
#HSET key value(多個元素)
127.0.0.1:6379> HSET hash1 name kevin (integer) 1 127.0.0.1:6379> HSET hash1 age 26 (integer) 1 127.0.0.1:6379> HSET hash1 job IT (integer) 1 #HGET key value 127.0.0.1:6379> HGET hash1 name "kevin" 127.0.0.1:6379> HGET hash1 job "IT" 127.0.0.1:6379> HGET hash1 age "26" #HGETALL 獲取所有hash value 127.0.0.1:6379> HGETALL hash1 1) "name" 2) "kevin" 3) "age" 4) "26" 5) "job" 6) "IT"