Redis原理(二)
运维
快照使用子进程是通过一个子进程完成, 它会比较的浪费资源的操作。
1.遍历整个内存,会增加系统负担。
2.io操作,降低redis性能。
一般都是主备,备用的进行持久化。
Redis 4.0混合持久化
rdb快照,一般不用,数据丢失太严重。但是aof数据大的时候它的操作慢。
Redis 4.0处理方法 将rdb和aof日志放在一起,aof不是全量,仅仅是在持久化这一段时间的增量。
重启的时候先将rdb的数据读取出来,然后在将aof的全量文件重放。
管道
Redis中的管道是由客户端提供的,不是由服务端提供的,
在管道中的数据越多,它的效果越好。
压力测试
管道的本质
管道本质:
(1)将数据写到操作系统内核为套接字分配的发生缓冲区。
(2)客户端操作系统内核将数据发生缓存的内容发生到网卡,网卡发生到目标网卡。
(3)服务操作系统内核将网卡数据放到内核为套接字分配的接收缓存区中。
(4)服务器进程读取消息进行处理。
(5)处理结束将数据放入到发生缓存区。
write并不是收到才返回,他仅仅将数据放入发送缓存即可,如果缓存满了,那就要等待了。
read也仅仅是将数据读取出来就可以了,如果缓存为空,就需要等待。
事务
Redis数据库不想其他数据库那么的复杂和难以使用,所以也可以不用想使用其他数据库一样的方式使用它们。
基本使用
每个事务都有begin、commit、rollback,begin指示事务的开始,commit提交事务。rollback进行回滚。
begin();
try{
commit()
}catch(Exception e){
rollback();
}
一个完整的事务操作,所有的指令先进入到队列中,然后在exec之前并进行执行,服务器收到exec就会立即执行。单线程也不会担心在执行的过程中被打断。
multi开始事务 exec:执行事务 discard:事务丢弃
test:0>multi
"OK"
test:0>incr books
"QUEUED"
test:0>incr books
"QUEUED"
test:0>exec
1) "1"
2) "2"
test:0>get books
"2"
原子性
事务要么成功,要么失败,Redis中原子性?
test:0>multi
"OK"
test:0>set books iam
"QUEUED"
test:0>incr books
"QUEUED"
test:0>set poorman ide
"QUEUED"
test:0>exec
1) "OK"
2) "ERR value is not an integer or out of range"
3) "OK"
test:0>get books
"iam"
test:0>get poorman
"ide"
上面的代码说明遇到错误后面的代码还可以继续执行。也可以验证不是立即执行的。
结论::原子性他是不存在的,他仅仅是一个隔离,不被打断。
discard(丢弃)
用于丢弃事务中的指令,用于丢弃所有的指令。
test:0>multi
"OK"
test:0>incr books
"QUEUED"
test:0>incr books
"QUEUED"
test:0>discard
"OK"
test:0>exec
"ERR EXEC without MULTI"
在执行了discard之后,事务有关的指令被丢弃。
优化
上面的事务,每次发送一个就会有一次网络请求和返回,但是他并不会执行指令,所以可以将多次网络操作变为一次。一般可以使用pipeline一起使用。
pipe = redis.pipeline(transaction=true);
pipe.muti();
pipe.incr("books");
pipe.ince("books");
values = pipe.execute();
watch
场景描述:两个用户对一个金额进行并发修改,Redis是单线程,所以在执行的时候,基本不会出现并发,这个场景是需要乘以一个数据,Redis并没有这类的方法,操作是将数据的获取到,操作之后见数据写回去,两个就会出现问题。
redis提供了一个分布式锁,也可以使用watch进行操作。
watch的操作是:在事务启动之前顶住一个或者多个关键字,事务执行的时候,服务器收到exec指令,执行指令队列,Redis会检测监听的变量是否发生改变,如果改变了就会返回null。
注意事项:不可以在multi和exec之间执行。
Pubsub
Redis的消息队列,它不支持多播。
消息多播
消息多播允许生产者值生产一次消息,由中间件负责将消息复制到多个消息队列,每个消息队列由相应的消息组进行消费,
用于将消费组逻辑进行拆分,消费组的逻辑就可以放在不同的子系统中。
普通的是将多个消费组串起来进行消费。
pubsub
Redis为了消息多播,不依赖于5中基本的数据结构,而是使用一种新的方式Pubsub,来支持消费。
客户端发起订阅,redis会返回一个消息通知订阅成功。网络原因,客户端先发生,在通过getmessage将消息获取。
如果服务端发布消息,通过get_message获取到数据,如果没发布消息,就返回空,并不会进行堵塞。
他们的生成和消费是在不同的连接里,也就是说使用两个连接,在生产环境中,不会讲二者放在同一个线程的。
伪代码
消费者
client.pubsub();
while true:
msg = p.get_message();
if not msg:
time.sleep(1);
continue();
print msg
client.publish("","");
client.publish("","");
client.publish("","");
client.publish("","");
上面消费者也可以使用监听的方式进行。
for msg in p.listen():
print msg
订阅模式
消费者订阅一个主题就必须指定一个主题的名称,如果订阅多个,那就subscribe多个名称
消费
test:0>publish sub01 kangwang
"1"
订阅多个
test:0>subscribe col.io col.i
Switch to Pub/Sub mode. Close console tab to stop listen for messages.
1) "subscribe"
2) "col.io"
3) "1"
1) "message"
2) "col.io"
3) "i"
1) "message"
2) "col.i"
3) "u"
发布
test:0>publish col.io i
"1"
test:0>publish col.i u
"1"
缺点
PubSub生产者传递一个消息,会直接找到消费者消费掉,没有消费者就会丢弃,如果多个消费者,如果消费者死了,消息就永远的没了。
小对象压缩
Redis将数据放入在数据库中,如果不节约内存就会导致崩溃,所以需要优化存储。
32bit和64bit
redis如果使用32bit进行编译,那么它的数据指针就会占用少一半,如果内存不超过4GB,可以使用32bit进行编译,
小对象压缩存储
内部管理集合数据结构很小,会使用紧凑的形式压缩存储。
Redis的是zplist是一个进村的字节数组结构,每个元素紧挨着,
内存回收机制
Redis总是将空闲的立即归还操作系统, Redis的内存有10GB,如果删除10GB,内存变化不大,原因是通过页来回收的,只有还有一个key使用,就不会被回收,虽然删除,但是这一个GB,是分散在不同的位置,其他的页上还有key,所以就不会被回收。
如果做个狠人,执行了flushdb,内存就会发生大的变换,它将所有数据都干掉了。。
所说不会立即的删除key的内存,但是位置在,下一波数据来了还可以继续存放。
内存分配算法
内存分配是一个非常复杂的课题,适当的算法划分内存页,Redis将内存管理交给第三方来进行管理,使用jemalloc进行内存管理。也可以切换到tcmalloc,j的性能比t的好一点。
info memary 查看内存分配算法
test:0>info memory
"# Memory
used_memory:773960
used_memory_human:755.82K
used_memory_rss:737048
used_memory_rss_human:719.77K
used_memory_peak:808448
used_memory_peak_human:789.50K
total_system_memory:0
total_system_memory_human:0B
used_memory_lua:37888
used_memory_lua_human:37.00K
maxmemory:104857600
maxmemory_human:100.00M
maxmemory_policy:noeviction
mem_fragmentation_ratio:0.95
mem_allocator:jemalloc-3.6.0
"
Redis原理(二)的更多相关文章
- Redis系列(二):Redis的数据类型及命令操作
原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...
- Redis原理篇
Redis原理篇 1.发布 订阅模式 1.1列表 的局限 前面我们说通过队列的 rpush 和 lpop 可以实现消息队列(队尾进队头出),但是消费者需要不停地调用 lpop 查看 List 中是 ...
- redis入门(二)
目录 redis入门(二) 前言 持久化 RDB AOF 持久化文件加载 高可用 哨兵 流程 安装部署 配置技巧 集群 原理 集群搭建 参考文档 redis入门(二) 前言 在redis入门(一)简单 ...
- redis(二)高级用法
redis(二)高级用法 事务 redis的事务是一组命令的集合.事务同命令一样都是redis的最小执行单元,一个事务中的命令要么执行要么都不执行. 首先需要multi命令来开始事务,用exec命令来 ...
- word2vec原理(二) 基于Hierarchical Softmax的模型
word2vec原理(一) CBOW与Skip-Gram模型基础 word2vec原理(二) 基于Hierarchical Softmax的模型 word2vec原理(三) 基于Negative Sa ...
- Redis原理与实践总结
Redis原理与实践总结 本文主要对Redis的设计和实现原理做了一个介绍很总结,有些东西我也介绍的不是很详细准确,尽量在自己的理解范围内把一些知识点和关键性技术做一个描述.如有错误,还望见谅,欢迎指 ...
- juc线程池原理(二):ThreadPoolExecutor的成员变量介绍
概要 线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析ThreadPoolExecutor类,来了解线程池的原理. ThreadPoolExecutor数据结构 Thread ...
- 并发之AQS原理(二) CLH队列与Node解析
并发之AQS原理(二) CLH队列与Node解析 1.CLH队列与Node节点 就像通常医院看病排队一样,医生一次能看的病人数量有限,那么超出医生看病速度之外的病人就要排队. 一条队列是队列中每一个人 ...
- Redis 系列(04-2)Redis原理 - 内存回收
目录 Redis 系列(04-2)Redis原理 - 内存回收 Redis 系列目录 1. 过期策略 1.1 定时过期(主动淘汰) 1.2 惰性过期(被动淘汰) 1.3 定期过期 2. 淘汰策略 2. ...
- Redis原理详解
Redis原理详解 数据类型 Redis最为常用的数据类型主要有以下五种: String Hash List Set Sorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Redi ...
随机推荐
- Android控件-单选按钮RadioButton
RadioGroup单选按钮用法,还是先看效果图 先中后,点RadioGroup测试按钮,可在标题栏显示选择结果,点清除可以清除选择.下面上代码,main.xml: <RadioGroup an ...
- AnkhSvn介绍 插件
转载:http://www.cnblogs.com/lyhabc/articles/2483011.html AnkhSVN是一款在VS中管理Subversion的插件,您可以在VS中轻松的提交.更新 ...
- 线程框架Executor的用法举例
java5线程框架Executor的用法举例 Executor 是 java5 下的一个多任务并发执行框架(Doug Lea),可以建立一个类似数据库连接池的线程池来执行任务.这个框架主要由三个接口和 ...
- NARF(Normal Aligned Radial Feature)关键点
NARF(Normal Aligned Radial Feature)关键点是为了从深度图像中识别物体而提出的,对NARF关键点的提取过程有以下要求: a) 提取的过程考虑边缘以及物体表面变化信息在内 ...
- How Javascript works (Javascript工作原理) (十三) CSS 和 JS 动画底层原理及如何优化其性能
个人总结:读完这篇文章需要20分钟. 这是 JavaScript 工作原理的第十三章. 概述 正如你所知,动画在创建令人叹服的网络应用中扮演着一个关键角色.由于用户越来越注重用户体验,商户开始意识到完 ...
- webstorm配置less解析的方法
1.安装node.js 2.npm 安装less, npm install -g less 2.1 lessc style.less styles.css 编译 2.2 lessc –clean-cs ...
- 【转】一篇关于32位Linux内核使用大内存的文章——Hugemem Kernel Explained &nb
红旗DC系列Linux操作系统(x86平台)中带有四类核心: UP (支持单内核) SMP (支持多内核) hugemem Icc* (用intel C编译器编译的核心) 其中hugemem核心往往引 ...
- 检查类型是否包含iterator
- c#+windows api SetWindowsHookEx 全局钩子 demo 下载
效果图 源代码下载地址: http://download.csdn.net/detail/dhfekl/7522141
- java对象和json数据转换实现方式1-使用json-lib实现
測试代码: package com.yanek.util.json; import java.util.ArrayList; import java.util.List; import net.sf. ...