redis學(xué)習(xí)筆記

Redis簡介

Redis 是完全開源免費(fèi)的,遵守BSD協(xié)議,是一個(gè)高性能的key-value數(shù)據(jù)庫。
Redis 與其他 key - value 緩存產(chǎn)品有以下三個(gè)特點(diǎn):

  • Redis支持?jǐn)?shù)據(jù)的持久化,可以將內(nèi)存中的數(shù)據(jù)保存在磁盤中,重啟的時(shí)候可以再次加載進(jìn)行使用。
  • Redis不僅僅支持簡單的key-value類型的數(shù)據(jù),同時(shí)還提供list,set,zset,hash等數(shù)據(jù)結(jié)構(gòu)的存儲。
  • Redis支持?jǐn)?shù)據(jù)的備份,即master-slave模式的數(shù)據(jù)備份。

Redis 優(yōu)勢

  • 性能極高 – Redis能讀的速度是110000次/s,寫的速度是81000次/s 。
  • 豐富的數(shù)據(jù)類型 – Redis支持二進(jìn)制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 數(shù)據(jù)類型操作。
  • 原子 – Redis的所有操作都是原子性的,同時(shí)Redis還支持對幾個(gè)操作全并后的原子性執(zhí)行。
  • 豐富的特性 – Redis還支持 publish/subscribe, 通知, key 過期等等特性。

Redis與其他key-value存儲有什么不同?

  • Redis有著更為復(fù)雜的數(shù)據(jù)結(jié)構(gòu)并且提供對他們的原子性操作,這是一個(gè)不同于其他數(shù)據(jù)庫的進(jìn)化路徑。Redis的數(shù)據(jù)類型都是基于基本數(shù)據(jù)結(jié)構(gòu)的同時(shí)對程序員透明,無需進(jìn)行額外的抽象。
  • Redis運(yùn)行在內(nèi)存中但是可以持久化到磁盤,所以在對不同數(shù)據(jù)集進(jìn)行高速讀寫時(shí)需要權(quán)衡內(nèi)存,因?yàn)閿?shù)據(jù)量不能大于硬件內(nèi)存。在內(nèi)存數(shù)據(jù)庫方面的另一個(gè)優(yōu)點(diǎn)是,相比在磁盤上相同的復(fù)雜的數(shù)據(jù)結(jié)構(gòu),在內(nèi)存中操作起來非常簡單,這樣Redis可以做很多內(nèi)部復(fù)雜性很強(qiáng)的事情。同時(shí),在磁盤格式方面他們是緊湊的以追加的方式產(chǎn)生的,因?yàn)樗麄儾⒉恍枰M(jìn)行隨機(jī)訪問。

Redis 安裝

CentOS7下安裝:

  1. 環(huán)境配置
    安裝pcre開發(fā)包: yum install -y pcre-devel
    安裝編譯源碼所需的工具和庫:yum install gcc gcc-c++ ncurses-devel perl
    安裝cmake:yum -y install make gcc gcc-c++ ncurses-devel
    安裝ssl功能需要openssl庫:yum -y install openssl-devel
    安裝壓縮包:yum -y install zlib zlib-devel
    JDK:jdk-8u131-linux-x64.rpm
    make test需要的tcl包: yum install -y tcl

  2. 安裝步驟:

# 1.  創(chuàng)建redis目錄
mkdir /usr/local/redis
# 2. 解壓安裝包
tar xzvf redis-3.2.9.tar.gz && cd redis-3.2.9
# 3. 跑test,檢查是否有依賴問題
make test 
# 4. 如果有報(bào)錯(cuò),運(yùn)行該條命令,解決依賴后重跑make test
make distclean
#  開始編譯安裝,這里我們指定了安裝目錄,若未指定,默認(rèn)安裝在/usr/local/bin下
make PREFIX=/usr/local/redis install

我們已經(jīng)將redis可執(zhí)行文件安裝到/usr /local/redis/bin下, 下面我們來注冊redis服務(wù):

[root@localhost redis-3.2.9]# cd utils/
[root@localhost utils]# ./install_server.sh 
Welcome to the redis service installer
This script will help you easily set up a running redis server
Please select the redis port for this instance: [6379]    # 指定服務(wù)端口
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf]  #指定默認(rèn)配置文件
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log]  # 指定日志文件
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379]  # 指定數(shù)據(jù)文件路徑
Selected default - /var/lib/redis/6379
Please select the redis executable path [] /usr/local/redis/bin/redis-server # 指定redis-server可執(zhí)行文件的路徑
Selected config:
Port           : 6379
Config file    : /etc/redis/6379.conf
Log file       : /var/log/redis_6379.log
Data dir       : /var/lib/redis/6379
Executable     : /usr/local/redis/bin/redis-server
Cli Executable : /usr/local/redis/bin/redis-cli
Is this ok? Then press ENTER to go on or Ctrl-C to abort.
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!
[root@localhost utils]# chkconfig --list
Note: This output shows SysV services only and does not include native
      systemd services. SysV configuration data might be overridden by native
      systemd configuration.

      If you want to list systemd services use 'systemctl list-unit-files'.
      To see services enabled on particular target use
      'systemctl list-dependencies [target]'.
jexec           0:off   1:on    2:on    3:on    4:on    5:on    6:off
netconsole      0:off   1:off   2:off   3:off   4:off   5:off   6:off
network         0:off   1:off   2:on    3:on    4:on    5:on    6:off
redis_6379      0:off   1:off   2:on    3:on    4:on    5:on    6:off
[root@localhost utils]# service status redis_6379
The service command supports only basic LSB actions (start, stop, restart, try-restart, reload, force-reload, status). For other actions, please try to use systemctl.
[root@localhost utils]# service redis_6379 status
Redis is running (43917)

(* 可選) CentOS7 中用systemd替換了SysV,下面我們來自定義一下redis為systemd管理的服務(wù),systemd配置參考

## 1.關(guān)閉SysV的redis服務(wù)
[root@localhost bin]# chkconfig redis_6379 off
[root@localhost bin]# service redis_6379 stop
Stopping ...
Redis stopped
[root@localhost bin]# ss -lntp | grep redis
## 2.拷貝配置文件到redis安裝目錄:
[root@localhost bin]# pwd
/usr/local/redis/bin
[root@localhost bin]# ls
redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis-sentinel  redis-server      
[root@localhost bin]# cp /home/fbo/tools/redis-3.2.9/redis.conf .
[root@localhost bin]# cp /home/fbo/tools/redis-3.2.9/runtest* .
[root@localhost bin]# ls
redis-benchmark  redis-check-aof  redis-check-rdb  redis-cli  redis.conf  redis-sentinel  redis-server  runtest  runtest-cluster  runtest-sentinel
## 3.修改redis配置文件
[root@localhost bin]# mv redis.conf redis.conf.bak
[root@localhost bin]# grep -Ev "^#|^$" redis.conf.bak > redis.conf
[root@localhost bin]# sed -i "s/^bind.*/bind 0.0.0.0/g" redis.conf  # 監(jiān)聽所有ip
[root@localhost bin]# sed -i "s/^daemonize.*/daemonize yes/g" redis.conf # 開啟守護(hù)進(jìn)程模式
## 4.添加systemd的redis.service文件
cat > /usr/lib/systemd/system/redis.service << EOF
[Unit]
Description=Redis Daemon
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf
ExecStop=/usr/local/redis/bin/redis-cli -p 6379 shutdown
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF
[root@localhost ~]# systemctl start  redis
[root@localhost ~]# systemctl status  redis
● redis.service - Redis Daemon
   Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2017-07-17 15:06:30 CST; 5s ago
  Process: 45266 ExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/bin/redis.conf (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/redis.service
           └─45139 /usr/local/redis/bin/redis-server 0.0.0.0:6379
Jul 17 15:06:30 localhost.localdomain systemd[1]: Starting Redis Daemon...
Jul 17 15:06:30 localhost.localdomain systemd[1]: Started Redis Daemon.
[root@localhost ~]# systemctl stop  redis
[root@localhost ~]# systemctl status  redis
● redis.service - Redis Daemon
   Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
  1. 將redis的端口添加到Firewall
[root@localhost bin]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  sourceports: 
  icmp-blocks: 
  rich rules:   
[root@localhost bin]# firewall-cmd --permanent --add-port=6379/tcp
success
[root@localhost bin]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources: 
  services: dhcpv6-client ssh
  ports: 
  protocols: 
  masquerade: no
  forward-ports: 
  sourceports: 
  icmp-blocks: 
  rich rules:
[root@localhost bin]# firewall-cmd --reload
success
[root@localhost bin]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources: 
  services: dhcpv6-client ssh
  ports: 6379/tcp
  protocols: 
  masquerade: no
  forward-ports: 
  sourceports: 
  icmp-blocks: 
  rich rules: 
  1. 驗(yàn)證
[root@localhost utils]# cd /usr/local/redis/bin
[root@localhost bin]# ./redis-cli127.0.0.1:6379> set username fbo
OK
127.0.0.1:6379> get username
"fbo"
127.0.0.1:6379> exit
  1. 遠(yuǎn)程運(yùn)行Redis
remote-redis.png-w1000
  1. redis.conf配置詳解
#是否作為守護(hù)進(jìn)程運(yùn)行
daemonize yes
#如以后臺進(jìn)程運(yùn)行,則需指定一個(gè)pid,默認(rèn)為/var/run/redis.pid
pidfile redis.pid
#綁定主機(jī)IP,默認(rèn)值為127.0.0.1
bind 127.0.0.1
#Redis默認(rèn)監(jiān)聽端口
port 6379
#客戶端閑置多少秒后,斷開連接,默認(rèn)為300(秒)
timeout 300
#日志記錄等級,有4個(gè)可選值,debug,verbose(默認(rèn)值),notice,warning
loglevel verbose
#指定日志輸出的文件名,默認(rèn)值為stdout,也可設(shè)為/dev/null屏蔽日志
logfile stdout
#可用數(shù)據(jù)庫數(shù),默認(rèn)值為16,默認(rèn)數(shù)據(jù)庫為0
databases 16
#保存數(shù)據(jù)到disk的策略
#當(dāng)有一條Keys數(shù)據(jù)被改變是,900秒刷新到disk一次
save 900 1
#當(dāng)有10條Keys數(shù)據(jù)被改變時(shí),300秒刷新到disk一次
save 300 10
#當(dāng)有1w條keys數(shù)據(jù)被改變時(shí),60秒刷新到disk一次
save 60 10000
#當(dāng)dump .rdb數(shù)據(jù)庫的時(shí)候是否壓縮數(shù)據(jù)對象
rdbcompression yes
#本地?cái)?shù)據(jù)庫文件名,默認(rèn)值為dump.rdb
dbfilename dump.rdb
#本地?cái)?shù)據(jù)庫存放路徑,默認(rèn)值為 ./
dir /usr/local/redis/var/
>> 
_###############Replication##############_
#Redis的復(fù)制配置
slaveof <masterip><masterport> 當(dāng)本機(jī)為從服務(wù)時(shí),設(shè)置主服務(wù)的IP及端口
masterauth <master-password> 當(dāng)本機(jī)為從服務(wù)時(shí),設(shè)置主服務(wù)的連接密碼
#連接密碼
requirepass foobared
#最大客戶端連接數(shù),默認(rèn)不限制
maxclients 128
#最大內(nèi)存使用設(shè)置,達(dá)到最大內(nèi)存設(shè)置后,Redis會先嘗試清除已到期或即將到期的Key,當(dāng)此方法處理后,任到達(dá)最大內(nèi)存設(shè)置,將無法再進(jìn)行寫入操作。
maxmemory <bytes>
#是否在每次更新操作后進(jìn)行日志記錄,如果不開啟,可能會在斷電時(shí)導(dǎo)致一段時(shí)間內(nèi)的數(shù)據(jù)丟失。因?yàn)閞edis本身同步數(shù)據(jù)文件是按上面save條件來同步的,所以有的數(shù)據(jù)會在一段時(shí)間內(nèi)只存在于內(nèi)存中。默認(rèn)值為no
appendonly no
#更新日志文件名,默認(rèn)值為appendonly.aof
appendfilename
#更新日志條件,共有3個(gè)可選值。no表示等操作系統(tǒng)進(jìn)行數(shù)據(jù)緩存同步到磁盤,always表示每次更新操作后手動調(diào)用fsync()將數(shù)據(jù)寫到磁盤,everysec表示每秒同步一次(默認(rèn)值)。
appendfsync always
appendfsync everysec
appendfsync no
>> 
__################ VIRTUAL MEMORY ###########__
#是否開啟VM功能,默認(rèn)值為no
vm-enabled no
vm-enabled yes
#虛擬內(nèi)存文件路徑,默認(rèn)值為/tmp/redis.swap,不可多個(gè)Redis實(shí)例共享
vm-swap-file logs/redis.swap
#將所有大于vm-max-memory的數(shù)據(jù)存入虛擬內(nèi)存,無論vm-max-memory設(shè)置多小,所有索引數(shù)據(jù)都是內(nèi)存存儲的(Redis的索引數(shù)據(jù)就是keys),也就是說,當(dāng)vm-max-memory設(shè)置為0的時(shí)候,其實(shí)是所有value都存在于磁盤。默認(rèn)值為0。
vm-max-memory 0
vm-page-size 32
vm-pages 134217728
vm-max-threads 4
>>
__############# ADVANCED CONFIG###############__
glueoutputbuf yes
hash-max-zipmap-entries 64
hash-max-zipmap-value 512
#是否重置Hash表
activerehashing yes
  1. 調(diào)整內(nèi)核參數(shù):
    如果內(nèi)存情況比較緊張的話,需要設(shè)定內(nèi)核參數(shù):
    echo 1 > /proc/sys/vm/overcommit_memory
    這里說一下這個(gè)配置的含義:/proc/sys/vm/overcommit_memory
    該文件指定了內(nèi)核針對內(nèi)存分配的策略,其值可以是0、1、2。
    0,表示內(nèi)核將檢查是否有足夠的可用內(nèi)存供應(yīng)用進(jìn)程使用;如果有足夠的可用內(nèi)存,內(nèi)存申請?jiān)试S;否則,內(nèi)存申請失敗,并把錯(cuò)誤返回給應(yīng)用進(jìn)程。
    1,表示內(nèi)核允許分配所有的物理內(nèi)存,而不管當(dāng)前的內(nèi)存狀態(tài)如何。
    2,表示內(nèi)核允許分配超過所有物理內(nèi)存和交換空間總和的內(nèi)存
    Redis在dump數(shù)據(jù)的時(shí)候,會fork出一個(gè)子進(jìn)程,理論上child進(jìn)程所占用的內(nèi)存和parent是一樣的,比如parent占用的內(nèi)存為 8G,這個(gè)時(shí)候也要同樣分配8G的內(nèi)存給child, 如果內(nèi)存無法負(fù)擔(dān),往往會造成redis服務(wù)器的down機(jī)或者IO負(fù)載過高,效率下降。所以這里比較優(yōu)化的內(nèi)存分配策略應(yīng)該設(shè)置為 1(表示內(nèi)核允許分配所有的物理內(nèi)存,而不管當(dāng)前的內(nèi)存狀態(tài)如何)

Redis 數(shù)據(jù)類型

Redis支持五種數(shù)據(jù)類型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)

String(字符串)

string是redis最基本的類型,你可以理解成與Memcached一模一樣的類型,一個(gè)key對應(yīng)一個(gè)value。
string類型是二進(jìn)制安全的。意思是redis的string可以包含任何數(shù)據(jù)。比如jpg圖片或者序列化的對象 。
string類型是Redis最基本的數(shù)據(jù)類型,一個(gè)鍵最大能存儲512MB。

127.0.0.1:6379> set name "fbo"
OK
127.0.0.1:6379> get name
"fbo"

Hash(哈希)

Redis hash 是一個(gè)鍵名對集合。
Redis hash是一個(gè)string類型的field和value的映射表,hash特別適合用于存儲對象。

127.0.0.1:6379> hmset user:1 username fbo password 123456 points 200
OK
127.0.0.1:6379> hgetall user:1
1) "username"
2) "fbo"
3) "password"
4) "123456"
5) "points"
6) "200"
127.0.0.1:6379> hget user:1 username
"fbo"
127.0.0.1:6379> hget user:1 password
"123456"
127.0.0.1:6379> hget user:1 points
"200"

List(列表)

Redis 列表是簡單的字符串列表,按照插入順序排序。你可以添加一個(gè)元素到列表的頭部(左邊)或者尾部(右邊)。
列表最多可存儲 232 - 1 元素 (4294967295, 每個(gè)列表可存儲40多億)。

127.0.0.1:6379> lpush runoob redis
(integer) 1
127.0.0.1:6379> lpush runoob mongodb
(integer) 2
127.0.0.1:6379> lpush runoob rabitmq
(integer) 3
127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"

Set(集合)

Redis的Set是string類型的無序集合。
集合是通過哈希表實(shí)現(xiàn)的,所以添加,刪除,查找的復(fù)雜度都是O(1)。
實(shí)例中 rabitmq 添加了兩次,但根據(jù)集合內(nèi)元素的唯一性,第二次插入的元素將被忽略。

127.0.0.1:6379> sadd runfbo redis
(integer) 1
127.0.0.1:6379> sadd runfbo mongdb
(integer) 1
127.0.0.1:6379> sadd runfbo rabitmq
(integer) 1
127.0.0.1:6379> sadd runfbo rabitmq
(integer) 0
127.0.0.1:6379> smembers runfbo
1) "rabitmq"
2) "mongdb"
3) "redis"

zset(sorted set:有序集合)

Redis zset 和 set 一樣也是string類型元素的集合,且不允許重復(fù)的成員。
不同的是每個(gè)元素都會關(guān)聯(lián)一個(gè)double類型的分?jǐn)?shù)。redis正是通過分?jǐn)?shù)來為集合中的成員進(jìn)行從小到大的排序。
zset的成員是唯一的,但分?jǐn)?shù)(score)卻可以重復(fù)。
添加元素到集合,元素在集合中存在則更新對應(yīng)score

127.0.0.1:6379> zadd runfbi 0 redis
(integer) 1
127.0.0.1:6379> zadd runfbi 0 mongodb
(integer) 1
127.0.0.1:6379> zadd runfbi 0 rabitmq
(integer) 1
127.0.0.1:6379> zadd runfbi 0 rabitmq
(integer) 0
127.0.0.1:6379> ZRANGEBYSCORE runfbi 0 1000
1) "mongodb"
2) "rabitmq"
3) "redis"

參考文檔:

redis 入門教程
redis 命令參考
python使用redis

redis 性能測試

測試腳本:./redis-benchmark -h xx -p xx -t set -q -r 1000 -l -d 20

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容