文档章节

redis 深入学习笔记

之渊
 之渊
发布于 09/01 20:51
字数 2363
阅读 22
收藏 0

速度快-内存

 

多种数据结构

 

 

bitMaps 比如布隆过滤器, HyperLogLog 精确性不够, 

常用配置

默认不是守护进程, 实际一般都是 设置为 守护进程

daemonize yes

通用命令

keys 命令一般在生产环境不使用,生产环境key 太多了,比较慢,而且会阻塞其他命令。最后不用,否则容易出现影响使用的问题。

keys* 可以在 从节点使用或者 scan 

 

dbsize 可以在生产环境随便使用

 

redis 是单线程的

 

 

字符串

key 和value 都是 字节存储的,一般都是 限制在 100K左右大小

 

 

 

中文里面一个 文字就是 2个长度

 

 

hash

 

 

 

 

小心使用 hgetall 特别是 内容特别多时候

 

list

有序,可以重复,左右两边插入与弹出

 

 

 

 

 

 

 

 

灵活运行实现不同功能

set

无序,无重复,集合间操作(交集,并级等)

smembers 无序,小心使用,内容太多了就不好

spop从集合弹出,且弹出一个。 srandmember 不会破坏集合

 

sadd 可以用于 标签 业务需求,

sadd + sinter 可以用于 社交类 业务

zset 有序集合

 

 

 

Jedis


jedis 连接池配置

建议false 是因为 特别在高并发下,也影响性能,而且 可以通过 redis 配置来达到 连接基本永远活性

合适maxTotal 比较难确定

 

常见问题

4. 网络或者DNS异常等原因

 

redis 慢查询

执行命令的时候 执行很慢,才属于慢查询

客户端超时不一定慢查询,但慢查询是客户端超时的一个可能因素

 

慢查询保存在内存中,redis 重启之后就没有了

slowlog-log-slower-than 慢查询阈值

 

配置,可以启动时候配置,也可以动态配置

 

命令

 

  1. slowlog-log-slower-than不要设置过大,默认是10ms,通常设置1ms
  2. slowlog-max-len不要设置过小,通常设置1000左右

    定期持久化慢查询(使用开源软件或者其他手段去持久化慢查询记录),就可以 查看历史的慢查询了

pipeline 流水线

主要是为了 节约网络时间, 提高通信效率

 

原生M操作是原子的。而 pipeline 命令不是原子的,会对命令进行拆分为小的命令

 

发布订阅



命令

发布

 

订阅

取消订阅

 

 

bitmap 位图

value 只能是 0 或者1 

 

 

HyperLogLog

 

GEO 地理信息定位

 

 

geo 在 3.2 版本以上才有

持久化

 

RDB

触发机制: save (同步,将阻塞redis), bgsave(异步), 自动 

save 与 bgsave

 

自动生成RDB

 

配置

rdbcompression 是否采用压缩方式存储, rdbchecksum 是否 检验

不容忽略方式

1, 全量复制,  2, debug reload  ,  3.  shutdown (可以在关闭时候,生成 rdb)

通常情况下不会去 配置 save 的 自动配置

RDB耗时,耗性能,不可控,容易丢失数据

AOF

默认就是AOF策略就是everysec 这样最多会丢失一秒内的数据‘

no策略也就是 默认按照操作系统来将缓冲数据刷新到 AOF文件。

一般都是 使用 everysec

 

 

AOF自动重写

 

配置

 

可以使用RDB 做备份来集中管理

使用AOF要考虑到 系统内存,需要预留一些内存给AOF的

 

fork 操作

https://www.jianshu.com/p/4425475fb596

info:latest_fork_usec  即上一次fork的微秒数,如果这个比较大,可能会在fork时候阻塞 redis

maxmemory 越大fork 越久

子进程开销和优化

 

硬盘优化

redis 主从复制 及优化

redis 可以有 1主多从,

可以进行读写分离: 写主节点,读从节点

主从配置

1, salveof 命令

当主复制数据给从的时候,会将从服务的数据给清除掉

slaveof no noe 取消复制

2,配置

slaveof ip port

slave-read-only yes

主从之间是  全量复制的

故障处理

使用sentinel 做故障转移

主从复制问题

可以在从节点 做 备份也就是 做 rdb 的备份。这样可以减轻 主节点的压力

1, 读写分离

从节点不能删除过期数据,所以会读到过期数据

读写不好做,那就不要读写分离了,扩容 优化master好了

2. 主从配置不一致

 

3. 规避全量复制

 

4. 规避复制风暴

可以采用:主节点分散多机器

 

Redis Sentinel

sentinel 可以管理多套 redis 主从

sentinel 的redis客户端介入流程

master 节点变化时候, sentinel 会去通知客户端的

 

sentinel 原理与三个定时任务

 

手动故障转移,下线

 

 

高可用读写分离

 

Redis Cluster 分布式集群

呼唤集群

1. 单机可以并发量 10万/每秒

业务需要100W/每秒

2. 数据量

机器内存一般16到 256G内存,但是业务需要500G以上?

3. 规模化需求

数据分布

取余分区

 

虚拟槽分区

将槽范围给不同的redis 节点去管理。

执行的时候, 使用key 去算出来去哪个节点去操作。比如取数据,

如果对应的redis 节点有数据那么就取出来数据返回,如果发现 没有数据,那么其会知道应该去哪个节点去取数,然后再去对应redis节点去执行取数即可。

 

节点: cluster-enable:yes 就是以集群方式 启动

即节点之间可以互相通信,所以节点共享信息

特性:

1, 复制:每个 节点 都是 可以 有主从的,且 主挂了从可以变为主节点

2. 高可用

3. 分片 : 即有多个主节点,可以进行 读写分离

安装配置

原生命令安装

开启节点和 开启redis 命名一样, 比如  redis-server redis-conf 一样

cluster-require-full-coverage yes 即当某一个节点挂了,那么整个集群都不对外提供服务。一般是no

 

redis-trib 搭建分布式集群

1, 需要ruby 环境

 

如果ruby 以上安装不成功, 就是 ruby -v 没成功

就可以使用 另一种方式去安装

sudo yum install ruby

http://www.ruby-lang.org/zh_cn/documentation/installation/#yum

 

replicats 1 代表 每个集群 开启一个对应的从节点

./redis-trib.rb create --replicas 1 127.0.0.1:8000 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 127.0.0.1:8005


>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:8000
127.0.0.1:8001
127.0.0.1:8002
Adding replica 127.0.0.1:8003 to 127.0.0.1:8000
Adding replica 127.0.0.1:8004 to 127.0.0.1:8001
Adding replica 127.0.0.1:8005 to 127.0.0.1:8002


总共6个然后选择3个做主,其他做对应主的从

集群伸缩

 

扩容: 准备新节点, 加入集群,迁移槽和数据

加入一个新节点,肯定要准备两个redis了,这样就可以做一主一从,一一对应

一般来说,都是一主两从 。 可以做备份扩展与故障转移

 

集群收缩

槽迁移比如命令:

./redis-trib.rb reshard --from a785112f55f4415a5957689023d765eb45613cb7 --to 2dd4ef24bd12bdd1fb54337ad2516240925412ae --slots 2 127.0.0.1:8006
 

忘记节点可以使用  redis-trib.rb 命名去做节点的下线

./redis-trib.rb del-node 127.0.0.1:8000 a785112f55f4415a5957689023d765eb45613cb7


客户端路由

 

 

 

 

 

smart客户端

 

 

 

多节点操作

 

批量操作优化

 

 

并行执行只需要一次网络时间

 

故障转移

 

运维常见问题

带宽消耗

官方建议集群节点不要超过1000个

 

 

集群数据倾斜

 

读写分离

 

redis cluster 不建议使用 读写分离

数据迁移

分布式集群与单机

 

 

缓存使用与优化

收益

成本

使用场景

缓存更新策略

缓存粒度

缓存穿透

解决

1. 缓存空对象

不一致的话,可以 使用消息队列刷新缓存,最终一致

缓存雪崩

优化

无底洞问题

更多机器!= 更高的性能, 是不一定的。

批量接口需求 等(mget,mset)

数据增长与水平扩展需求

优化IO

 

热地key重建优化

就是有 线程等待的问题

永不过期

 

 

Redis云平台CacheCloud

 

redis 分布式布隆过滤器

所以用布隆过滤器就适合。

 

本地布隆过滤器

http://ifeve.com/google-guava-hashing/

 

 

分布式布隆过滤

 

redis 开发规范

key 设计

 

value 设计

bigkey

序列化消耗太多CPU

bigkey 越大,删除越慢

lazy delete 不会阻塞 redis

先删除 小内容,最后整个删除。比如 map 先 将内容都删除,再将map 删除

选择合理的数据结构

 

 

键值生命周期

命令优化

或者monitor 在redis 本地执行

 

redis客户端优化



连接池参数优化

如何预估最大连接池

 

客户端执行命令越短,maxTotal 就可以设置的越小

redis 内存优化

内存消耗

客户端缓存区

 

对象内存

内存碎片

内存溢出策略

 

内存优化

合理选择数据结构,



客户缓存区优化

客户端溢出

其他方法

 

大数据,冷数据, 不适合放在redis中

关系型,消息队列 数据也不适合放在 redis 中

 

开发运维的坑

Linux 内核优化 适合 redis



overcommit

 

swappiness

THP

加快 fork  ,坏处就是 可能出现 慢查询

OOM killer

NTP 时钟 保证机器之间 时钟一致

ulimit

TCP backlog

 

安全的redis

 

安全七法

设置密码

 

热点key

 

 

 

以上是找到 热点key 的思路

 

 

 

 

 

 

 

 

 

 

 

 

本文转载自:https://coding.imooc.com/lesson/151.html

之渊
粉丝 14
博文 648
码字总数 199921
作品 0
佛山
程序员
私信 提问
Lind.DDD.Repositories.Redis层介绍

之前已经发生了 大叔之前介绍过关于redis的文章,有缓存,队列,分布式pub/sub,数据集缓存以及仓储redis的实现等等,而今天在Lind.DDD的持久化组件里,redis当然也有一席之地,作为当今最红...

mcy247
2017/12/07
0
0
spring cache + redis整合

谨以此做个笔记。 平时我们使用的redis无非是用作缓存以及分布式session,其他的作用就视项目需求而定了。 这里主要讲讲redis作为缓存的作用。 使用redis做缓存,可以选择单独使用,也可以和...

疯狂的米老鼠
2017/12/11
0
0
Redis 开源文档《Redis设计与实现》

Redis是运用比较广泛的NoSQL产品之一,目前的稳定版本是2.6.10,包括Github、Instagram、Blizzard、新浪微博等都在产品中大量使用了Redis。其代码基于BSD协议开源,整个项目代码量只有2万多行...

桂荣
2013/03/14
7.1K
21
编程类开放书籍荟萃(转载)

关于开源图书有人在网络上做了大量整理,本文为大家刊载《免费的编程中文书籍索引》 国外程序员在 stackoverflow 推荐的程序员必读书籍,中文版。 stackoverflow 上的程序员应该阅读的非编程...

行者PHPer
2016/10/09
168
0
开源电子书

目录 语言无关类 操作系统 智能系统 分布式系统 编译原理 函数式概念 计算机图形学 WEB服务器 版本控制 编辑器 NoSQL PostgreSQL MySQL 管理和监控 项目相关 设计模式 Web 大数据 编程艺术 ...

zting科技
2017/12/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

【TencentOS tiny】深度源码分析(4)——消息队列

消息队列 在前一篇文章中【TencentOS tiny学习】源码分析(3)——队列 我们描述了TencentOS tiny的队列实现,同时也点出了TencentOS tiny的队列是依赖于消息队列的,那么我们今天来看看消息...

杰杰1号
22分钟前
6
0
Hive

这就是那个 JAVA 类 package cn.itcast.bigdata;import java.util.HashMap;import org.apache.hadoop.hive.ql.exec.UDF;public class PhoneNbrToArea extends UDF{privat......

Garphy
22分钟前
6
0
Springboot开发,第二天

SpringBoot学习,第二天 目录:1、Springboot整合Listener 2、Springboot访问静态资源 3、异常处理 4、热部署 一、SpringBoot整合Listener 两种方式完成组件的注册 1、通过注解扫描完成组件的...

有一个小阿飞
25分钟前
7
0
BeginnersBook Perl 教程

来源:ApacheCN BeginnersBook 翻译项目 译者:飞龙 协议:CC BY-NC-SA 4.0 贡献指南 本项目需要校对,欢迎大家提交 Pull Request。 请您勇敢地去翻译和改进翻译。虽然我们追求卓越,但我们并...

ApacheCN_飞龙
38分钟前
5
0
我的Java秋招面经大合集

阿里面经 阿里中间件研发面经 蚂蚁金服研发面经 岗位是研发工程师,直接找蚂蚁金服的大佬进行内推。 我参与了阿里巴巴中间件部门的提前批面试,一共经历了四次面试,拿到了口头offer。 然后我...

Java技术江湖
43分钟前
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部