Redis核心知识点梳理
文章目录一、为什么会出现NoSQLRedis诞生背景1 Web发展带来两大性能瓶颈2 NoSQL基础概念二、Redis安装、启动与基础特性1 Linux(CentOS7)编译安装流程2 两种启动方式3 核心底层特性单线程多路IO复用4 数据库基础5 通用Key操作所有数据类型通用三、8大数据类型53一五大基础类型1 String 字符串2 List 双向链表3 Set 无序集合4 Hash 哈希5 ZSet 有序集合二三大高级特殊类型1 Bitmap 位图2 HyperLogLog3 Geospatial 地理位置四、Redis核心配套功能1 发布订阅 Pub/Sub2 Redis事务3 两大持久化方案解决断电丢数据RDB 快照持久AOF 追加日志五、高可用架构主从→哨兵→集群1 主从复制一主多从2 哨兵Sentinel自动故障转移3 Redis Cluster 分片集群六、Java客户端与SSM/SpringBoot整合1 Jedis 原生客户端2 SpringBoot整合Redis七、缓存三大经典问题1 缓存穿透2 缓存击穿3 缓存雪崩三者简易区分八、Redis分布式锁锁迭代4个版本分布式锁四大硬性要求九、整体学习总结一、为什么会出现NoSQLRedis诞生背景1 Web发展带来两大性能瓶颈Web1.0用户量少单台Web服务器MySQL就能承载业务Web2.0移动互联网海量用户并发、海量业务数据出现两大瓶颈CPU/内存瓶颈单台服务器扛不住并发用Nginx负载均衡引出Session共享难题方案1Cookie存会话不安全敏感数据泄露方案2Session复制多服务器冗余浪费内存方案3Redis统一缓存Session最优方案内存读写极快IO瓶颈数据日积月累频繁查询数据库造成磁盘IO阻塞解决方案热点数据放入Redis缓存大幅减少DB查询压力2 NoSQL基础概念NoSQL Not Only SQL泛指非关系型数据库不依赖表结构采用Key-Value存储扩展性极强。适用场景高并发读写、海量数据存储、弹性扩容不适用强事务、复杂多表关联SQL查询主流NoSQL对比Memcache纯内存、不持久化、仅支持字符串功能单一MongoDB文档型数据库JSON格式适合复杂文档存储Redis内存支持持久化、5种基础3种高级数据结构工业最通用Redis全称REmote DIctionary Service 远程字典服务冷知识默认端口6379来自手机键盘MERZ字母对应数字是作者早年玩梗代号。二、Redis安装、启动与基础特性1 Linux(CentOS7)编译安装流程Redis由C语言编写必须先安装gcc编译器yum install gcc安装编译环境上传redis-6.2.1.tar.gz至/opt解压tar -zxvf 压缩包进入目录执行make缺失jemalloc报错时执行make distclean重新编译make install默认安装至/usr/local/bin安装后核心工具redis-server服务启动程序redis-cli客户端redis-benchmark性能压测工具redis-check-rdb/aof持久化文件修复工具2 两种启动方式前台启动直接redis-server窗口关闭服务终止开发临时测试用后台启动生产推荐复制redis.conf至bin目录修改配置daemonize yes执行redis-server redis.conf关闭命令redis-cli shutdown远程需放行防火墙6379端口firewall-cmd --permanent --add-port6379/tcp firewall-cmd --reload3 核心底层特性单线程多路IO复用高频考点Redis命令处理单线程Memcache是多线程加锁。优势无线程上下文切换、无锁竞争配合IO多路复用单线程监听全部客户端连接。补充持久化、集群同步会新开子进程/线程并非全程单线程。4 数据库基础默认16个独立数据库下标0~1默认使用0号切换库select 数字清空当前库flushdb清空所有库flushall5 通用Key操作所有数据类型通用keys * # 查看所有key大数据量阻塞生产禁用 exists key # 判断key是否存在 1存在/0不存在 del key # 删除key expire key 秒 # 设置过期时间 ttl key # 剩余存活时间-2过期、-1永久 type key # 查看value数据类型 dbsize # 统计当前库key总数三、8大数据类型53一五大基础类型1 String 字符串二进制安全可存文字、图片、序列化对象单值最大512M。核心命令set/get、append、strlen、setnx(不存在才赋值)、setex(赋值过期)批量mset/mget自增原子操作incr/decr/incrby重点incr是原子操作Java i分三步非原子并发会出错。业务场景验证码、计数器、商品库存、普通缓存。2 List 双向链表头尾操作O(1)中间遍历性能差底层quicklist少量数据ziplist压缩多数据链表串联多个ziplist命令lpush/lrange/lpop/rpush/rpop/rpoplpush/llen/linsert场景消息队列、首页最新浏览记录。3 Set 无序集合自动去重底层哈希表增删查O(1)命令sadd/smembers/sismember/scard/srem/spop交/并/差集sinter/sunion/sdiff场景用户共同好友、黑名单、数据去重。4 Hash 哈希类似Java MapString,Object适合存储对象无需序列化整段JSON底层数据少用ziplist数据多切换哈希表。命令hset/hget/hmset/hmget/hkeys/hvals/hincrby场景用户信息、商品多属性缓存。5 ZSet 有序集合元素唯一绑定score分数自动排序底层哈希存元素-score映射 跳跃表排序比红黑树简单高效命令zadd/zrange/zrangebyscore/zincrby/zrank/zrem场景排行榜、积分排名、延时任务。二三大高级特殊类型1 Bitmap 位图利用bit位0/1存储状态极致省空间底层基于String实现。命令setbit/getbit/bitcount(统计1的个数)/bitop位运算场景用户按月签到、日活统计。2 HyperLogLog基数统计算法只统计不重复元素数量不存储原始数据每个key仅12KB误差0.81%。命令pfadd/pfcount/pfmerge场景网站UV、独立访客统计。3 Geospatial 地理位置存储经纬度计算两地距离、范围内点位命令geoadd/geopos/geodist/georadius场景附近商家、同城匹配。四、Redis核心配套功能1 发布订阅 Pub/Sub生产者向频道发布消息所有订阅客户端实时接收。命令subscribe 频道、publish 频道 消息缺陷无消息持久化客户端离线丢失消息复杂业务不用仅做简单通知。2 Redis事务作用一组命令排队串行执行执行期间不会被其他客户端打断但不支持传统数据库原子回滚。基础指令multi 开启事务命令入队不执行exec 提交执行discard 放弃队列全部命令两种错误机制考试重点入队阶段语法错误整个事务全部取消一条不执行执行阶段运行错误错误命令跳过其余正常执行无回滚3 WATCH乐观锁multi前watch监控key事务提交前key被其他客户端修改则事务执行失败。悲观锁操作前直接上锁阻塞所有并发乐观锁不上锁提交校验数据是否改动Redis事务采用乐观锁。3 两大持久化方案解决断电丢数据RDB 快照持久定时将全量数据写入dump.rdb二进制快照文件。触发方式1 手动save阻塞主线程生产禁用、bgsavefork子进程后台持久化2 自动配置save m nm秒n次修改自动bgsave流程fork子进程利用写时拷贝COW复制内存写入临时文件完成替换旧rdb。优点文件小、恢复速度快缺点两次快照间数据丢失。AOF 追加日志记录所有写指令重启重放命令恢复数据默认关闭。三种刷盘策略1 always 每次写入同步磁盘安全性能极低2 everysec 每秒刷盘默认最多丢1秒数据3 no 交给操作系统不可控AOF重写文件过大后台压缩只保留最简恢复指令触发条件当前文件是上次重写后2倍且≥64MB。优缺点数据丢失极少文件体积更大恢复慢。官方推荐RDBAOF同时开启重启优先加载AOFRDB做定时备份兜底。五、高可用架构主从→哨兵→集群1 主从复制一主多从主机负责写从机仅读数据自动同步实现读写分离、数据备份。1 搭建方式多份conf修改port、pidfile配置slof 主机IP 端口2 同步流程从机发送SYNC→主机生成RDB缓存新增命令→全量同步RDB→增量同步后续写指令注意从机重启、断线重连都会执行完整全量复制。3 两种拓展薪火相传从机可作为其他从机的主机减轻主节点同步压力反客为主主机宕机执行slaveof no one手动提升从机为主机。2 哨兵Sentinel自动故障转移反客为主自动化方案后台监控所有节点主机故障投票选新主。选举新主机三条规则1 replica-priority优先级数值越小越优先2 数据复制偏移量越大数据越完整优先3 runid最小节点。旧主机重启后自动变为新主机的从节点。3 Redis Cluster 分片集群哨兵只能单库扩容集群实现数据分片水平扩容3主3从标准架构。核心规则1 总共16384个哈希槽公式 CRC16(key) % 16384每个主节点分管一段槽2 不同槽的key不能mset/mget使用{tag}哈希标签强制落到同一槽3 搭建命令redis-cli --cluster create ip:port --cluster-replicas 1故障规则一段槽主从全部宕机cluster-require-full-coverage为yes则整个集群不可用。六、Java客户端与SSM/SpringBoot整合1 Jedis 原生客户端1 基础操作Jedis jedis new Jedis(“ip”,6379)2 连接池频繁创建销毁连接损耗大生产必须使用JedisPool3 SSM整合配置JedisPool工具类读取properties配置池参数。2 SpringBoot整合Redis依赖spring-boot-starter-data-redis commons-pool2核心组件RedisTemplate默认JDK序列化乱码自定义配置类key字符串序列化、value JSON序列化方便查看缓存数据。七、缓存三大经典问题1 缓存穿透查询数据库不存在的数据缓存无记录请求全部打满DB。解决方案缓存空值、布隆过滤器、访问白名单、接口限流。2 缓存击穿单一热点key过期海量并发同时查询数据库。解决方案热点数据永不过期、互斥锁set nx ex、过期随机偏移。3 缓存雪崩大批量key同一时间过期Redis宕机也属于雪崩场景。解决方案过期时间增加随机数、多级缓存(NginxRedis)、集群高可用、限流。三者简易区分穿透查不存在数据击穿单个热点key失效雪崩大批量key同时失效。八、Redis分布式锁分布式环境下synchronized、Lock仅单机有效需Redis实现跨机器锁。锁迭代4个版本1 setnx del异常死锁2 setnx expire两条命令无原子宕机永久死锁3 set key val nx ex单命令原子上锁但会误删别人的锁4 锁value存UUIDLua脚本判断删除原子执行最终生产方案分布式锁四大硬性要求1 互斥同一时间仅一个客户端持有锁2 防死锁锁自动过期释放3 仅持有者可删锁4 加锁、解锁操作必须原子。九、整体学习总结Redis完整学习链路1 基础层内存存储多样数据结构解决缓存、各类业务场景2 功能层发布订阅、事务、RDB/AOF持久化保障数据可靠3 高可用层主从复制→哨兵自动故障切换→集群分片扩容4 分布式问题层缓存穿透/击穿/雪崩、分布式锁应对线上并发难题学习核心思路每一个功能都是为解决真实线上痛点而生不要孤立背命令结合业务场景记忆效率更高。