初識Redis(安裝,持久化,數據類型)
初識Redis(安裝,持久化,數據類型)
一、Redis介紹:
- [ ] Redis和Memcached類似,也屬於k-v數據存儲,但是功能和操作性要比Memcached好很多。
- [ ] Redis官網redis.io, 當前最新穩定版4.0.1 支持更多value類型,除了和string外,還支持hash、lists(鏈表)、sets(集合)和sorted sets(有序集合)
- [ ] redis使用了兩種文件格式:全量數據(RDB)和增量請求(aof)。
- [ ] 全量數據格式是把內存中的數據寫入磁盤,便於下次讀取文件進行加載。
- [ ] 增量請求文件則是把內存中的數據序列化為操作請求,用於讀取文件進行replay得到數據,這種類似於mysql binlog。
- [ ] 為了節省資源,當我們手動保存一次全量數據,就可以刪除當前的所有增量數據了,有些增量數據其實早就過期了,也可定期利用腳本做一些優化。
- [ ] redis的存儲分為內存存儲、磁盤存儲和log文件三部分
二、安裝redis
2.1 安裝步驟
cd /usr/local/src/
wget http://download.redis.io/releases/redis-4.0.9.tar.gz
tar zxvf redis-4.0.9.tar.gz
cd redis-4.0.9
make && make install
echo $?
安裝完成後可以查看下redis的服務有哪些,並查看一下安裝路徑
[root@xavi redis-4.0.9]# redis-
redis-benchmark redis-check-rdb redis-sentinel
redis-check-aof redis-cli redis-server
[root@xavi redis-4.0.9]# which redis-cli
/usr/local/bin/redis-cli
3.2 拷貝安裝文件到/etc目錄下:
[root@xavi redis-4.0.9]# cp redis.conf /etc/ vim /etc/redis.conf ------------------------------------------ 此處用來配置監聽IP # Examples: # # bind 192.168.1.100 10.0.0.1 # bind 127.0.0.1 ::1
創建如上定義的 aof 的目錄
mkdir /data/redis
2.2 啟動 redis,redis-server /etc/redis.conf安裝默認的conf文件啟動redis服務
[root@xavi redis-4.0.9]# redis-server /etc/redis.conf //
[root@xavi redis-4.0.9]# netstat -lntp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 9433/redis-server 1
2.3 查看日誌:
[root@xavi redis-4.0.9]# less /var/log/redis.log
有如下兩個報錯:意思是 當你內存比較低的時候會報錯,讓我們把
vm.overcommit_memory 調節為 1
(1)
WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add ‘vm.overcommit_memory = 1‘ to /etc/sysctl.conf and then reboot or run the command ‘sysctl vm.overcommit_memory=1‘ for this to take effect.
(2)
echo never > /sys/kernel/mm/transparent_hugepage/enabled
解決方法:
[root@xavi redis-4.0.9]# vim /etc/rc.local
添加如下兩行:
sysctl vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled
三、Redis 持久化
和Memcached服務一樣,如果關閉RDB和aof數據就會存儲在內存中,當重啟服務或者重啟機器 存儲的數據就會丟失。如果數據很重要,我們就需要做持久化。
3.1 Redis提供了兩種持久化的方式,分別是RDB(Redis DataBase)和AOF(Append Only File)
-
[ ] RDB,簡而言之,就是在不同的時間點,將redis存儲的數據生成快照並存儲到磁盤等介質上。
-
[ ] AOF,則是換了一個角度來實現持久化,那就是將redis執行過的所有寫指令記錄下來,在下次redis重新啟動時,只要把這些寫指令從前到後再重復執行一遍,就可以實現數據恢復了。
-
其實RDB和AOF兩種方式也可以同時使用,在這種情況下,如果redis重啟的話,則會優先采用AOF方式來進行數據恢復,這是因為AOF方式的數據恢復完整度更高。
- 如果你沒有數據持久化的需求,也完全可以關閉RDB和AOF方式,這樣的話,redis將變成一個純內存數據庫,就像memcache一樣。
3.2 怎麽開啟“持久化”?以及什麽時間
redis會把內存中的數據備份到硬盤中,這個取決於:
vim /etc/redis.conf 打開redis配置文件
save 900 1 #表示每15分鐘且至少有1個key改變,就觸發一次持久化
save 300 10 #表示每5分鐘且至少有10個key改變,就觸發一次持久化
save 60 10000 #表示每60秒至少有10000個key改變,就觸發一次持久
save “” #這樣可以禁用rdb持久化
3.3 如何關閉“持久化”
AOF格式中appendfsync三種形式解析:
# appendfsync always //一直寫,每次有變更就寫進去
appendfsync everysec //安全高效,每一秒記錄一次,把數據從內存刷新到磁盤中去
# appendfsync no //每隔一段時間,根據系統的算法,Linux系統不定期把內存的數據同步到磁盤上去,根據這個頻率走,容易丟數據
總結:AOF記錄的比RDB更全面
四、 redis數據類型
4.1 Redis數據類型-string
string為最簡單的類型,與Memcached一樣的類型,一個key對應一個value,其支持的操作與Memcached的操作類似,它的功能更豐富。設置可以存二進制的對象。
示例:
[root@xavi redis-4.0.9]# redis-cli
127.0.0.1:6379> set mykey "123"
OK
127.0.0.1:6379> get mykey
"123"
127.0.0.1:6379> mset k1 1 k2 2 k3 a
OK
127.0.0.1:6379> mget k1 mykey
1) "1"
2) "123"
4.2 Redis數據類型-list 鏈表
list是一個鏈表結構,主要功能是push、pop、獲取一個範圍的所有值等等。操作中key理解為鏈表的名字。
- 使用 list 結構,我們可以輕松地實現最新消息排行等功能(比如新浪微博的 TimeLine )。list 的另一個應用就是消息隊列,可以利用 list 的 push操作,將任務存在 list 中,然後工作線程再用pop操作將任務取出進行執行。
127.0.0.1:6379> LPUSH list1 "xavilinux"
(integer) 1
127.0.0.1:6379> Lpush list1 "123"
(integer) 2
127.0.0.1:6379> LPUSH list1 "aaa bbb"
(integer) 3
127.0.0.1:6379> LRANGE list1 0-1 //0-1中間有空格
(error) ERR wrong number of arguments for ‘lrange‘ command
127.0.0.1:6379> LRANGE list1 0 -1 //從0到-1
1) "aaa bbb"
2) "123"
3) "xavilinux"
4.3 Redis數據類型-set 集合
set是集合,和我們數學中的集合概念相似,對集合的操作有添加刪除元素,有對多個集合求交並差等操作。操作中key理解為集合的名字。
-
比如在微博應用中,可以將一個用戶所有的關註人存在一個集合中,將其所有粉絲存在一個集合。因為 Redis 非常人性化的為集合提供了求交集、並集、差集等操作,那麽就可以非常方便的實現如共同關註、共同喜好、二度好友等功能,對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶端還是存集到一個新的集合中。
set示例
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 set1 c
(integer) 1
127.0.0.1:6379> SMEMBERS SET1
(empty list or set)
127.0.0.1:6379> SMEMBERS set1
1) "c"
2) "a"
3) "b"
127.0.0.1:6379> sadd set2 a
(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 c
(integer) 1
127.0.0.1:6379> SMEMBERS set2
1) "c"
2) "a"
3) "3"
4) "2"
127.0.0.1:6379> SUNION set1 set2 //求並集
1) "a"
2) "c"
3) "3"
4) "b"
5) "2"
127.0.0.1:6379> sinter set1 set2 //求交集
1) "c"
2) "a"
127.0.0.1:6379> SDIFF set1 set2 //求差集
1) "b"
127.0.0.1:6379> SREM set1 c //刪除某元素
(integer) 1
4.4 Redis數據類型-sort set 有序集合
sorted set是有序集合,它比set多了一個權重參數score,使得集合中的元素能夠按 score 進行有序排列,
- 比如一個存儲全班同學成績的 Sorted Sets,其集合 value 可以是同學的學號,而 score 就可以是其考試得分,這樣在數據插入集合的時候,就已經進行了天然的排序。
示例:
127.0.0.1:6379> ZADD set3 12 abc
(integer) 1
127.0.0.1:6379> ZADD set3 2 "cde 123"
(integer) 1
127.0.0.1:6379> ZADD set3 24 "xavi"
(integer) 1
127.0.0.1:6379> ZADD set3 4 "xavilinux"
(integer) 1
127.0.0.1:6379> ZRANGE set3 0 -1
1) "cde 123"
2) "xavilinux"
3) "abc"
4) "xavi"
倒敘排列
127.0.0.1:6379> ZREVRANGE set3 0 -1
1) "xavi"
2) "abc"
3) "xavilinux"
4) "cde 123"
4.5 Redis數據類型-hash 哈希
在 Memcached 中,我們經常將一些結構化的信息打包成 hashmap,在客戶端序列化後存儲為一個字符串的值(一般是 JSON 格式),比如用戶的昵稱、年齡、性別、積分等
127.0.0.1:6379> HSET hash1 name xavi
(integer) 1
127.0.0.1:6379> HSET hash1 age 30
(integer) 1
127.0.0.1:6379> HSET hash1 job IT
(integer) 1
127.0.0.1:6379> HGET hash1 name
"xavi"
127.0.0.1:6379> HGET hash1 job
"IT"
127.0.0.1:6379> hgetall hash1
1) "name"
2) "xavi"
3) "age"
4) "30"
5) "job"
6) "IT"
初識Redis(安裝,持久化,數據類型)