Redis 笔记
Java丨Mr.Chen 人气:21.redis的特点
优点:速度快、类型丰富、丰富的特性、持久化存储,单线程。
2. redis的应用场景
(1)令牌生成(临时有效期)
(2)短信验证码(临时有效期)
(3)热点数据(使用redis减轻数据库的压力)
(4)使用redis实现消息中间件,发布订阅功能(不推荐)
(这里多说一下消息中间件的作用: 应用解耦,异步处理,错峰与流控)
(5)分布式锁(使用zk或者redis 实现分布式锁)
(6)网站计数器(因为redis是单线程的,在高并发情况下,保证记录的唯一性)
(7)此外还有redis解决雪崩效应,redis多种集群方案,reids持久化机制,reids哨兵机制
3. redis 类型
(1)String类型 字符串
(2)List 列表 简单的字符串列表,采用的双向链表结构
(3)Hash 字典 在值比较少时使用数组,值比较多的时候转换成hashmap数据结构
(4)Set 集合 String类型的无序集合,值是唯一的
(5)Sorted Set 有序集合 值是唯一的,并且每个成员都会关联一个分数,并通过该分数排序。
4. redis 过期策略及清理算法问题
(1)为什么不用定时删除策略
因为这样需要用一个定时任务来监测所有点key,虽然内存能及时释放,但是十分消耗资源。在大并发下cpu要将时间用来处理请求。
(2)定期删除+惰性删除
每隔100ms,随机抽查一些key是不是过期,然后剩下的在获取某个key的时候去校验是否过期。
(3)配置内存淘汰机制
在redis.conf中有一行配置
一般配置allkeys-lru 随机删除最近使用最少的key
默认 volatile-lru – >使用LRU算法,仅对设置了过期时间的键采取LRU
淘汰
5.redis 持久化机制
(1)概述
redis持久化机制分为RDB和AOF两种,默认是快照RDB方式
(2)RDB持久化方式
redis.conf默认配置:
save 900 1 900秒内,超过一个key被修改,则保存
save 300 10 300秒内超过10个key被修改,则保存
保存后默认生成一个dump.rdb的文件。
(3)AOF方式
redis.conf 默认配置
appendonly no 默认为30秒一次
可修改为:
appendfsync always 每次修改都会保存
appendfsync everysec 每秒一次
appendfsync no 每30秒一次
默认保存文件为appendonly.aof
注:aof模式有个问题就是aof文件会变的很大。往往通过aof分析里面有太多冗余数据时,会进行重写,这个操作满足一定条件是,Redis会自动触发。一般生产环境一般要求 在达到几个g或者几十个g才会重写,因为重写会影响redis性能。
重写参数:
auto-aof-rewrite-percentage 100 重写增长比例,如上次重写是100,则在200时触发。
auto-aof-rewrite-min-size 64mb 最小触发重写的文件大小
6.redis 主从复制
(1)什么是主从复制
将服务器分为主服务器和从服务器,主服务器可以允许读写操作,从服务器只能有读操作。主服务器只能有一个。
(2)主从复制的应用场景
集群,读写分离,日志备份,高可用
(3)什么是读写分离
读和写分库连接,读一个库,写一个库,互不影响,增加整体吞吐量,读写分离需要解决两个库之间的数据同步问题,redis已解决
(4)主从复制原理图
(5)主从复制存在的问题
当数据同步延迟吃造成的主库和从库的不一致的问题。
①如果qq消息,论坛等允许短时间内不一致的业务,就可以不作处理。
②强制读主,从库只用来主库挂掉过后的一个备份。
③不同的业务,在进行表操作时用缓存记录下来,比如库:表:主键 并设置一个过期时间,过期时间为主从延时时间,如果读到了key说明还在同步,需要去读主库,如果没有 读到key则去读从库。具体读哪一个由路由来完成。
7.主从复制的配置
在“从服务器”的redis.conf的 salveof 后面添加主服务器的ip地址+端口,如果主服务器配置了密码 需要加上masterauth
8.redis安装
将redis-4.0.8.tar.gz包放在/usr/local下
①解压tar -zxvf redis-4.0.8.tar.gz
② cd redis-4.0.8
③运行make
报错:
zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录
解决:使用这个make MALLOC=libc 替换 make
④make install PREFIX=/usr/local/redis
⑤移动配置文件到安装目录下
cd ../
mkdir /usr/local/redis/etc
mv redis.conf /usr/local/redis/etc
⑥配置redis为后台启动
vi /usr/local/redis/etc/redis.conf //将daemonize no 改成daemonize yes
vi /usr/local/redis/etc/redis.conf // requirepass 123
⑦开启redis
/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf
⑧连接Redis客户端
./redis-cli -h 127.0.0.1 -p 6379 -a "123456"
PING 结果表示成功
⑨关闭防火墙
//临时关闭
systemctl stop firewalld
//禁止开机启动
systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/systemhttps://img.qb5200.com/download-x/dbus-org.fedoraproject.FirewallD1.service.
⑩停止Redis服务
./redis-cli -h 127.0.0.1 -p 6379 -a "123456" shutdown
修改redis.conf
注释掉
#bind 127.0.0.1 开启外网访问
9.哨兵机制的配置
(1)作用:心跳检查,故障转移(选举策略),监控。
注:哨兵注意事项:哨兵一般不和其他redis服务器在一起,启动的时候先启动哨兵的情况下,最好先启动主的redis,不然哨兵会以为主挂掉了,进行选举。
(2)配置
①配置拷贝到etc目录
cp sentinel.conf /usr/local/redis/etc
②修改sentinel.conf配置文件
sentinel monitor mymast 192.168.110.133 6379 1 #主节点 名称 IP 端口号 选举次数
一个Sentinel节选举成为Leader的最低票数为quorum(就是6379后面那个1)
和Sentinel节点 数/2+1
的最大值。
sentinel auth-pass mymaster 123456
③ 修改心跳检测 30毫秒
sentinel down-after-milliseconds mymaster 30
④sentinel parallel-syncs mymaster 2
sentinel parallel-syncs <master-name> <numslaves>
注:这个配置项指定了在发生failover主备切换时最多可以有多少个slave同时对新的master进行 同步,这个数字越小,完成failover所需的时间就越长,但是如果这个数字越大, 就意味着越 多的slave因为replication而不可用。可以通过将这个值设为 1 来保证每次只有一个slave 处于不能处理命令请求的状态。
⑤启动哨兵模式
./redis-server /usr/local/redis/etc/sentinel.conf --sentinel &
⑥停止哨兵模式
ps -ef | grep redis
⑦若需要springboot 集成哨兵模式则需要
把哨兵配置文件中的protected-mode no 的注释放开
搭建哨兵的时候要注意,所有服务器都需要配置密码
masterauth 123456
主服务器不用配置 slaveof
10.redis 事务在spring中的使用
muti()开启
exec()提交
dicard() 回滚
11.使用 springboot + ehcache + redis 实现二级缓存
一级(ehcache)+ 二级(redis) 目的是尽量使用本地缓存:作用①如果本地没有再走网络。效率会更高。 ②减轻redis访问压力,提高访问速度。③如果redis挂了,直接穿透到 数据库容易造成雪崩效应。
注意事项:1.一级缓存的过期时间,一定要比二级缓存的过期时间要少能有效控制一二级缓存不同步的问题。
2. 使用job定时任务去比较一二级缓存里面的值,或者使用二级缓存更新后发送到mq里面,然后在拿去更新一级缓存,这么做比较耗资源。
(代码如果需要的话,可以在下方评论)
流程图如下
加载全部内容