速度快-内存

多种数据结构


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 慢查询阈值

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

命令

- slowlog-log-slower-than不要设置过大,默认是10ms,通常设置1ms
- 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 的思路




