Java最新大厂Redis性能优化指南(1),13分钟彻底搞懂分布式系统服务注册与发现原理

最后

金三银四到了,送上一个小福利!

image.png

image.png

专题+大厂.jpg

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

hash-max-ziplist-value 64

zset-max-ziplist-value 64

4 CPU优化

======================================================================

不要阻塞,特别是 lua 脚本,不要有长时间睡眠操作,不然其它操作全部阻塞!

谨慎使用范围操作

SLOWLOG get 10 默认10ms,默认只保留最后的128条

5 key设计

======================================================================

可读性和可管理性


以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id

简洁性


保证语义的前提下,控制key的长度,当key较多时,内存占用也不容忽视

不要含特殊字符


比如:包含空格、换行、单双引号以及其他转义字符

6 value设计

========================================================================

  • 拒绝bigkey(防止网卡流量、慢查询), string类型控制在10KB以内, hash、 list. set. zset元素 个数不要超过5000

  • 选择适合的数据类型

  • 控制key的生命周期,redis不是垃圾桶

7 分区

===================================================================

多个业务系统,共用一个redis,还是应该分开。规划好key,特别是前缀,a.b.c.d

如果缓存数据变大了,就可以分区,但注意按业务垂直拆分,避免 key 的冲突。

一般小公司研发团队都是需要申请缓存资源直接得到对应的 ip 地址,但大公司最多只能得到key/token。

8 Big Key

========================================================================

那么什么样的Key才算是Big Key呢?

一般key的值大于10KB时可以算是Big Key了。

如下场景都有可能遇到Big Key,比如:

  • 粉丝列表

  • 统计数据,比如PV或者UV统计

  • 使用不当的数据缓存,比如通过String保存序列化后的用户数据等

出现了Big Key你也不用非常紧张,因为某些场景下不得不使用,而不应该是你的使用不当造成的。下面我们看一下如何进行发现与优化

查询 Big Key


可以使用脚本进行查询,大概思路就是使用 scan 游标查询 key,然后使用 memory usage key 获取这个 key 与 value 的字节数,这样就能很方便的得出结论进行优化。比如

import sys

import redis

def check_big_key(r, k):

bigKey = False

length = 0

try:

type = r.type(k)

if type == “string”:

length = r.strlen(k)

elif type == “hash”:

length = r.hlen(k)

elif type == “list”:

length = r.llen(k)

elif type == “set”:

length = r.scard(k)

elif type == “zset”:

length = r.zcard(k)

except:

return

if length > 10240:

bigKey = True

if bigKey :

print db,k,type,length

def find_big_key_normal(db_host, db_port, db_password, db_num):

r = redis.StrictRedis(host=db_host, port=db_port, password=db_password, db=db_num)

for k in r.scan_iter(count=1000):

check_big_key(r, k)

def find_big_key_sharding(db_host, db_port, db_password, db_num, nodecount):

r = redis.StrictRedis(host=db_host, port=db_port, password=db_password, db=db_num)

cursor = 0

for node in range(0, nodecount) :

while True:

iscan = r.execute_command(“iscan”,str(node), str(cursor), “count”, “1000”)

for k in iscan[1]:

check_big_key(r, k)

cursor = iscan[0]

print cursor, db, node, len(iscan[1])

if cursor == “0”:

break;

if name == ‘main’:

if len(sys.argv) != 4:

print 'Usage: python ', sys.argv[0], ’ host port password ’

exit(1)

db_host = sys.argv[1]

db_port = sys.argv[2]

db_password = sys.argv[3]

r = redis.StrictRedis(host=db_host, port=int(db_port), password=db_password)

nodecount = r.info()[‘nodecount’]

keyspace_info = r.info(“keyspace”)

for db in keyspace_info:

print 'check ', db, ’ ', keyspace_info[db]

if nodecount > 1:

find_big_key_sharding(db_host, db_port, db_password, db.replace(“db”,“”), nodecount)

else:

find_big_key_normal(db_host, db_port, db_password, db.replace(“db”, “”))

可以通过 python find_bigkey host 6379 password 来执行,默认大 key 的阈值为 10240(10KB),也就是对于 string 类型的 value 大于 10240 的认为是大 key,对于 list 的话如果 list 长度大于 10240 认为是大 key,对于 hash 的话如果 field 的数目大于 10240 认为是大 key。另外默认该脚本每次搜索 1000 个 key,对业务的影响比较低,不过最好在业务低峰期进行操作,避免 scan 命令对业务的影响。

删除 Big Key


Redis4.0 新特性 - Lazy Free

当删除键的时候, redis 提供异步延时释放 key 内存的功能,把 key 释放操作放在 bio(Background I/O) 单独的子线程处理中,减少删除 big key 对 redis 主线程的阻塞。有效地避免删除 big key 带来的性能和可用性问题。因此删除 Big Key 时使用 unlink 操作。

9 复制

===================================================================

最后

权威指南-第一本Docker书

引领完成Docker的安装、部署、管理和扩展,让其经历从测试到生产的整个开发生命周期,深入了解Docker适用于什么场景。并且这本Docker的学习权威指南介绍了其组件的基础知识,然后用Docker构建容器和服务来完成各种任务:利用Docker为新项目建立测试环境,演示如何使用持续集成的工作流集成Docker,如何构建应用程序服务和平台,如何使用Docker的API,如何扩展Docker。

总共包含了:简介、安装Docker、Docker入门、使用Docker镜像和仓库、在测试中使用Docker、使用Docker构建服务、使用Fig编配Docke、使用Docker API、获得帮助和对Docker进行改进等9个章节的知识。

image

image

image

image

关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

关于阿里内部都在强烈推荐使用的“K8S+Docker学习指南”—《深入浅出Kubernetes:理论+实战》、《权威指南-第一本Docker书》,看完之后两个字形容,爱了爱了!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值