Maison > Article > base de données > Explication détaillée du stockage persistant Redis
Recommandé : Tutoriel sur la base de données Redis
Présentation de redis
REmote DIctionary Server (Redis) est un système de stockage de base de données persistant basé sur des paires clé-valeur. Redis est très similaire au célèbre logiciel de service de cache Memcached, mais Redis prend en charge plus de types de stockage de données que Memcached, notamment les chaînes (strings), les listes (listes), les ensembles (collections) et les ensembles triés (ensembles ordonnés), etc.
Ces types de données prennent en charge les opérations push/pop, ajout/suppression, intersection, union, différence et plus riches, et ces opérations sont toutes atomiques. Sur cette base, Redis prend en charge différentes méthodes de tri. Comme le service de cache Memcached, afin de garantir l'efficacité, les données sont mises en cache en mémoire pour fournir des services. Différent de Memcached, le service de cache persistant Redis écrira également périodiquement les données mises à jour sur le disque et ajoutera les enregistrements d'opérations modifiés aux fichiers pour l'enregistrement. Ce qui est plus avantageux que Memcached, c'est que Redis prend également en charge la synchronisation maître-esclave (maître-esclave) qui est très similaire. à la fonction de réplication maître-esclave de la base de données relationnelle MySQL.
Redis est une base de données clé-valeur de type journal open source écrite en langage C (plus de 30 000 lignes de code), prend en charge le réseau, peut être basée sur la mémoire et persistante, et fournit des API dans plusieurs langues. Depuis le 15 mars 2010, le développement de Redis est hébergé par VMware.
L'émergence du logiciel Redis a compensé dans une certaine mesure les lacunes des services de mise en cache mémoire clé-valeur tels que memcached, et peut jouer un très bon rôle supplémentaire aux bases de données relationnelles dans certaines situations. redis fournit des clients Python, Ruby, Erlang, PHP,
Fonctionnalités Redis 1.2
key-value键值类型存储 支持数据可靠存储及落地 单进程单线程高性能服务器 crash safe & recovery slow 单机qps可以达到10W 适合小数据量高速读写访问
Avantages Redis 1.3
Contrairement à Memcached, Redis peut conserver le stockage Les performances des données sont très élevé : Redis peut prendre en charge des fréquences de lecture et d'écriture supérieures à 10 W par seconde.
Types de données riches : Redis prend en charge les chaînes binaires, les listes, les hachages, les ensembles et les ensembles triés et d'autres opérations de type de données.
Atomique : toutes les opérations de Redis sont atomiques, et Redis prend également en charge le fonctionnement complet de plusieurs opérations atomiques après. fusion
Fonctionnalités riches : Redis prend également en charge la publication/abonnement (publication/abonnement), les notifications, l'expiration des clés et d'autres fonctionnalités. Redis prend en charge la réplication maître-esclave entre machines.
Défauts et pièges de Redis 1.4
Le fonctionnement du système présente des problèmes
Les différents délais de commande varient considérablement
La surcharge de gestion de la mémoire est importante (définie inférieure à 3/5 de la mémoire physique)
Buffer io provoque un MOO système (débordement de mémoire)
Type de données Redis 1.5
En tant que base de données de système de stockage clé-valeur, Redis fournit une relation de mappage clé (Clé) et valeur (valeur). Cependant, en plus des valeurs numériques ou des chaînes normales, les valeurs de clé Redis peuvent également se présenter sous l'une des formes suivantes. Voici les types de données les plus couramment utilisés :
String 字符串 Hash 哈希表 List 列表 Set 集合 Sorted set 有序集合
1.6 persistance redis
Généralement, Redis stocke les données en mémoire ou est configuré pour utiliser la mémoire virtuelle. La persistance des données peut être obtenue de deux manières : en utilisant des instantanés pour écrire en continu des données en mémoire sur le disque, ou en utilisant des journaux binlog de type MySQL (aof mais non utilisés pour la synchronisation maître-esclave) pour enregistrer chaque journal mis à jour. Le premier a des performances plus élevées, mais peut entraîner un certain degré de perte de données ; le second a l'effet inverse.Scénario d'application Redis 1.7
Le meilleur scénario d'application de Redis
Doit be Effectuer une configuration de synchronisation maître-esclave maître-esclave, qui peut être commutée en cas de panne de service
Désactiver la persistance des données sur le maître et il suffit de configurer la persistance des données sur l'esclave
La mémoire physique + la mémoire virtuelle est insuffisante à ce moment-là, le dump continue de mourir. Après un long moment, la machine se bloque. Cette situation est une catastrophe !
Lorsque l'utilisation de la mémoire physique Redis dépasse les 3/5 de la capacité totale de la mémoire, cela deviendra plus dangereux et l'échange commencera. La fragmentation de la mémoire sera importante .
Lorsque la mémoire maximale est atteinte, les clés avec délai d'expiration seront effacées, même si la clé n'a pas expiré.
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 &
经过处理后,再启动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端口
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!