运维

快照使用子进程是通过一个子进程完成, 它会比较的浪费资源的操作。

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原理(二)的更多相关文章

  1. Redis系列(二):Redis的数据类型及命令操作

    原文链接(转载请注明出处):Redis系列(二):Redis的数据类型及命令操作 Redis 中常用命令 Redis 官方的文档是英文版的,当然网上也有大量的中文翻译版,例如:Redis 命令参考.这 ...

  2. Redis原理篇

    Redis原理篇 1.发布 订阅模式 1.1列表 的局限 ​ 前面我们说通过队列的 rpush 和 lpop 可以实现消息队列(队尾进队头出),但是消费者需要不停地调用 lpop 查看 List 中是 ...

  3. redis入门(二)

    目录 redis入门(二) 前言 持久化 RDB AOF 持久化文件加载 高可用 哨兵 流程 安装部署 配置技巧 集群 原理 集群搭建 参考文档 redis入门(二) 前言 在redis入门(一)简单 ...

  4. redis(二)高级用法

    redis(二)高级用法 事务 redis的事务是一组命令的集合.事务同命令一样都是redis的最小执行单元,一个事务中的命令要么执行要么都不执行. 首先需要multi命令来开始事务,用exec命令来 ...

  5. word2vec原理(二) 基于Hierarchical Softmax的模型

    word2vec原理(一) CBOW与Skip-Gram模型基础 word2vec原理(二) 基于Hierarchical Softmax的模型 word2vec原理(三) 基于Negative Sa ...

  6. Redis原理与实践总结

    Redis原理与实践总结 本文主要对Redis的设计和实现原理做了一个介绍很总结,有些东西我也介绍的不是很详细准确,尽量在自己的理解范围内把一些知识点和关键性技术做一个描述.如有错误,还望见谅,欢迎指 ...

  7. juc线程池原理(二):ThreadPoolExecutor的成员变量介绍

    概要 线程池的实现类是ThreadPoolExecutor类.本章,我们通过分析ThreadPoolExecutor类,来了解线程池的原理. ThreadPoolExecutor数据结构 Thread ...

  8. 并发之AQS原理(二) CLH队列与Node解析

    并发之AQS原理(二) CLH队列与Node解析 1.CLH队列与Node节点 就像通常医院看病排队一样,医生一次能看的病人数量有限,那么超出医生看病速度之外的病人就要排队. 一条队列是队列中每一个人 ...

  9. Redis 系列(04-2)Redis原理 - 内存回收

    目录 Redis 系列(04-2)Redis原理 - 内存回收 Redis 系列目录 1. 过期策略 1.1 定时过期(主动淘汰) 1.2 惰性过期(被动淘汰) 1.3 定期过期 2. 淘汰策略 2. ...

  10. Redis原理详解

    Redis原理详解 数据类型 Redis最为常用的数据类型主要有以下五种: String Hash List Set Sorted set 在具体描述这几种数据类型之前,我们先通过一张图了解下Redi ...

随机推荐

  1. Java 开源博客 —— Solo 0.6.8 正式版发布了!

    Java 开源博客 -- Solo 0.6.8 正式版发布了,欢迎大家下载.另外,欢迎观摩我们的另一个产品,在线 Golang IDE--Wide! 特性 基于标签的文章分类 博客/标签 Atom/R ...

  2. 紫书 例题 9-14 UVa 1218 (树形dp)

    这道题有个初始值设成1e9, 然后这个值是要加很多次的,然后就会溢出变成负数, 然后就一直WA, 找这个bug找了一个小时--以后不能随便这样设那么大, 要考虑会不会加很多次然后溢出. 讲一下思路. ...

  3. 【Henu ACM Round #13 B】Spider Man

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 会发现每个环可以操作的次数是固定的. (环的大小-1 也就是说一旦环确定了.其实结果就已经确定了. 则直接看操作总数的奇偶性就可以了 ...

  4. UI标签库专题九:JEECG智能开发平台 Choose(选则操作标签)

     1. Choose(选则操作标签) 1.1. 參数 属性名 类型 描写叙述 是否必须 默认值 hiddenName string 隐藏域的ID 否 null hiddenid string 隐藏 ...

  5. Unityclient通信測试问题处理(一)

    Unityclient通信測试问题处理(一) 近期在測试程序的通信模块时.遇到了一个问题:Unity的API函数仅仅能在主线程中调用.而作为client程序,我单独启用了一个监听线程来接收服务端发送的 ...

  6. HDU 2886 Lou 1 Zhuang

    思维好重要.. 对于n+m == k , 当n == m || abs(n-m) == 1 时n*m取得最大值. 设 s = x*(l-x),s = lx-x^2.其导函数为 s' = -1/2x + ...

  7. hdu5288 OO’s Sequence 二分 多校联合第一场

    OO's Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  8. mysql字符设置乱码问题

    在操作系统中对于任意一个字符而言是没有编码格式概念的:同样的字母在不同的编码集里面可能代表不同的东西:关键在于你用什么样的软件打开它,软件本身是以什么样的编码格式来显示你的字符,那么你的字符当前就是什 ...

  9. zhizhang错误(每天更新更新)

    做题反思(Think twice ,Code once) 1.2013NOIP转圈游戏,交代码前一定要静态查错,看看代码写得和自己意思一不一样,竟然把变量n写成了常数10,低级错误 2.2013NOI ...

  10. 小米开源文件管理器MiCodeFileExplorer-源码研究(4)-文件操作工具类FileOperationHelper

    文件操作是非常通用的,注释都写在源代码中了,不多说~需要特别说明的是,任务的异步执行和IOperationProgressListener.拷贝和删除等操作,是比较费时的,采用了异步执行的方式~ An ...