久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

redis持久化存儲(chǔ)是什么

共計(jì) 9433 個(gè)字符,預(yù)計(jì)需要花費(fèi) 24 分鐘才能閱讀完成。

自動(dòng)寫代碼機(jī)器人,免費(fèi)開通

這篇文章主要介紹 redis 持久化存儲(chǔ)是什么,文中介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們一定要看完!

redis 概述
REmote DIctionary Server(Redis)是一個(gè)基于 key-value 鍵值對(duì)的持久化數(shù)據(jù)庫(kù)存儲(chǔ)系統(tǒng)。redis 和大名鼎鼎的 Memcached 緩存服務(wù)軟件很像,但是 redis 支持的數(shù)據(jù)存儲(chǔ)類型比 memcached 更豐富,包括 strings(字符串),lists(列表),sets(集合)和 sorted sets(有序集合)等。
這些數(shù)據(jù)類型支持 push/pop,add/remove 及取交集,并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎(chǔ)上,redis 支持各種不同方式的排序。與 memcached 緩存服務(wù)一樣,為了保證效率,數(shù)據(jù)都是緩存在內(nèi)存中提供服務(wù)。和 memcached 不同的是,redis 持久化緩存服務(wù)還會(huì)周期性的把更新的數(shù)據(jù)寫入到磁盤以及把修改的操作記錄追加到文件里記錄下來(lái),比 memcached 更有優(yōu)勢(shì)的是,redis 還支持 master-slave(主從)同步,這點(diǎn)很類似關(guān)系型數(shù)據(jù)庫(kù) MySQL 主從復(fù)制功能。
Redis 是一個(gè)開源的使用 C 語(yǔ)言編寫 (3 萬(wàn)多行代碼),支持網(wǎng)絡(luò),可基于內(nèi)存亦可持久化的日志型,Key-Value 數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的 API。從 2010 年 3 月 15 日起,Redis 的開發(fā)工作由 VMware 主持。
Redis 軟件的出現(xiàn),再一定程度上彌補(bǔ)了 memcached 這類 key-value 內(nèi)存緩存服務(wù)的不足,在部分場(chǎng)合可以對(duì)關(guān)系數(shù)據(jù)庫(kù)起到很好的補(bǔ)充作用。redis 提供了 Python,Ruby,Erlang,PHP 客戶端,

1.2 redis 特點(diǎn)

key-value 鍵值類型存儲(chǔ)
支持?jǐn)?shù)據(jù)可靠存儲(chǔ)及落地
單進(jìn)程單線程高性能服務(wù)器
crash safe recovery slow
單機(jī) qps 可以達(dá)到 10W
適合小數(shù)據(jù)量高速讀寫訪問(wèn) 

1.3 Redis 優(yōu)點(diǎn)

與 memcached 不同,Redis 可以持久化存儲(chǔ)數(shù)據(jù) 性能很高:Redis 能支持超過(guò) 10W 每秒的讀寫頻率。
豐富的數(shù)據(jù)類型:Redis 支持二進(jìn)制的 Strings,Lists,Hashes,Sets 及 sorted Sets 等數(shù)據(jù)類型操作
原子:Redis 的所有操作都是原子性的,同時(shí) Redis 還支持對(duì)幾個(gè)操作全并后的原子性執(zhí)行
豐富的特性:Redis 還支持 publish/subscribe(發(fā)布 / 訂閱),通知,key 過(guò)期等等特性。redis 支持異機(jī)主從復(fù)制。

1.4 redis 缺陷與陷阱
系統(tǒng)運(yùn)行有毛刺
不同命令延遲差別極大
內(nèi)存管理開銷大(設(shè)置低于物理內(nèi)存 3 /5)
buffer io 造成系統(tǒng) OOM(內(nèi)存溢出)

1.5 redis 的數(shù)據(jù)類型
作為 Key-value 型存儲(chǔ)系統(tǒng)數(shù)據(jù)庫(kù),Redis 提供了鍵(Key)和值(value)映射關(guān)系。但是,除了常規(guī)的數(shù)值或字符串,Redis 的鍵值還可以是以下形式之一,下面為最為常用的數(shù)據(jù)類型:

String 字符串
Hash 哈希表
List 列表
Set 集合
Sorted set 有序集合 

1.6 redis 持久化

通常,Redis 將數(shù)據(jù)存儲(chǔ)于內(nèi)存中,或被配置為使用虛擬內(nèi)存。通過(guò)兩種方式可以實(shí)現(xiàn)數(shù)據(jù)持久化:使用快照(snapshot)的方式,將內(nèi)存中的數(shù)據(jù)不斷寫入磁盤,或使用類似 MySQL 的 binlog 日志(aof 但并不用于主從同步)方式,記錄每次更新的日志。前者性能較高,但是可能會(huì)引起一定程度的數(shù)據(jù)丟失;后者相反。

1.7 redis 應(yīng)用場(chǎng)景
redis 的最佳應(yīng)用場(chǎng)景

Redis 最佳試用場(chǎng)景是全部數(shù)據(jù) in-memoryRedis 更多場(chǎng)景是作為 Memcached 的替代品來(lái)使用。數(shù)據(jù)比較重要,對(duì)數(shù)據(jù)一致性有一定要求的業(yè)務(wù)。當(dāng)需要除 key/value 之外的更多數(shù)據(jù)類型支持時(shí),使用 Redis 更合適。需要提供主從同步以及負(fù)載均衡分布式應(yīng)用場(chǎng)景(redis 主從同步)

1.8redis 生產(chǎn)上的教訓(xùn)

一定要進(jìn)行 Master-slave 主從同步配置,在出現(xiàn)服務(wù)故障時(shí)可以切換

在 master 禁用數(shù)據(jù)持久化,只需要在 slave 上配置數(shù)據(jù)持久化

物理內(nèi)存 + 虛擬內(nèi)存不足,這個(gè)時(shí)候 dump 一直死著,時(shí)間久了機(jī)器掛掉。這個(gè)情況就是災(zāi)難!

當(dāng) Redis 物理內(nèi)存使用超過(guò)內(nèi)存總?cè)萘康?3 / 5 時(shí)就會(huì)開始比較危險(xiǎn)了,就開始做 swap,內(nèi)存碎片大

當(dāng)達(dá)到最大內(nèi)存時(shí),會(huì)清空帶有過(guò)期時(shí)間的 key,即使 key 未到過(guò)期時(shí)間。

redis 與 DB 同步寫的問(wèn)題,先寫 DB,后寫 redis,因?yàn)閷憙?nèi)存基本上沒(méi)有問(wèn)題。

快速部署一個(gè) redis 環(huán)境
2.1 Redis 部署環(huán)境搭建

 主機(jī)名 eth0 用途
Master-redis01 10.0.0.135 主 Redis
Slave-redis02 10.0.0.136 從 Redis

2.2 開始安裝 redis 服務(wù)
在 redis 的官方網(wǎng)站(http://www.redis.io)下載最新的穩(wěn)定版本 redis。

wget -q http://download.redis.io/releases/redis-2.8.9.tar.gz

# 在 redis01 和 redis02 都執(zhí)行如下操作

[root@redis01 ~]# tar xf redis-2.8.9.tar -C /usr/src/
[root@redis01 ~]# cd /usr/src/redis-2.8.9/
[root@redis01 redis-2.8.9]# make MALLOC=jemalloc
[root@redis01 redis-2.8.9]# make PREFIX=/usr/local/redis install
[root@redis01 redis-2.8.9]# LANG=en
[root@redis01 redis-2.8.9]# tree /usr/local/redis/bin/
/usr/local/redis/bin/
├── redis-benchmark
├── redis-check-aof
├── redis-check-dump
├── redis-cli
└── redis-server
0 directories, 5 files

命令執(zhí)行完成之后,會(huì)在 /usr/local/redis/bin/ 目錄下生成 5 個(gè)可執(zhí)行文件,分別是:

redis-server,redis-cli,redis-benchmark,redis-check-aof,redis-check-dump

它們的作用如下:

redis-server #Redis 服務(wù)器的 daemon 啟動(dòng)程序
redis-cli #Redis 命令操作工具。當(dāng)然,你也可以用 telnet 根據(jù)其純文本協(xié)議來(lái)操作
redis-benchmark #Redis 性能測(cè)試工具,測(cè)試 Redis 在你的系統(tǒng)及你的配置下的讀寫性能。redis-check-aof #對(duì)更新日志 appendonly.aof 檢查,是否可用,類似檢查 mysql binlog 的工具
redis-check-dump #用于本地?cái)?shù)據(jù)庫(kù) rdb 文件的檢查 

2.3 配置并啟動(dòng) redis 服務(wù)
(1)配置啟動(dòng)命令

操作過(guò)程:

[root@redis01 redis-2.8.9]# ln -s /usr/local/redis/bin/* /usr/local/bin/
(2)查看命令幫助:

[root@redis01 redis-2.8.9]# redis-server -h
Usage: ./redis-server [/path/to/redis.conf] [options]
 ./redis-server - (read config from stdin)
 ./redis-server -v or --version
 ./redis-server -h or --help
 ./redis-server --test-memory megabytes 
Examples:
 ./redis-server (run the server with default conf)
 ./redis-server /etc/redis/6379.conf
 ./redis-server --port 7777
 ./redis-server --port 7777 --slaveof 127.0.0.1 8888
 ./redis-server /etc/myredis.conf --loglevel verbose
Sentinel mode:
 ./redis-server /etc/sentinel.conf --sentinel

(3)啟動(dòng) redis 服務(wù)

操作過(guò)程:

# 從源程序目錄復(fù)制 redis.conf 到程序安裝目錄下

[root@redis01 redis-2.8.9]# cd /usr/src/redis-2.8.9/
[root@redis01 redis-2.8.9]# pwd
/usr/src/redis-2.8.9
[root@redis01 redis-2.8.9]# mkdir /usr/local/redis/conf
[root@redis01 redis-2.8.9]# cp redis.conf /usr/local/redis/conf/

# 啟動(dòng) redis 服務(wù)

[root@redis01 redis-2.8.9]# redis-server /usr/local/redis/conf/redis.conf

# 查看 redis 進(jìn)程啟動(dòng)情況

[root@redis01 redis-2.8.9]# ps -ef | grep redis | grep -v grep
root 3169 1288 0 10:17 pts/0 00:00:00 redis-server *:6379

特別提示:

redis 啟動(dòng)成功后,在最后會(huì)出現(xiàn)如下警示信息:

[3169] 02 Oct 10:17:30.689 # Server started, Redis version 2.8.9
[3169] 02 Oct 10:17:30.690 # 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.
[3169] 02 Oct 10:17:30.690 * The server is now ready to accept connections on port 6379

# 警示大概意思為:
overcommit_memory 被設(shè)置為了 0. 如果內(nèi)存不夠的情況下后臺(tái)保存可能會(huì)失敗;要解決這個(gè)問(wèn)題,需要在 /etc/sysctl.conf 配置文件中將 vm.overcommit_memory 設(shè)置為 1; 或者通過(guò)命令“sysctl vm.overcommit_memory=1”來(lái)修改。
因此,我們做一下處理后在啟動(dòng) redis 進(jìn)程

[root@redis01 redis-2.8.9]# pkill redis
[root@redis01 redis-2.8.9]# sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1
[root@redis01 redis-2.8.9]# redis-server /usr/local/redis/conf/redis.conf

經(jīng)過(guò)處理后,再啟動(dòng) redis 就沒(méi)有任何警告了。
vm.overcommit_memory 參數(shù)說(shuō)明:
根據(jù)內(nèi)核文檔,該參數(shù)有三個(gè)值,分別是:
0: 當(dāng)用戶空間請(qǐng)求更多的內(nèi)存時(shí),內(nèi)核嘗試估算出剩余可用的內(nèi)存。
1: 當(dāng)設(shè)這個(gè)參數(shù)值為 1 時(shí),內(nèi)核允許超量使用內(nèi)存直到用完為止,主要用于科學(xué)計(jì)算
2: 當(dāng)設(shè)這個(gè)參數(shù)值為 2 時(shí),內(nèi)核會(huì)使用一個(gè)絕不過(guò)量使用內(nèi)存的算法,即系統(tǒng)整個(gè)內(nèi)存地址空間不能超過(guò) swap+50% 的 RAM 值,50% 參數(shù)的設(shè)定是在 overcommit_ratio 中設(shè)定。

測(cè)試關(guān)閉 redis 服務(wù)的命令

redis-cli shutdown 關(guān)閉 redis 進(jìn)程

[root@redis01 redis-2.8.9]# ps -ef | grep redis | grep -v grep
root 3200 1288 0 10:38 pts/0 00:00:08 redis-server *:6379 
[root@redis01 redis-2.8.9]# redis-cli shutdown
[3200] 02 Oct 12:43:46.621 # User requested shutdown...
[3200] 02 Oct 12:43:46.621 * Saving the final RDB snapshot before exiting.
[3200] 02 Oct 12:43:46.630 * DB saved on disk
[3200] 02 Oct 12:43:46.631 # Redis is now ready to exit, bye bye...
[1]+ Done redis-server /usr/local/redis/conf/redis.conf
[root@redis01 redis-2.8.9]# ps -ef | grep redis | grep -v grep
[root@redis01 redis-2.8.9]# redis-server /usr/local/redis/conf/redis.conf

redis 自啟動(dòng)腳本

[root@ser02 redis]# vim redserver.sh
#!/bin/bash
stop(){
/data/redis/bin/redis-cli -a redis shutdown
start(){
/data/redis/bin/redis-server /data/redis/conf/redis.conf 
conn(){
/data/redis/bin/redis-cli -a redis
case $1 in
 start)
 start
 stop)
 stop
 restart)
 stop
 start
 conn)
 conn
 echo Usage:$0 (start|stop|restart) 
[root@ser02 redis]# chmod +x redserver.sh 
[root@ser02 redis]# vim /etc/profile
export PATH=/data/redis/:$PATH
[root@ser02 redis]# source /etc/profile
redserver.sh start ## 開啟 redis 服務(wù) 

redserver.sh conn ## 登錄 redis
2.4 通過(guò)客戶端操作 redis 數(shù)據(jù)庫(kù)
下面我們來(lái)簡(jiǎn)單操作一下數(shù)據(jù)庫(kù)。
插入數(shù)據(jù):設(shè)置一個(gè) key-value 對(duì)

[root@redis01 redis-2.8.9]# redis-cli #通過(guò)客戶端連接本地 redis 
127.0.0.1:6379 set id 001 #寫入一條數(shù)據(jù) key(id),value(001)127.0.0.1:6379 get id #取值 key(id)001 #顯示 key 對(duì)應(yīng)的值
127.0.0.1:6379 del id #刪除 key(id)(integer) 1 #1 表示成功
127.0.0.1:6379 exists id #驗(yàn)證 key 是否存在
(integer) 0 #0 表示不存在
127.0.0.1:6379 get id #取 key 的值
(nil) #報(bào)錯(cuò)信息
127.0.0.1:6379 set user001 benet
127.0.0.1:6379 set user002 yunjisuan
127.0.0.1:6379 set user003 yun123
127.0.0.1:6379 get user001
 benet 
127.0.0.1:6379 get user002
 yunjisuan 
127.0.0.1:6379 keys * #查看 redis 里所有的 key
1) user003 
2) user002 
3) user001

更多操作方式及命令幫助

(1)redis 數(shù)據(jù)庫(kù)的表模式

127.0.0.1:6379 keys * #查看所有 key
1) user003 
2) user002 
3) user001 
127.0.0.1:6379 select 1 #切換到表 1 模式
127.0.0.1:6379[1] keys * #查詢所有 key
(empty list or set) #什么都沒(méi)有
127.0.0.1:6379[1] set name wangwu #寫入一個(gè) key-value 對(duì)
127.0.0.1:6379[1] keys * #查看所有 key
1) name #key(name)已經(jīng)有了
127.0.0.1:6379[1] get name #查看 key(name)的值
 wangwu 
127.0.0.1:6379[1] select 0 #切換回表 0 模式(初始模式)127.0.0.1:6379 keys * #查看所有 key
1) user003 
2) user002 
3) user001

(2)redis-cli 客戶端的遠(yuǎn)程連接及非交互式操作數(shù)據(jù)庫(kù)

[root@redis01 redis-2.8.9]# redis-cli -h 10.0.0.135 -p 6379
10.0.0.135:6379 quit
[root@redis01 redis-2.8.9]# redis-cli -h 10.0.0.135 -p 6379 set aaa 111
[root@redis01 redis-2.8.9]# redis-cli -h 10.0.0.135 -p 6379 get aaa
 111

redis 安全
(1)為 redis 客戶端設(shè)置外部鏈接密碼

警告:
因?yàn)?redis 速度相當(dāng)快,所以在一臺(tái)比較好的服務(wù)器下,一個(gè)外部的用戶可以在 1 秒內(nèi)進(jìn)行上萬(wàn)次的密碼嘗試,這意味著你需要指定非常非常強(qiáng)大的密碼來(lái)防止暴力破解。
設(shè)置密碼:

[root@ser02 bin]# vim /data/redis/conf/redis.conf 
 requirepass redis

(2)將危險(xiǎn)的命令改名
rename-command set“sset”#將 set 改名為 sset

為 php 安裝 redis 客戶端擴(kuò)展
(1)獲取源碼包

wget https://github.com/nicolasff/phpredis/archive/master.zip

(2)安裝

[root@redis01 ~]# ls -l phpredis-master.tar.gz 
-rw-r--r--. 1 root root 164509 Oct 2 19:23 phpredis-master.tar.gz
[root@redis01 ~]# tar xf phpredis-master.tar.gz -C /usr/src/
[root@redis01 ~]# cd /usr/src/phpredis-master/
[root@redis01 phpredis-master]# /usr/local/php/bin/phpize
[root@redis01 phpredis-master]# ./configure --with-php-config=/usr/local/php/bin/php-config
[root@redis01 phpredis-master]# make make install
vim /etc/php.ini
 extensions = /usr/lib64/php/modules/redis.so
 [root@ser02 modules]# systemctl restart httpd

測(cè)試:

[root@ser02 redis]# cd /var/www/html/
 [root@ser02 html]# vim 1.php 
 ?php
 $redis = new Redis();
 $redis - connect(192.168.25.151 ,4423);
 $redis - auth( redis 
 $redis - set( name , anliu 
 $var = $redis - get( name 
 echo $var 
 [root@ser02 html]# systemctl restart httpd

[root@ser02 html]# php 1.php anliu

安裝 Python redis 客戶端操作 redis

wget https://pypi.python.org/packages/source/r/redis/redis-2.10.1.tar.gz
tar xf redis-2.10.1.tar.gz
cd redis-2.10.1
python setup.py install

開發(fā) python 程序操作 redis

在操作前請(qǐng)將之前 redis 配置文件里修改的 redis 命令注釋掉,否則報(bào)錯(cuò)

[root@redis01 redis-2.10.1]# python
Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22) 
[GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2
Type help , copyright , credits or license for more information.
 import redis #引用 redis 支持庫(kù)
 r = redis.Redis(host= 10.0.0.135 ,port= 6379 ,password= yunjisuan) #建立 redis 數(shù)據(jù)庫(kù)的連接對(duì)象(面向?qū)ο蠓绞剑﹔.set(name , benet) #操作對(duì)象調(diào)用 set 方法寫入數(shù)據(jù)
 r.get(name) #操作對(duì)象調(diào)用 get 方式讀取數(shù)據(jù)
 benet 
 r.dbsize() #操作對(duì)象查看 redis 數(shù)據(jù)庫(kù)的數(shù)據(jù)條數(shù)
 r.keys() #查看所有的 key
[name]
 exit() #退出 

2.11 通過(guò) Web 界面連接 Python 程序展示 redis
開發(fā) Python 腳本

[root@redis01 scripts]# cat python-redis.py 
#/usr/bin/python
from wsgiref.simple_server import make_server
import redis
def get_redis():
 r = redis.Redis(host= 10.0.0.135 ,port= 6379 ,password= yunjisuan ,db=0)
 r.set(name , yunyunyun)
 return r.get(name)
def hello_world_app(environ,start_response):
 status = 200 OK #HTTP Status
 headers = [(Content-type , text/plain)] #HTTP Headers
 start_response(status,headers)
 # The returned object is going to be printed
 return get_redis()
httpd = make_server(,8000,hello_world_app)
print Serving on port 8000... 
# Server until process is killed
httpd.serve_forever()

啟動(dòng) python 腳本

 注意關(guān)閉 iptables
[root@redis01 scripts]# python python-redis.py 
Serving on port 8000... #監(jiān)聽 8000 端口 

redis 持久化存儲(chǔ)是什么

以上是“redis 持久化存儲(chǔ)是什么”這篇文章的所有內(nèi)容,感謝各位的閱讀!希望分享的內(nèi)容對(duì)大家有幫助,更多相關(guān)知識(shí),歡迎關(guān)注丸趣 TV 行業(yè)資訊頻道!

向 AI 問(wèn)一下細(xì)節(jié)

丸趣 TV 網(wǎng) – 提供最優(yōu)質(zhì)的資源集合!

正文完
 
丸趣
版權(quán)聲明:本站原創(chuàng)文章,由 丸趣 2023-12-18發(fā)表,共計(jì)9433字。
轉(zhuǎn)載說(shuō)明:除特殊說(shuō)明外本站除技術(shù)相關(guān)以外文章皆由網(wǎng)絡(luò)搜集發(fā)布,轉(zhuǎn)載請(qǐng)注明出處。
評(píng)論(沒(méi)有評(píng)論)
主站蜘蛛池模板: 长寿区| 阳原县| 临桂县| 营口市| 思南县| 桐柏县| 永安市| 乡宁县| 东兴市| 康乐县| 江永县| 军事| 桃江县| 泰安市| 汝南县| 台东县| 衡阳市| 高唐县| 临猗县| 湖北省| 昌吉市| 县级市| 托克逊县| 宁城县| 吕梁市| 柘城县| 舞钢市| 鹿泉市| 白水县| 宜章县| 兴山县| 九寨沟县| 永丰县| 新龙县| 微博| 丰顺县| 吴江市| 开平市| 郸城县| 三穗县| 大化|