1. 程式人生 > >redis介紹和數據類型

redis介紹和數據類型

size list name json格式 姓名 安裝路徑 查詢 去掉 sort

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介紹和數據類型