redis介紹和數據類型
Redis官網:redis.io
Redis和memcached類似,也屬於k-v數據存儲
支持更多的value數據類型,除了和string外,還支持hash、lists(鏈表)、sets(集合)和sorted sets(有序集合)
redis使用兩種文件格式:全量數據(RDB)和增量請求(aof)。全量數據格式是把內存中數據寫入磁盤,便於下次讀取文件時進行加載。增量請求則是把內存中的數據序列化為操作請求,用於讀取文件時進行replay得到數據,這種類似於mysql binlog
redis的存儲分為內存存儲、磁盤存儲和log文件三部分
Redis安裝
在官網可以下載最新的安裝包,解壓安裝包進行安裝
[root@localhost src]# wget http://download.redis.io/releases/redis-5.0.0.tar.gz --2018-11-11 21:00:34-- http://download.redis.io/releases/redis-5.0.0.tar.gz Resolving download.redis.io... 109.74.203.151 Connecting to download.redis.io|109.74.203.151|:80... connected. HTTP request sent, awaiting response... 200 OK 解壓後使用make&&make install 來直接安裝,這裏和其他軟件不同,不需要./configure進行編譯 [root@localhost redis-5.0.0]# make cd src && make all make[1]: Entering directory `/usr/local/src/redis-5.0.0/src‘ ? CC Makefile.dep -----------------------------------省略 [root@localhost redis-5.0.0]# make install cd src && make install make[1]: Entering directory `/usr/local/src/redis-5.0.0/src‘ ? CC Makefile.dep make[1]: Leaving directory `/usr/local/src/redis-5.0.0/src‘ make[1]: Entering directory `/usr/local/src/redis-5.0.0/src‘ Hint: It‘s a good idea to run ‘make test‘ ;) ? INSTALL install ? INSTALL install ? INSTALL install ? INSTALL install ? INSTALL install make[1]: Leaving directory `/usr/local/src/redis-5.0.0/src‘ [root@localhost redis-5.0.0]#
查看redis的安裝路徑,在解壓包的路徑下拷貝redis的配置文件到/etc/目錄下,對配置文件進行修改,這裏會舉例一些配置項說明。其中大部分配置不需要改動,後期我也會找出這些配置項的作用說明
[root@localhost redis-5.0.0]# which redis-cli /usr/local/bin/redis-cli [root@localhost redis-5.0.0]# cp redis.conf /etc/redis.conf [root@localhost redis-5.0.0]# vim /etc/redis.conf bind 127.0.0.1 ? ? ? ? ? ? ? ? ? ?#redis監聽服務的ip,可以設置多個,多個ip使用空格分隔 protected-mode yes ? ? ? ? ? ? ? ?#保護模式開啟狀態 prot 6379 ? ? ? ? ? ? ? ? ? ? ? ? #監聽端口 tcp-backlog 511 ? ? ? ? ? ? ? ? ? # timeout 0 ? ? ? ? ? ? ? ? ? ? ? ? # tcp-keepalive 300 ? ? ? ? ? ? ? ? # daemonize yes ? ? ? ? ? ? ? ? ? ? #修改為yes,為no的話redis是在前臺終端裏啟動,關閉終端後redis也會被關閉,yes選項則表示將redis放入後臺去運行 supervised no ? ? ? ? ? ? ? ? ? ? # pidfile /var/run/redis_6379.pid ? #redis啟動後生成指定的pid文件 loglevel notice ? ? ? ? ? ? ? ? ? #日誌啟動級別 logfile "/var/log/redis.log" ? ? ?#指定日誌的存儲路徑,redis配置默認沒有指定路徑 databases 16 ? ? ? ? ? ? ? ? ? ? ?#redis庫,redis存儲數據生成的使用庫數量,庫默認從0開始 always-show-log yes ? ? ? ? ? ? ? # save 9001 ? ? ? ? ? ? ? ? ? ? ? ? #redis持久化的配置 save 300 10 ? ? ? ? ? ? ? ? ? ? ? #redis持久化的配置 save 60 10000 ? ? ? ? ? ? ? ? ? ? #redis持久化的配置 stop-writes-on-bgsave-error yes ? # rdbcompression yes ? ? ? ? ? ? ? ?#是否壓縮RDB文件 rdbchecksum yes ? ? ? ? ? ? ? ? ? # dbfilename dump.rdb ? ? ? ? ? ? ? #指定RDB的文件名稱 dir /data/redis ? ? ? ? ? ? ? ? ? #redis數據存儲路徑,默認配置為空 replica-serve-stale-data yes ? ? ?# replica-read-only yes ? ? ? ? ? ? #配置主從時的配置 repl-diskless-sync no repl-diskless-sync-delay 5 repl-disable-tcp-nodelay no replica-priority 100 lazyfree-lazy-eviction no lazyfree-lazy-expire no lazyfree-lazy-server-del no replica-lazy-flush no appendonly no ? ? ? ? ? ? ? ? ? ?#開啟aof日誌,yes表示開啟。在/data/redis下生成日誌文件 appendfilename "appendonly.aof" ?#定義aof的生成日誌名字 appendfsync everysec ? ? ? ? ? ? #記錄日誌的時間間隔 no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes aof-use-rdb-preamble yes lua-time-limit 5000 slowlog-log-slower-than 10000 slowlog-max-len 128 latency-monitor-threshold 0 notify-keyspace-events "" hash-max-ziplist-entries 512 hash-max-ziplist-value 64 list-max-ziplist-size -2 list-compress-depth 0 set-max-intset-entries 512 zset-max-ziplist-entries 128 zset-max-ziplist-value 64 hll-sparse-max-bytes 3000 stream-node-max-bytes 4096 stream-node-max-entries 100 activerehashing yes client-output-buffer-limit normal 0 0 0 client-output-buffer-limit replica 256mb 64mb 60 client-output-buffer-limit pubsub 32mb 8mb 60 hz 10 dynamic-hz yes aof-rewrite-incremental-fsync yes rdb-save-incremental-fsync yes
創建redis存儲目錄,並啟動redis,啟動時也需要在內核中添加redis的內核配置,如果想要開機時讓內核配置生效,那麽需要在/etc/rc.local中添加這些配置
修改內核參數,如果不定義內核參數,redis在啟動後日誌中會報錯,報錯信息即這些內核的提示
[root@localhost /]# sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1
[root@localhost /]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
將內核參數配置寫入/etc/rc.local文件中,讓其開機啟動時就生效
[root@localhost /]# vim /etc/rc.local
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don‘t
# want to do the full Sys V style init stuff.
touch /var/lock/subsys/local
sysctl vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled
啟動redis並查看啟動狀態,配置中指定的是監聽127.0.0.1這個ip,redis監聽6379端口
[root@localhost /]# redis-server /etc/redis.conf
[root@localhost /]# ps aux |grep redis
root ? ? 18169 ?0.0 ?0.0 146336 ?4048 ? ? ? ? Ssl ?21:56 ? 0:00 redis-server 127.0.0.1:6379
root ? ? 18229 ?0.0 ?0.0 103388 ?2160 pts/1 ? S+ ? 21:59 ? 0:00 grep redis
[root@localhost /]# netstat -ntlp |grep redis
tcp ? ? ? ?0 ? ? ?0 127.0.0.1:6379 ? ? ? ? ? ? ?0.0.0.0:* ? ? ? ? ? ? ? ? ? LISTEN ? ? ?18169/redis-server
```?
# redis的RDB和AOF兩種持久化模式區別
redis提供兩種持久化方式,RDB(Redis DataBase)和AOF(Append Only File)兩種模式持久化
RDB:簡單來說,就是在不同時間上,將redis內存上存儲的數據生成快照並存儲到磁盤等介質上
AOF:則是換了一個角度來實現持久化,AOF模式是將redis執行過的所有指令記錄下來,在下次redis發生重啟時,只要把這些指令從前到後再重復執行一遍,就可以實現數據恢復
RDB和AOF兩種方式也可以同時使用,在這種情況下,如果Redis發生重啟,這種模式下會優先選擇AOF方式來恢復數據,這是因為AOF方式恢復數據完整度更高
如果沒有持久化需求的話,也可以關閉RDB和AOF的持久化模式,這樣的話,redis會變為一個純內存數據庫,就和memcached一樣了
配置持久化需要修改/etc/redis.conf的配置文件,啟動redis使用redis-server+ 配置文件路徑來進行啟動redis
##### 編輯redis配置文件
[root@localhost /]# vim /etc/redis.conf
#save "" ? ? ? ? 如果不開啟持久化,去掉save ""註釋,並將下面間隔更改的配置註釋掉則關閉redis的持久化功能
save 900 1 ? ? ? #900秒發生一次數據更改
save 300 10 ? ? ?#300秒發生10次數據更改
save 60 10000 ? ?#60秒發生一萬次數據更改
--------省略
#appendfsync always ? 每次更改都記錄到硬盤,數據儲存的安全性高。但是這樣redis會頻繁讀寫磁盤,會造成磁盤IO增高
appendfsync everysec ? 每秒更改記錄到硬盤,每秒鐘將redis中的數據存儲到硬盤中,這種模式適中,建議開啟這種同步模式,安全高效適中
#appendfsync no ? ? ? 關閉寫入到磁盤但是打開這項,redis會根據系統自身的數據寫入磁盤的頻率來寫入磁盤中,但是這樣會造成redis存儲數據不全
# redis數據類型
在本機登入redis,在終端裏說明redis的數據類型
[root@localhost /]# redis-cli
127.0.0.1:6379>
**string 數據類型**
string是最簡單的類型,與memcached一樣,之存儲一個key對應一個value的數據。其操作與memcached也是類似的,但redis功能更加豐富,可以設置以二進制存儲的對象
127.0.0.1:6379> MSET k1 1 k2 2 k3 3
OK
127.0.0.1:6379> mget k1 k2 k3
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> mget k1 k2
1) "1"
2) "2"
127.0.0.1:6379> mget k1 k3
1) "1"
2) "3"
**set數據類型**
set數據是一種數據的集合,對集合操作有添加元素,有對多個集合交查詢、合並查詢及求差查詢等操作。操作中的key值為集合的名字,比如在一款社交的存儲數據中。可以將一個用戶所有follow的人存儲在一個集合中,將其被關註的人放入一個集合。因為redis非常合理的為集合提供求交集、並集、差集等操作。可以非常方便的實現如共同關註、共同愛好、推薦好友等功能。對以上列出的集合操作,還可以使用不同的命令選擇將結果返回給用戶還是存儲到一個新的集合中
set寫入一個集合並查看該集合的元素,如:
127.0.0.1:6379> SADD set1 a
(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 4
(integer) 1
127.0.0.1:6379> SADD set1 e
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "4"
2) "3"
3) "2"
4) "a"
5) "e"
查詢不同集合之間的交集元素,兩個集合中存在著相同的元素,要列出這些相同的元素就叫做交集。如:
127.0.0.1:6379> SMEMBERS set1
1) "2"
2) "3"
3) "4"
4) "a"
5) "e"
127.0.0.1:6379> SMEMBERS set2
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> SINTER set1 set2
1) "2"
2) "3"
將兩個集合合並查詢,會對重復的部分進行合並輸出顯示,將兩個集合合並為一個集合輸出。如:
127.0.0.1:6379> SUNION set1 set2 ? ? ? ? ? ? ? ?#set1和set2的集合是上面求交集中一樣的數據
1) "2"
2) "3"
3) "4"
4) "a"
5) "1"
6) "e"
set集合間求差集,比較出兩個集合直接沒有的元素,比較並需要顯示第一集合多第二集合哪些元素,第一集合在寫在前面。比如:
127.0.0.1:6379> SMEMBERS set1
1) "2"
2) "3"
3) "4"
4) "a"
5) "e"
127.0.0.1:6379> SMEMBERS set2
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> SDIFF set1 set2
1) "4"
2) "e"
3) "a"
127.0.0.1:6379> SDIFF set2 set1
1) "1"
刪除一個集合中的一個元素,如:
127.0.0.1:6379> SMEMBERS set1
1) "2"
2) "3"
3) "4"
4) "a"
5) "e"
127.0.0.1:6379> SREM set1 e
(integer) 1
127.0.0.1:6379> SMEMBERS set1
1) "2"
2) "3"
3) "4"
4) "a"
**sort set數據集合(有序集合)**
sorted set是有序集合。比set多了一個權重參數score,使得集合中的元素能夠按照score進行有序排序。比如存儲一個考試成績的sorted sets,集合中的value是同學的姓名。而score是考試得分,在數據插入集合的時候,就已經按照順序規則進行了排序
添加一個有序集合的元素,並將其按照正序和倒序顯示出來
127.0.0.1:6379> ZADD set 1 "asd"
(integer) 1
127.0.0.1:6379> zadd set 1 "123"
(integer) 1
127.0.0.1:6379> zadd set 1 "dds234"
(integer) 1
127.0.0.1:6379> ZADD set 1 "123abc"
(integer) 1
127.0.0.1:6379> ZRANGE set 0 -1 ? ? ? ? ?#集合正序輸出
1) "123"
2) "123abc"
3) "asd"
4) "dds234"
127.0.0.1:6379> ZREVRANGE set 0 -1 ? ? ? #集合倒序輸出
1) "dds234"
2) "asd"
3) "123abc"
4) "123"
**hash數據類型**
在memcached中。我們經常將一些結構化的信息打包成hashmap,在客戶端序列化之後存儲為一個字符串的值(一般是json格式的文件),比如用戶的昵稱、年齡、性別等等
比如在一個hash數據集合中寫入一個姓名年齡的有效元素並查詢其結果,比如:
127.0.0.1:6379> hset hash2 name xiaoming
(integer) 1
127.0.0.1:6379> hget hash2 name
"xiaoming"
127.0.0.1:6379> hset hash2 age 20
(integer) 1
127.0.0.1:6379> hget hash2 age
"20"
127.0.0.1:6379> hgetall hash2
1) "name"
2) "xiaoming"
3) "age"
4) "20"
redis介紹和數據類型