速度快-内存
多种数据结构
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 的思路