>  기사  >  데이터 베이스  >  Redis 영구 저장소에 대한 자세한 설명

Redis 영구 저장소에 대한 자세한 설명

coldplay.xixi
coldplay.xixi앞으로
2020-11-24 16:59:033940검색

redis 데이터베이스 튜토리얼 컬럼에서는 Redis의 영구 저장소를 소개합니다.

Redis 영구 저장소에 대한 자세한 설명

권장: redis 데이터베이스 튜토리얼

redis 개요
REmote DIctionary Server(Redis)는 키-값 쌍을 기반으로 하는 영구 데이터베이스 스토리지 시스템입니다. Redis는 유명한 Memcached 캐시 서비스 소프트웨어와 매우 유사하지만 Redis는 문자열(문자열), 목록(목록), 세트(컬렉션) 및 정렬된 세트(순서 있는 세트) 등을 포함하여 Memcached보다 더 많은 데이터 저장 유형을 지원합니다.
이러한 데이터 유형은 푸시/팝, 추가/제거, 교차, 결합, 차이 및 다양한 작업을 지원하며 이러한 작업은 모두 원자적입니다. 이를 기반으로 redis는 다양한 정렬 방법을 지원합니다. Memcached 캐시 서비스와 마찬가지로 효율성을 보장하기 위해 데이터를 메모리에 캐싱하여 서비스를 제공합니다. memcached와 달리 redis 영구 캐시 서비스는 업데이트된 데이터를 디스크에 주기적으로 기록하고 수정된 작업 기록을 파일에 추가하여 기록합니다. memcached보다 더 유리한 점은 redis도 마스터-슬레이브(마스터-슬레이브) 동기화를 지원한다는 것입니다. 관계형 데이터베이스 MySQL의 마스터-슬레이브 복제 기능.
Redis는 C언어(30,000줄 이상의 코드)로 작성된 오픈소스 로그형 Key-Value 데이터베이스로, 네트워크를 지원하고, 메모리 기반 및 영속성이 가능하며, 다국어로 API를 제공합니다. 2010년 3월 15일부터 Redis 개발은 VMware에서 호스팅되었습니다.
Redis 소프트웨어의 등장으로 memcached와 같은 키-값 메모리 캐싱 서비스의 단점이 어느 정도 보완되었으며, 상황에 따라 관계형 데이터베이스에 대한 아주 좋은 보완 역할을 할 수 있습니다. redis는 Python, Ruby, Erlang, PHP 클라이언트를 제공합니다.

1.2 redis 기능

key-value键值类型存储
支持数据可靠存储及落地
单进程单线程高性能服务器
crash safe & recovery slow
单机qps可以达到10W
适合小数据量高速读写访问

1.3 Redis 장점

memcached와 달리 Redis는 데이터를 지속적으로 저장할 수 있으며 성능이 뛰어납니다. Redis는 초당 10W 이상의 읽기 쓰기 빈도를 지원할 수 있습니다.
풍부한 데이터 유형: Redis는 이진 문자열, 목록, 해시, 세트 및 정렬된 세트 및 기타 데이터 유형 작업을 지원합니다.
Atomic: Redis의 모든 작업은 원자적이며 Redis는 여러 작업의 원자적 병합도 지원합니다.
풍부한 기능: Redis 게시/구독(게시/구독), 알림, 키 만료 및 기타 기능도 지원합니다. Redis는 머신 간 마스터-슬레이브 복제를 지원합니다.

1.4 redis 결함 및 함정
시스템 작동에 결함이 있습니다
다양한 명령의 대기 시간이 크게 다릅니다
큰 메모리 관리 오버헤드(물리적 메모리의 3/5보다 낮게 설정)
버퍼 io로 인해 시스템 OOM(메모리 오버플로)이 발생합니다.

1.5 redis 데이터 유형
Redis는 키-값 저장 시스템 데이터베이스로서 키와 값 매핑 관계를 제공합니다. 그러나 일반적인 숫자 값이나 문자열 외에도 Redis 키 값은 가장 일반적으로 사용되는 데이터 유형 중 하나일 수 있습니다.

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

1.6 redis persistence

일반적으로 Redis는 데이터를 메모리에 저장하거나 가상 메모리를 사용하도록 구성됩니다. 데이터 지속성은 두 가지 방법으로 달성할 수 있습니다. 스냅샷을 사용하여 메모리의 데이터를 디스크에 지속적으로 기록하거나 MySQL과 유사한 binlog 로그(마스터-슬레이브 동기화에는 사용되지 않음)를 사용하여 로그가 업데이트될 때마다 기록합니다. 전자는 성능이 더 뛰어나지만 어느 정도 데이터 손실이 발생할 수 있습니다. 후자는 반대 효과를 나타냅니다.

1.7 redis 적용 시나리오
Redis의 최고의 적용 시나리오

  • Redis의 최고의 평가판 시나리오는 모든 데이터가 메모리에 저장되는 것입니다.
  • Memcached를 대체하기 위해 Redis의 더 많은 시나리오가 사용됩니다.
  • 데이터 일관성에 대한 특정 요구 사항이 있는 비즈니스에서는 데이터가 더 중요합니다.
  • 키/값 외에 더 많은 데이터 유형에 대한 지원이 필요한 경우 Redis를 사용하는 것이 더 적합합니다.
  • 마스터-슬레이브 동기화 및 로드 밸런싱 분산 애플리케이션 시나리오 제공 필요(redis 마스터-슬레이브 동기화)

1.8 Lessons from redis Production

마스터-슬레이브 마스터-슬레이브 동기화를 구성하고 언제 전환할 수 있는지 확인 서비스 실패가 발생합니다

마스터에서 데이터 지속성을 비활성화하고 슬레이브에서만 데이터 지속성을 구성해야 합니다

실제 메모리 + 가상 메모리가 부족합니다. 이 때 덤프가 계속 죽어가고 머신이 정지됩니다. 오랫동안. 이 상황은 재앙이다!

Redis의 물리적 메모리 사용량이 전체 메모리 용량의 3/5를 초과하면 더욱 위험해지며, 메모리 조각화가 커지게 됩니다.

최대 메모리에 도달하면 메모리 만료 시간이 적용됩니다. 키가 만료되지 않은 경우에도 키가 지워집니다.

redis与DB同步写的问题,先写DB,后写redis,因为写内存基本上没有问题。

快速部署一个redis环境
2.1 Redis部署环境搭建

主机名	eth0	用途
Master-redis01	10.0.0.135	主Redis
Slave-redis02	10.0.0.136	从Redis

2.2 开始安装redis服务
在redis的官方网站(http://www.redis.io)下载最新的稳定版本redis。

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

#在redis01和redis02都执行如下操作

[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

命令执行完成之后,会在/usr/local/redis/bin/目录下生成5个可执行文件,分别是:

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

它们的作用如下:

redis-server    #Redis服务器的daemon启动程序
redis-cli       #Redis命令操作工具。当然,你也可以用telnet根据其纯文本协议来操作
redis-benchmark #Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能。
redis-check-aof #对更新日志appendonly.aof检查,是否可用,类似检查mysql binlog的工具
redis-check-dump    #用于本地数据库rdb文件的检查

2.3 配置并启动redis服务
(1)配置启动命令

操作过程:

[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</megabytes>

(3)启动redis服务

操作过程:

#从源程序目录复制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/

#启动redis服务

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

#查看redis进程启动情况

[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启动成功后,在最后会出现如下警示信息:

[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被设置为了0.如果内存不够的情况下后台保存可能会失败;要解决这个问题,需要在/etc/sysctl.conf配置文件中将vm.overcommit_memory设置为1;或者通过命令“sysctl vm.overcommit_memory=1”来修改。
因此,我们做一下处理后在启动redis进程

[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 &amp;

经过处理后,再启动redis就没有任何警告了。
vm.overcommit_memory参数说明:
根据内核文档,该参数有三个值,分别是:
0:当用户空间请求更多的内存时,内核尝试估算出剩余可用的内存。
1:当设这个参数值为1时,内核允许超量使用内存直到用完为止,主要用于科学计算
2:当设这个参数值为2时,内核会使用一个绝不过量使用内存的算法,即系统整个内存地址空间不能超过swap+50%的RAM值,50%参数的设定是在overcommit_ratio中设定。

测试关闭redis服务的命令

redis-cli shutdown 关闭redis进程

[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自启动脚本

[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)"
esac
[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服务

redserver.sh conn ##登录redis
2.4 通过客户端操作redis数据库
下面我们来简单操作一下数据库。
插入数据:设置一个key-value对

[root@redis01 redis-2.8.9]# redis-cli   #通过客户端连接本地redis 
127.0.0.1:6379> set id 001  #写入一条数据key(id),value(001)
OK
127.0.0.1:6379> get id  #取值key(id)
"001"   #显示key对应的值
127.0.0.1:6379> del id  #删除key(id)
(integer) 1     #1表示成功
127.0.0.1:6379> exists id   #验证key是否存在
(integer) 0     #0表示不存在
127.0.0.1:6379> get id  #取key的值
(nil)           #报错信息
127.0.0.1:6379> set user001 benet
OK
127.0.0.1:6379> set user002 yunjisuan
OK
127.0.0.1:6379> set user003 yun123
OK
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数据库的表模式

127.0.0.1:6379> keys *  #查看所有key
1) "user003"
2) "user002"
3) "user001"
127.0.0.1:6379> select 1    #切换到表1模式
OK
127.0.0.1:6379[1]> keys *   #查询所有key
(empty list or set)     #什么都没有
127.0.0.1:6379[1]> set name wangwu  #写入一个key-value对
OK
127.0.0.1:6379[1]> keys *   #查看所有key
1) "name"           #key(name)已经有了
127.0.0.1:6379[1]> get name #查看key(name)的值
"wangwu"
127.0.0.1:6379[1]> select 0 #切换回表0模式(初始模式)
OK
127.0.0.1:6379> keys *      #查看所有key
1) "user003"
2) "user002"
3) "user001"

(2)redis-cli客户端的远程连接及非交互式操作数据库

[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
OK
[root@redis01 redis-2.8.9]# redis-cli -h 10.0.0.135 -p 6379 get aaa
"111"

redis安全
(1)为redis客户端设置外部链接密码

警告:
因为redis速度相当快,所以在一台比较好的服务器下,一个外部的用户可以在1秒内进行上万次的密码尝试,这意味着你需要指定非常非常强大的密码来防止暴力破解。
设置密码:

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

(2)将危险的命令改名
rename-command set “sset” #将set改名为sset

为php安装redis客户端扩展
(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

测试:

[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

开发python程序操作redis

在操作前请将之前redis配置文件里修改的redis命令注释掉,否则报错

[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支持库
>>> r = redis.Redis(host='10.0.0.135',port='6379',password='yunjisuan') #建立redis数据库的连接对象(面向对象方式)
>>> r.set('name','benet')   #操作对象调用set方法写入数据
True
>>> r.get('name')           #操作对象调用get方式读取数据
'benet'
>>> r.dbsize()              #操作对象查看redis数据库的数据条数
1L
>>> r.keys()                #查看所有的key
['name']
>>> exit()                  #退出

2.11 通过Web界面连接Python程序展示redis
开发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()

启动python脚本

注意关闭iptables

[root@redis01 scripts]# python python-redis.py 
Serving on port 8000...     #监听8000端口

Redis 영구 저장소에 대한 자세한 설명

위 내용은 Redis 영구 저장소에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 csdn.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제