0

0

详解redis持久化存储

coldplay.xixi

coldplay.xixi

发布时间:2020-11-24 16:59:03

|

4157人浏览过

|

来源于csdn

转载

redis数据库教程栏目介绍redis的持久化存储。

详解redis持久化存储

推荐:redis数据库教程

redis概述
REmote DIctionary Server(Redis)是一个基于key-value键值对的持久化数据库存储系统。redis和大名鼎鼎的Memcached缓存服务软件很像,但是redis支持的数据存储类型比memcached更丰富,包括strings(字符串),lists(列表),sets(集合)和sorted sets(有序集合)等。
这些数据类型支持push/pop,add/remove及取交集,并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached缓存服务一样,为了保证效率,数据都是缓存在内存中提供服务。和memcached不同的是,redis持久化缓存服务还会周期性的把更新的数据写入到磁盘以及把修改的操作记录追加到文件里记录下来,比memcached更有优势的是,redis还支持master-slave(主从)同步,这点很类似关系型数据库MySQL主从复制功能。
Redis是一个开源的使用C语言编写(3万多行代码),支持网络,可基于内存亦可持久化的日志型,Key-Value数据库,并提供多种语言的API。从2010年3月15日起,Redis的开发工作由VMware主持。
Redis软件的出现,再一定程度上弥补了memcached这类key-value内存缓存服务的不足,在部分场合可以对关系数据库起到很好的补充作用。redis提供了Python,Ruby,Erlang,PHP客户端,

1.2 redis特点

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

1.3 Redis优点

与memcached不同,Redis可以持久化存储数据 性能很高:Redis能支持超过10W每秒的读写频率。 丰富的数据类型:Redis支持二进制的Strings,Lists,Hashes,Sets及sorted Sets等数据类型操作 原子:Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行 丰富的特性:Redis还支持publish/subscribe(发布/订阅),通知,key过期等等特性。 redis支持异机主从复制。

1.4 redis缺陷与陷阱
系统运行有毛刺
不同命令延迟差别极大
内存管理开销大(设置低于物理内存3/5)
buffer io造成系统OOM(内存溢出)

1.5 redis的数据类型
作为Key-value型存储系统数据库,Redis提供了键(Key)和值(value)映射关系。但是,除了常规的数值或字符串,Redis的键值还可以是以下形式之一,下面为最为常用的数据类型:

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

1.6 redis 持久化

通常,Redis将数据存储于内存中,或被配置为使用虚拟内存。通过两种方式可以实现数据持久化:使用快照(snapshot)的方式,将内存中的数据不断写入磁盘,或使用类似MySQL的binlog日志(aof但并不用于主从同步)方式,记录每次更新的日志。前者性能较高,但是可能会引起一定程度的数据丢失;后者相反。

1.7 redis应用场景
redis的最佳应用场景

  • Redis最佳试用场景是全部数据in-memory
  • Redis更多场景是作为Memcached的替代品来使用。
  • 数据比较重要,对数据一致性有一定要求的业务。
  • 当需要除key/value之外的更多数据类型支持时,使用Redis更合适。
  • 需要提供主从同步以及负载均衡分布式应用场景(redis主从同步)

1.8redis生产上的教训

一定要进行Master-slave主从同步配置,在出现服务故障时可以切换

在master禁用数据持久化,只需要在slave上配置数据持久化

物理内存+虚拟内存不足,这个时候dump一直死着,时间久了机器挂掉。这个情况就是灾难!

当Redis物理内存使用超过内存总容量的3/5时就会开始比较危险了,就开始做swap,内存碎片大

当达到最大内存时,会清空带有过期时间的key,即使key未到过期时间。

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)配置启动命令

操作过程:

魔众商城系统
魔众商城系统

魔众商城系统是一个在线B2C商城系统,支持购物车、商品多分类,可以帮您快速搭建一套企业私有化的商城系统。 魔众商城系统,简约不简单的在线商城系统。 魔众商城系统是一个全面、高效且简约的B2C电商解决方案,专为希望在线上拓展业务、提升客户体验的企业和个人设计。以下是关于魔众商城系统的详细介绍: 商品管理:系统支持轻松上传商品信息、设置价格、库存等参数,并通过精美的商品详情页

下载

[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)启动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端口

在这里插入图片描述

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C语言变量命名
C语言变量命名

c语言变量名规则是:1、变量名以英文字母开头;2、变量名中的字母是区分大小写的;3、变量名不能是关键字;4、变量名中不能包含空格、标点符号和类型说明符。php中文网还提供c语言变量的相关下载、相关课程等内容,供大家免费下载使用。

410

2023.06.20

c语言入门自学零基础
c语言入门自学零基础

C语言是当代人学习及生活中的必备基础知识,应用十分广泛,本专题为大家c语言入门自学零基础的相关文章,以及相关课程,感兴趣的朋友千万不要错过了。

637

2023.07.25

c语言运算符的优先级顺序
c语言运算符的优先级顺序

c语言运算符的优先级顺序是括号运算符 > 一元运算符 > 算术运算符 > 移位运算符 > 关系运算符 > 位运算符 > 逻辑运算符 > 赋值运算符 > 逗号运算符。本专题为大家提供c语言运算符相关的各种文章、以及下载和课程。

362

2023.08.02

c语言数据结构
c语言数据结构

数据结构是指将数据按照一定的方式组织和存储的方法。它是计算机科学中的重要概念,用来描述和解决实际问题中的数据组织和处理问题。数据结构可以分为线性结构和非线性结构。线性结构包括数组、链表、堆栈和队列等,而非线性结构包括树和图等。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

263

2023.08.09

c语言random函数用法
c语言random函数用法

c语言random函数用法:1、random.random,随机生成(0,1)之间的浮点数;2、random.randint,随机生成在范围之内的整数,两个参数分别表示上限和下限;3、random.randrange,在指定范围内,按指定基数递增的集合中获得一个随机数;4、random.choice,从序列中随机抽选一个数;5、random.shuffle,随机排序。

629

2023.09.05

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

562

2023.09.20

c语言get函数的用法
c语言get函数的用法

get函数是一个用于从输入流中获取字符的函数。可以从键盘、文件或其他输入设备中读取字符,并将其存储在指定的变量中。本文介绍了get函数的用法以及一些相关的注意事项。希望这篇文章能够帮助你更好地理解和使用get函数 。

669

2023.09.20

c数组初始化的方法
c数组初始化的方法

c语言数组初始化的方法有直接赋值法、不完全初始化法、省略数组长度法和二维数组初始化法。详细介绍:1、直接赋值法,这种方法可以直接将数组的值进行初始化;2、不完全初始化法,。这种方法可以在一定程度上节省内存空间;3、省略数组长度法,这种方法可以让编译器自动计算数组的长度;4、二维数组初始化法等等。

618

2023.09.22

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号