文档章节

redis学习(二)

玄影镜心
 玄影镜心
发布于 2015/01/20 17:27
字数 1795
阅读 44
收藏 1
点赞 0
评论 0

持久化

1:redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到磁盘来保证持久化,这是相对memcache来说的一个大的优势。

2:redis支持两种持久化方式,一种是 Snapshotting(快照)也是默认方式,另一种是Append-only file(缩写aof)的方式。

方式一:Snapshotting

       快照是默认的持久化方式。这种方式将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以配置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个key被修改就自动做快照,下面是默认的快照保存配置

save 900 1  #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000

方式二:Append-only file
    
aof 比快照方式有更好的持久化性,是由于在使用aof持久化方式时,redis会将每一个收到的写命令都通过write函数追加到文件中(默认是 appendonly.aof)当redis重启时会通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。当然由于os会在内核中缓存 write做的修改,所以可能不是立即写到磁盘上。这样aof方式的持久化也还是有可能会丢失部分修改。不过我们可以通过配置文件告诉redis我们想要 通过fsync函数强制os写入到磁盘的时机。有三种方式如下(默认是:每秒fsync一次)

appendonly yes              //启用aof持久化方式
# appendfsync always      //每次收到写命令就立即强制写入磁盘,最慢的,但是保证完全的持久化,不推荐使用
appendfsync everysec     //每秒钟强制写入磁盘一次,在性能和持久化方面做了很好的折中,推荐
# appendfsync no    //完全依赖os,性能最好,持久化没保证


主从复制

主从复制允许多个slave server拥有和master server相同的数据库副本

下面是关于redis主从复制的一些特点

1.master可以有多个slave

–2.除了多个slave连到相同的master外,slave也可以连接其他slave形成图状结构

–3.主从复制不会阻塞master。也就是说当一个或多个slave与master进行初次同步数据时,master可以继续处理client发来的请求。相反slave在初次同步数据时则会阻塞,不能处理client的请求

–4.主从复制可以用来提高系统的可伸缩性(我们可以用多个slave 专门用于client的读请求,比如sort操作可以使用slave来处理),也可以用来做简单的数据冗余。

-5.可以在master禁用数据持久化,只需要注释掉master 配置文件中的所有save配置,然后只在slave上配置数据持久化

 

事务

•redis对事务的支持目前还比较简单。redis只能保证一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。

Multi          事物开始

Exec          执行事务

Discard     放弃事物

Watch       监听key

Unwatch   放弃所有key的监听

watch 命令会监视给定的key,exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败。

注意watchkey是对整个连接有效的,和事务一样,如果连接断开,监视和事务都会被自动清除。

 

发布订阅(pub/sub )

•发布订阅(pub/sub)是一种消息通信模式。订阅者可以通过subscribe和psubscribe命令向redis server订阅自己感兴趣的消息类型,redis将消息类型称为通道(channel)。

当发布者通过publish命令向redis server发送特定类型的消息时。订阅该消息类型的全部client都会收到此消息。这里消息的传递是多对多的。一个client可以订阅多个 channel,也可以向多个channel发送消息。

Subscribe

Unsubscribe

Psubscribe

Punsubscribe

Publish

 

管道(pipeline)

redis是一个cs模式的tcp server,使用和http类似的请求响应协议。一个client可以通过一个socket连接发起多个请求命令。每个请求命令发出后client通常 会阻塞并等待redis服务处理,redis处理完后请求命令后会将结果通过响应报文返回给client。基本的通信过程如下

 Client: INCR X
Server: 1
Client: INCR X
Server: 2
Client: INCR X
Server: 3
Client: INCR X
Server: 4

基本上四个命令需要8tcp报文才能完成。由于通信会有网络延迟,假如从clientserver之间的包传输时间需要0.125秒。那么上面的四个命令8个报文至少会需要1秒才能完成。 

利用pipeline的方式从client打包多条命令一起发出,不需要等待单条命令的响应返回,而redis服务端会处理完多条命令后会将多条命令的处理结果打包到一起返回给客户端。通信过程如下

Client: INCR X
Client: INCR X
Client: INCR X
Client: INCR X
Server: 1
Server: 2
Server: 3
Server: 4

 

 虚拟内存(VM)

VM的作者已经放弃该功能

•redis没有使用os提供的虚拟内存机制而是自己实现了自己的虚拟内存机制 ,但是思路和目的都是相同的。就是暂时把不经常访问的数据从内存交换到磁盘中,从而腾出内存空间用于其他需要访问的数据。尤其是对于redis这样的内存数据库,内存总是不够用的。除了可以将数据分割到多个redis server外。另外的能够提高数据库容量的办法就是使用vm把那些不经常访问的数据交换的磁盘上。如果我们的存储的数据总是有少部分数据被经常访问,大 部分数据很少被访问,对于网站来说确实总是只有少量用户经常活跃。当少量数据被经常访问时,使用vm不但能提高单台redis server数据库的容量,而且也不会对性能造成太多影响。

vm-enabled yes                          #开启vm功能

vm-swap-file /tmp/redis.swap         #交换的value保存的文件路径/tmp/redis.swap

vm-max-memory 1000000            #最大内存上限,超过后开始交换value到磁盘文件

vm-page-size 32                    #每个页面的大小32个字节

vm-pages 134217728                 #最多使用在文件中使用多少页面

vm-max-threads 4                    #用于执行value对象换入换出的工作线程数量,0表示不使用工作线程


本文转载自:http://www.cnblogs.com/visionwang/p/3234477.html

共有 人打赏支持
玄影镜心
粉丝 8
博文 90
码字总数 49460
作品 0
西安
高级程序员
redis学习笔记(一)之安装测试

以前比较懒,虽说都用redis,但大都是别人部署好后进行简单的使用,最近项目上线,时间较空,所以想在系统的学习一下redis,顺便也能熟悉熟悉linux系统(linux小白,也是正在学习阶段,如果有...

憨豆公子
2016/08/08
19
0
windows下安装和配置Redis

一、下载windows版本的Redis Redis官方提供的是 Linux安装版的,并没有Windows版本的Redis,为了学习 Redis总不能去跑个虚拟机来运行吧,所以在GitHub中有人发布了Windows版本的 Reids ,可以...

zhaojd
2017/11/16
0
0
Redis进阶不得不了解的内存优化细节

声明:本文内容来自《Redis开发与运维》一书第八章。 Redis所有的数据都在内存中,而内存又是非常宝贵的资源。对于如何优化内存使用一直是Redis用户非常关注的问题。本文让我们深入到Redis细...

全部原谅
07/17
0
0
redis学习笔记(三)之其他命令和特性

redis学习笔记(一)之安装测试 redis学习笔记(二)之数据类型 一、基本特性 1、reids 默认端口:6379; 2、默认支持16个数据库,建立连接后自动选择0号数据库,建议不同的应用使用不同的r...

憨豆公子
2016/08/19
21
0
Storm集成Redis

一、Storm集成redis前的准备 首先是需要安装storm和redis环境,具体安装方法可分别去http://storm.apache.org/和http://redis.io查询,安装完成之后 需要准备运行所需要的jar包,除了storm本...

Adel
2016/01/20
1K
0
Laravel5.3之Session源码解析(上)

说明:本文主要通过学习Laravel的session源码学习Laravel是如何设计session的,将自己的学习心得分享出来,希望对别人有所帮助。Laravel在中定义了session中间件,并通过该中间件来设计sessi...

botkenni
2016/11/18
13
0
记录一次面试

最近看书没有动力,公司里面太闲了。想给点压力给自己,如果有好机会也可以跳一下。只投了A和B。结果B家的没有回音,A家面试官打电话过来约面试。 总共面了三次,都是电话面试。我靠着回忆把...

Lubby
2016/01/21
449
7
Redis学习笔记二:Linux/Unix环境下安装与部署redis

一、Redis的安装与部署 Redis的官方下载站是:http://redis.io/download 步骤一:下载安装包 wget http://redis.goolecode.com/files/redis-2.4.17.tar.gz 步骤二:编译源程序 步骤三:移动文...

孟飞阳
2016/07/04
60
0
实现一个 Java 版的 Redis (1)----百行代码解析Redis 协议.

最近看了 Redis 的代码,感觉还是挺简单的.有冲动想用其它语言实现(抄)一个.原来想用 Python 实现来着.后来想想试试 Netty.原因有二 第一:Java 的NIO 和Netty 的 EventLoop 配合起来和 Redis ...

wynwyy
2016/10/20
1K
5
实现一个 Java 版的 Redis (1)----百行代码解析Redis 协议.

最近看了 Redis 的代码,感觉还是挺简单的.有冲动想用其它语言实现(抄)一个.原来想用 Python 实现来着.后来想想试试 Netty.原因有二 第一:Java 的NIO 和Netty 的 EventLoop 配合起来和 Redis ...

庞陆阳
2016/10/26
10
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

iOS安全应该做哪些事情

1. 尽量使用HTTPS协议。 2. 密码提交的时候,密码使用SHA256加密后传输,MD5等经过哈希碰撞已经可以推算出原文。 3. 密码提交的时候,可以加盐。 4. 密码保存在本地的时候,尽量使用钥匙串保...

HOrange
10分钟前
0
0
react native 注意事项

1. 环境参考官网 android studio 必装 java jdk安装 1.8版本(环境建议自己一步一步配置,切记不要 apt ) 2.有改变编译内容发现 会白屏,然后APP消失,请卸载原来的测试 appinfo (连续两次...

304158
17分钟前
0
0
FOMO游戏代码解析

源代码在此处

怎当她临去时秋波那一转
22分钟前
1
0
EOS智能合约与DApp开发入门

EOS的是Block.One主导研发的一个区块链底层公链系统,它专门为支撑商业去中心化 应用(Decentralized Application)而设计,其代码开源。 比特币被称为区块链1.0,因为它开辟了数字加密货币的...

笔阁
34分钟前
1
0
编译cjson到dll

https://blog.csdn.net/mengzhisuoliu/article/details/52203724 编译完成后 是纯lua实现的json decode 的10倍以上...

梦想游戏人
44分钟前
0
0
JS基础- Date 对象

Date 对象 Date 对象用于处理日期和时间。 创建 Date 对象的语法: var myDate=new Date() 注释:Date 对象会自动把当前日期和时间保存为其初始值。 Date 对象属性 属性 描述 constructor 返...

ZHAO_JH
46分钟前
0
0
Python数据分析numpy(1)

Python开源的科学计算基础库 1.表示N维数组对象ndarray 2.线性代数、傅里叶变换、随机数生成 3.广播函数,整合c++、c 一.数据的维度 1.数据 2.数据维度 3.一维数据 (1)特点 (2)Python中的...

十年磨一剑3344
49分钟前
1
0
csv导入Hive脚本

from pyspark.sql import HiveContexthivec = HiveContext(sc) # 创建一个hivecontext对象用于写执行SQL,sc为sparkcontext# 拼接一个字段类型字符串str_s = 'label String,'...

gulf
51分钟前
0
0
TensorFlow 隐含层 拟合 异或运算

a⊕b = (¬a ∧ b) ∨ (a ∧¬b) 数据 X = [[0, 0], [0, 1], [1, 0], [1, 1]]Y = [[0], [1], [1], [0]] 单层网络只能拟合线性问题,由于异或是非线性问题,需要使用多层网络 输入和输出 [[...

阿豪boy
今天
0
0
SVN 教程

http://www.runoob.com/svn/svn-tutorial.html 记一次 svn 管理的项目迁移工作 之前A服务器上的项目版本管理工具是用的SVN,后来,之前管理linux服务器的员工离职了,这管理服务器的工作也就...

yeahlife
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部