Redis高可用主从复制
Redis支持主从复制功能,可以通过执行slaveof(Redis5以后改成replicaof)或者在配置文件中设置slaveof(Redis5以后改成replicaof)来开启复制功能。
主对外从对内,主可写从不可写
主挂了,从不可为主
主从配置
主Redis配置
无需特殊配置
从Redis配置
修改从服务器上的 redis.conf 文件:
123# slaveof <masterip> <masterport># 表示当前【从服务器】对应的【主服务器】的IP是192.168.10.135,端口是6379。replicaof 192.168.10.1 ...
阿里Redis使用手册
本文主要介绍在使用阿里云Redis的开发规范,从下面几个方面进行说明。
键值设计
命令使用
客户端使用
相关工具
键值设计
1、key名设计
可读性和可管理性
以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id
1ugc:video:1
简洁性
保证语义的前提下,控制key的长度,当key较多时,内存占用也不容忽视,例如:
1user:{uid}:friends:messages:{mid} 简化为 u:{uid}:fr:m:{mid}
不要包含特殊字 ...
Redis企业分布式锁
watch
实现Redis乐观锁
乐观锁基于CAS(Compare And Swap)思想(比较并替换),是不具有互斥性,不会产生锁等待而消耗资源,但是需要反复的重试,但也是因为重试的机制,能比较快的响应。因此我们可以利用redis来实现乐观锁。
具体思路如下:
利用redis的watch功能,监控这个redisKey的状态值
获取redisKey的值
创建redis事务
给这个key的值+1
然后去执行这个事务,如果key的值被修改过则回滚,key不加1
1234567891011121314151617181920212223242526272829303132 ...
Redis企业缓存与数据库一致性
缓存更新策略
利用Redis的缓存淘汰策略被动更新 LRU 、LFU
利用TTL被动更新
在更新数据库时主动更新 (先更数据库再删缓存----延时双删)
异步更新 定时任务 数据不保证时时一致 不穿DB
不同策略之间的优缺点
策略
一致性
维护成本
利用Redis的缓存淘汰策略被动更新
最差
最低
利用TTL被动更新
较差
较低
在更新数据库时主动更新
较强
最高
与Mybatis整合
可以使用Redis做Mybatis的二级缓存,在分布式环境下可以使用。
框架采用springboot+Mybatis+Redis。
在pom.xml中添加Redis依赖
12 ...
Redis企业缓存问题
缓存穿透
一般的缓存系统,都是按照key去缓存查询,如果不存在对应的value,就应该去后端系统查找(比如DB)。
缓存穿透是指在高并发下查询key不存在的数据(不存在的key),会穿过缓存查询数据库。导致数据库压力过大而宕机。
解决方案:
对查询结果为空的情况也进行缓存,缓存时间(ttl)设置短一点,或者该key对应的数据insert了之后清理缓存。
问题:缓存太多空值占用了更多的空间
使用布隆过滤器。在缓存之前在加一层布隆过滤器,在查询的时候先去布隆过滤器查询 key 是否存在,如果不存在就直接返回,存在再查缓存和DB。
布隆过滤器(Bloom Filter)是1970 ...
Redis企业架构设计
组件选择/多级
缓存的设计要分多个层次,在不同的层次上选择不同的缓存,包括JVM缓存、文件缓存和Redis缓存
JVM缓存
JVM缓存就是本地缓存,设计在应用服务器中(tomcat)。
通常可以采用Ehcache和Guava Cache,在互联网应用中,由于要处理高并发,通常选择Guava Cache。
适用本地(JVM)缓存的场景:
对性能有非常高的要求
不经常变化
占用内存不大
有访问整个集合的需求
数据允许不时时一致
文件缓存
这里的文件缓存是基于http协议的文件缓存,一般放在nginx中。
因为静态文件(比如css,js, 图片)中,很多都是不经常更新的。ng ...
Redis事件处理机制
Redis服务器是典型的事件驱动系统。
MVC : java 上层调下层
事件驱动: js
Redis将事件分为两大类:文件事件和时间事件。
文件事件
文件事件即Socket的读写事件,也就是IO事件。 file descriptor (文件描述符)
客户端的连接、命令请求、数据回复、连接断开
socket
套接字(socket)是一个抽象层,应用程序可以通过它发送或接收数据。
Reactor
Redis事件处理机制采用单线程的Reactor模式,属于I/O多路复用的一种常见模式。
IO多路复用( I/O multiplexing )指的通过单个线程管理多个Socket。
Reactor pa ...
Redis通讯协议
Redis是单进程单线程的。应用系统和Redis通过Redis协议(RESP)进行交互。
请求响应模式
Redis协议位于TCP层之上,即客户端和Redis实例保持双工的连接
串行的请求响应模式(ping-pong)
串行化是最简单模式,客户端与服务器端建立长连接
连接通过心跳机制检测(ping-pong) ack应答
客户端发送请求,服务端响应,客户端收到响应后,再发起第二个请求,服务器端再响应。
telnet和redis-cli 发出的命令 都属于该种模式
特点:
有问有答
耗时在网络传输命令
性能较低
双工的请求响应模式(pipeline)
批量请求,批量响应
请 ...
Redis缓存过期和淘汰策略
Redis性能高:
读:110000次/s
写:81000次/s
长期使用,key会不断增加,Redis作为缓存使用,物理内存也会满
内存与硬盘交换(swap) 虚拟内存 ,频繁IO 性能急剧下降
maxmemory
不设置的场景
Redis的key是固定的,不会增加
Redis作为DB使用,保证数据的完整性,不能淘汰 , 可以做集群,横向扩展
缓存淘汰策略:禁止驱逐 (默认)
设置的场景
Redis是作为缓存使用,不断增加Key
maxmemory : 默认为0 不限制
问题:达到物理内存后性能急剧下架,甚至崩溃, 内存与硬盘交换(swap) 虚拟内存 ,频繁IO 性能急剧下降 ...
Redis底层数据结构
Redis作为Key-Value存储系统,数据结构如下:
Redis没有表的概念,Redis实例所对应的db以编号区分,db本身就是key的命名空间。
比如:user:1000作为key值,表示在user这个命名空间下id为1000的元素,类似于user表的id=1000的行。
RedisDB结构
Redis中存在“数据库”的概念,该结构由redis.h中的redisDb定义。
当redis 服务器初始化时,会预先分配 16 个数据库,所有数据库保存到结构 redisServer 的一个成员 redisServer.db 数组中
redisClient中存在一个名叫db的指针指向当前使用的 ...