Redis 学习之持久化机制、发布订阅、虚拟内存
该问使用centos6.5 64位 redis3.2.8
一、持久化机制
Redis是一个支持持久化的内存数据库,redis会经常将内存中的数据同步到硬盘上来保证数据持久化,从而避免服务器宕机数据丢失问题,或者减少服务器内存消耗提高性能。
持久化方式:
1、Snapshotting:快照,redis默认持久化方式,这种方式是将内存中的数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照。
Save 900 1 #900秒内如果有超过1个key被修改,则发起快照保存。
Save 300 10 #300秒内如果有超过10个key被修改,则发起快照保存。
Save 60 1000 #60秒内如果有超过1000个 key被修改,则发起快照保存。
################################ SNAPSHOTTING ################################
#
# Save the DB on disk:
#
# save <seconds> <changes>
#
# Will save the DB if both the given number of seconds and the given
# number of write operations against the DB occurred.
#
# In the example below the behaviour will be to save:
# after sec ( min) if at least key changed
# after sec ( min) if at least keys changed
# after sec if at least keys changed
#
# Note: you can disable saving completely by commenting out all "save" lines.
#
# It is also possible to remove all the previously configured save
# points by adding a save directive with a single empty string argument
# like in the following example:
#
# save "" save
save
save
注意:该方式每次做快照都有一个时间间隔,如果服务器在间隔内宕机,那在间隔内修改的数据将不能持久化到磁盘中。建议使用 aof方式。
2、Append-only file :aof方式
Aof方式原理:redis会将每一个收到的写命令都通过write函数追加到文件中(aof文件),当redis重启时会通过重新执行该文件保存的写命令来在内存中重建整个数据库的内容。由于操作系统 OS 会在内核中缓存write做的修改,所以可能不会立即写到磁盘中。这样aof方式的持久化也还是可能丢失数据。但我们可以通过配置文件告诉redis我们想通过fsync函数强制os写入到磁盘中。
配置aof:
Appendonly yes #启用aof持久化方式
Appendfsync always #收到写入命令就立即写入磁盘,效率最慢,但会保证完全的数据次持久化
Appendfsync everysec #每秒中写入磁盘一次,在性能和持久化之间做了很好的折中。
Appendfsync no # 完全以来OS,性能最好,但在持久化方面没保证。
实例:
appendonly yes # The name of the append only file (default: "appendonly.aof") appendfilename "appendonly.aof" # The fsync() call tells the Operating System to actually write data on disk
# instead of waiting for more data in the output buffer. Some OS will really flush
# data on disk, some other OS will just try to do it ASAP.
#
# Redis supports three different modes:
#
# no: don't fsync, just let the OS flush the data when it wants. Faster.
# always: fsync after every write to the append only log. Slow, Safest.
# everysec: fsync only one time every second. Compromise.
#
# The default is "everysec", as that's usually the right compromise between
# speed and data safety. It's up to you to understand if you can relax this to
# "no" that will let the operating system flush the output buffer when
# it wants, for better performances (but if you can live with the idea of
# some data loss consider the default persistence mode that's snapshotting),
# or on the contrary, use "always" that's very slow but a bit safer than
# everysec.
#
# More details please check the following article:
# http://antirez.com/post/redis-persistence-demystified.html
#
# If unsure, use "everysec". # appendfsync always
appendfsync everysec
# appendfsync no
测试aof是否成功:
重启redis:
[root@localhost etc]# pkill redis-server
[root@localhost etc]# cd ../bin
[root@localhost bin]# ./redis-server /usr/local/redis/etc/redis.conf
链接客户端:
[root@localhost bin]# ./redis-cli -a jalja
127.0.0.1:6379> set addr bj
OK
查看 bin下是否存在aof文件
[root@localhost bin]# ll
总用量 26356
-rw-r--r--. 1 root root 54 2月 18 22:56 appendonly.aof
-rw-r--r--. 1 root root 97 2月 18 22:55 dump.rdb
-rw-r--r--. 1 root root 566 2月 17 22:51 mkreleasehdr.sh
-rw-r--r--. 1 root root 5578343 2月 17 22:52 redis-benchmark
-rw-r--r--. 1 root root 22217 2月 17 22:51 redis-check-aof
-rw-r--r--. 1 root root 7827978 2月 17 22:52 redis-check-rdb
-rwxr-xr-x. 1 root root 5707211 2月 17 22:52 redis-cli
-rwxr-xr-x. 1 root root 7827978 2月 17 22:52 redis-server
在这里出现了appendonly.aof文件打开该文件
[root@localhost bin]# cat appendonly.aof
*
$
SELECT
$ *
$
set
$
addr
$
bj
二、发布及订阅消息
发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似。pub /sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者在物理部署上的耦合。redis作为一个pub/sub server,在订阅者和发布者之间起到了消息路由的功能。订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道(channel)。当发布者通过publish命令向redis server发送特定类型的消息时。订阅该消息类型的全部client都会收到此消息。这里消息的传递是多对多的。一个client可以订阅多个 channel,也可以向多个channel发送消息。
1、开启两个订阅session
session1:
127.0.0.1:> subscribe tv1 订阅频道tv1
Reading messages... (press Ctrl-C to quit)
) "subscribe"
) "tv1"
) (integer)
session2:
127.0.0.1:> subscribe tv1 tv2 订阅频道tv1和tv2
Reading messages... (press Ctrl-C to quit)
) "subscribe"
) "tv1"
) (integer)
) "subscribe"
) "tv2"
) (integer)
2、开启发布session 在这里我们发布两个频道的信息
127.0.0.1:> publish tv1 "Hello word" #给频道tv1发布信息
(integer) 2 # tv1的订阅者2位
127.0.0.1:> publish tv2 "Hello tv2" #给频道tv2发布信息
(integer) 1 # tv2的订阅者1位
127.0.0.1:>
3、再次查看两个订阅频道
session1:
127.0.0.1:> subscribe tv1
Reading messages... (press Ctrl-C to quit)
) "subscribe"
) "tv1"
) (integer)
) "message" #获取了tv1发布的信息
) "tv1"
) "Hello word"
session2:
127.0.0.1:> subscribe tv1 tv2
Reading messages... (press Ctrl-C to quit)
) "subscribe"
) "tv1"
) (integer)
) "subscribe"
) "tv2"
) (integer)
) "message" #获取了tv1发布的信息
) "tv1"
) "Hello word"
) "message" #获取了tv2发布的信息
) "tv2"
) "Hello tv2"
三、虚拟内存的使用
Redis的虚拟内存与操作系统中的虚拟内存不是一回事,但思路相同。就是将不经常访问的数据从内存交换到磁盘中,从而腾出宝贵的内存空间用户其他需要访问的数据,这对于redis这样的内存数据库来说很重要,除了可以将数据分割到多个redis server外。另外能够提高数据库容量的方式就是使用虚拟内存把哪些不经常访问的数据交换到磁盘上。
配置方式( redis.conf):
Vm-enable yse #开启虚拟内存
Vm-swap-file /tmp/redis.swap #交换出来的value保存文件路径
Vm-max-memory 1000000 #redis使用最大内存的上限
Vm-page-size 32 #每个页面的大小32字节
Vm-pages 134217728 #最多使用多少个页面
Vm-max-threads 4#用于执行value对象换入缓存的工作线程数量
四、redis的缓存更新策略
相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:
voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
Redis 学习之持久化机制、发布订阅、虚拟内存的更多相关文章
- Redis事务、持久化、发布订阅
一.Redis事物 1. 概念 Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证: 事务是一个单独的隔离操作:事务中的所有命令都会序列化.按顺序地执行.事务在执行的过程中,不会被其他 ...
- php redis pub/sub(Publish/Subscribe,发布/订阅的信息系统)之基本使用
一.场景介绍 最近的一个项目需要用到发布/订阅的信息系统,以做到最新实时消息的通知.经查找后发现了redis pub/sub(发布/订阅的信息系统)可以满足我的开发需求,而且学习成本和使用成本也比较低 ...
- redis学习教程三《发送订阅、事务、连接》
redis学习教程三<发送订阅.事务.连接> 一:发送订阅 Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息.Redi ...
- Redis提供的持久化机制(RDB和AOF)
Redis提供的持久化机制 Redis是一种面向"key-value"类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却 ...
- Redis提供的持久化机制(一)
Redis提供的持久化机制 redis是一个内存数据库,也就是说它的所有的数据都是保存在内存中的,而内存中的数据当程序结束时就会消失,所以我们要想办法把内存中的数据写到磁盘中.当程序异常退出或者正常退 ...
- Redis提供的持久化机制(RDB和AOF)【转载】
Redis提供的持久化机制 Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却十分迅速. 近 ...
- Redis提供的持久化机制
Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却十分迅速. 近日,Redis的作者在博客中写到, ...
- redis提供的持久化机制(rdb,aof)
Redis提供的持久化机制 Redis是一种面向“key-value”类型数据的分布式NoSQL数据库系统,具有高性能.持久存储.适应高并发应用场景等优势.它虽然起步较晚,但发展却十分迅速. 近日,R ...
- redis教程(一)-----redis数据类型、基本命令、发布订阅以及持久化
简介 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发工作由VMwa ...
随机推荐
- Android点击Button按钮的四种事件监听方法总结
首先我们在activity_main.xml里面先定义一个Button空间 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 <RelativeLayout xmlns:a ...
- uos事件控制块与任务同步
Ucos为了任务之间的通讯定义了信号量,互斥性信号量,消息对象 消息队列等结构以及api,为了统一的管理这些同步,定义了一个结构叫做时间控制块OS_EVENT,如下 typedef struct os ...
- Node.js timer的优化故事
前几天nodejs发布了新版本4.0,其中涉及到一个更新比较多的模块,那就是下面要介绍的timer模块. timers: Improved timer performance from porting ...
- 安装及配置jdk和tomcat
系统变量 新建 JAVA_HOME 变量 .变量值填写jdk的安装目录(如是 E:\Java\jdk1.7.0_25) 系统变量→找到 Path 变量→编辑 在变量值最后输入 %JAVA_HOME%\ ...
- java系列--JDBC连接oracle
<oracle开发实战经典><oracle DBA从入门到精通> JDBC连接数据库 JNDI连接池 oracle.jdbc.driver.OracleDriver 其实就是一 ...
- jquery中html()或text()方法获取或设置p标签的值
html()方法可以用来读取或者设置某个元素中的HTML内容,text()方法可以用来读取或者没置某个元素中的文本内容 html()方法 此方法类似于JavaScript中的innerHTML属性,可 ...
- iOS 之 微信开发流程
第1阶段 注册开放平台帐号 注册成为微信开放平台开发者 立即注册 认证开发者资质 开发者资质认证通过后才可申请微信支付,申请审核服务费:300元/次 立即认证 创建APP并提交审核 提交你的APP基本 ...
- 2.5. Integer 16 、Integer 32、Integer 64(Core Data 应用程序实践指南)
Core Data 使用 “带符号的整数”,通常我们会选择Integer 32,如果不够,可以升级为Integer 64 (第3章),通过升级托管对象模型. 这三种类型对应的特性(Property)类 ...
- PHP格式化字符串函数 sprintf()
定义和用法 sprintf() 函数把格式化的字符串写入一个变量中. 语法 sprintf(format,arg1,arg2,arg++) 参数 描述 format 必需.转换格式. arg1 必需. ...
- JavaSwing JScrollPane的使用
JavaSwing JScrollPane的使用: 参考:http://duyz.blog.ifeng.com/article/340649.html package com.srie.test; i ...