Redis高级

本文详细介绍了Redis的高级特性,包括Redis的单线程与多线程模型、速度优势、开启多线程的方法、禁止使用特定命令、批量插入数据、处理大Key、缓存一致性策略、MySQL数据同步到Redis的解决方案、大数据统计方法、布隆过滤器的应用、缓存预热、雪崩、穿透、击穿现象及解决方案,以及Redis分布式锁的实现和注意事项。通过对这些特性的深入探讨,有助于更好地理解和优化Redis在实际应用中的性能和稳定性。
摘要由CSDN通过智能技术生成

1、redis是单线程还是多线程?

redis4之后才慢慢支持多线程,直到redis6/7后才稳定。
Redis单线程主要是指网络IO和键值对读写是由一个线程来完成的(主要包括读、解析、执行、内容返回等都是串行由一个主线程完成)。
但其他功能如持久化、RDB、AOF、异步删除、集群数据同步等是由额外的线程执行的。

2、redis速度快的原因?

(1)基于内存操作:redis的所有数据都存在内存中,因此性能比较高
(2)数据结构简单:redis简单的数据结构的查找和操作的时间大部分复杂度都是O(1)
(3)I/O多路复用和非阻塞IO:redis使用IO多路复用功能来监听多个socket连接客户端,这样就可以使用一个线程连接来处理多个请求减少线程切换带来的开销
I/O:网络I/O
多路:多个客户端连接
复用:复用一个或多个线程
I/O多路复用即使用一个或者一组线程处理多个TCP连接,使用单进程就能实现同时处理多个客户端的连接
(4)避免上下文切换:因为是单线程模型,因此就避免了不必要的上下文切换和多线程竞争。

3、开启redis的多线程

redis6/7后,多线程机制默认是关闭的,如果需要开启则修改配置如下(配置在THREAD I/O):
io-thread:线程数量,按照官方建议配置即可
io-thread-do-reads:将no改为yes

4、禁止使用keys */flushdb/flushall等命令

通过配置设置禁用这些命令,redis.conf在security模块中配置如下:
关于keys * 可以使用scan扫描命令代替
rename- command keys “”
rename- command flushdb “”
rename- command flushall “”

5、MoreKey(多key插入至redis:准备数据脚本,使用管道插入)

1)插入1000000条数据至redisTest.txt脚本中
for((i =1;i<=100*10000;i++));do echo “set k i v i v ivi” >> /tmp/redisTest.txt;done;
2)通过管道命令将脚本中的数据插入到redis
cat /tmp/redisTest.txt | ./redis-cli -h 192.168.22.109 -p 6381 -c -a 111111 --pipe

6、BigKey(大的内容不是key本身,而是其对应的value)

参考阿里的规范:string类型value应控制在10kb内,hash、list、set、zset元素个数不要超过5000
发现bigkey方式:通过使用–bigkeys(列出最大的key) 和 memory use k(计算某个k占用的字节数)
删除bigkey:除了string不建议直接使用del删除
1)string;一般使用del,如果过于庞大使用unlink–异步删除
2)hash:使用hscan每次获取少量field-value,在使用hdel删除每个field
3)list:使用ltrim渐进式逐步删除,直到全部删除完成
4)set:使用sscan每次获取部分元素,在使用srem命令删除每个元素
5)zset:使用zscan每次获取部分元素,在使用zremrangebyrank命令删除每个元素
bigkey调优:可通过惰性释放lazyfree参数进行调整,将其设置为非阻塞操作

redis中无mysql中有数据如何避免缓存击穿:
双检加锁策略:查缓存、数据不存在、代码块加锁后再次查询缓存、不存在、查库、数据回写到缓存、返回数据—》代码见RedisController.getHotelInfoById

7、缓存双写一致性更新策略

1)延迟双删策略:先删除缓存,在更新数据库后延迟一定时间在次删除缓存
延迟时间确定方案:
(1)统计业务读数据和写数据的操作时间,保证写数据的休眠时间(延迟时间)在读数据的逻辑基础上增加百毫秒即可
(2)新启动后台监控程序如watchDog监控程序,自动加时

8、若mysql有改动(增删改操作),需要立刻同步到redis,该如何实现?(双写一致性问题解决方案)

可使用阿里研发的开源中间件canal,其主要用于mysql数据库增量日志数据的订阅、消费和解析。
下载官网:https://github.com/alibaba/canal
canal工作原理:
1)canal模拟mysql slave的交互协议,伪装自己为mysql slave向mysql master发送dump协议
2)mysql master收到dump请求后开始推送binary log给canal
3)canal解析binary log对象得到变动的数据

4)mysql准备工作
(1)查询当前版本大于5.7即可:select VERSION();
(2)查看当前主机的二进制日志:show master status;
(3)查看binlog的权限,默认是OFF关闭:show VARIABLES like ‘log_bin’;
(4)修改mysql的配置开启mysql的binlog写入功能—/etc/my.cnf
[mysqld]
#开启binlog
log-bin=mysql-bin
#ROW模式:除记录sql语句外,还会记录每个字段的变化情况,能够清楚的记录每行数据的变化历史,但会占用较多的空间
#STATEMENT模式:只记录sql语句,但没有记录上下文信息,在进行数据恢复时可能会导致数据的丢失
#MIX模式:比较灵活的记录,理论上当表结构变更时就会记录为STATEMENT模式,当数据更新或删除情况下就会记录ROW模式
#选择row模式
binlog-format=ROW
#配置mysql replication需要定义,不要和canal的slaveId重复,mysql master配置为1,slave从2开始配置
server_id=1
(5)重启mysql
systemctl restart mysql
(6)授权canal连接mysql账号
–创建用户canal
create user ‘canal’@‘%’ IDENTIFIED by ‘canal’;
–赋所有权限
GRANT all PRIVILEGES on . to ‘canal’@‘%’;
–刷新权限
FLUSH PRIVILEGES;
5)canal服务端
(1)下载1.1.6版本canal.deployer-1.1.6.tar.gz https://github.com/alibaba/canal/releases/tag/canal-1.1.6
(2)上传linux并解压
windows中cmd执行以下命令上传:scp 上传文件全路径 root@192.168.22.109:/opt/software/
解压:tar -zxvf canal.deployer-1.1.6.tar.gz -C /opt/module/canal/
(3)配置
/opt/module/canal/conf/example/instance.properties
#数据库地址
a、canal.instance.master.address=192.168.22.109:3306
#数据库的用户名密码
b、canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
(4)启动
/opt/module/canal/bin/startup.sh
(5)日志查看
/opt/module/canal/logs/canal & example下的日志看是否有异常
若出现连接mysql错误:caching_sha2_password Auth failed,是因为mysql8和之前的版本使用的认证插件不一样,之前使用mysql_native_password,解决方式如下:
a、给root用户赋予系统用户权限:grant system_user on . to ‘root’;
b、修改canal用户的认证方式:ALTER USER ‘canal’@‘%’ IDENTIFIED WITH mysql_native_password BY ‘canal’;
c、刷新权限:FLUSH PRIVILEGES;
6)java客户端服务
a、使用数据库建表,随便建,用于测试mysql中的数据变动后写入redis
b、引入canal依赖(com.alibab

  • 26
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值