文章目录
- Redis概述
- Redis简介
- Redis特点
- Redis适合于做
- Redis不适合于做
- Redis安装
- Redis命令
- Redis命令
- Redis的键
- Redis数据类型
- Redis支持的数据类型
- 字符串及相关命令
- 字符串应用场景:
- 列表及相关命令
- 列表应用场景:
- 集合及相关命令
- 集合应用场景:
- 有序集合及相关命令
- 有序集合应用场景:
- 哈希及相关命令
- 哈希应用场景:
- Redis事务
- 传统事务与Redis事务区别
- 事务阶段
- Redis事务相关命令
- Redis事务错误:
- Redis持久化
- RDB
- AOF
- Redis持久化配置(redis.*.conf文件):
- Redis架构模式
- 单机版
- 主从复制
- 哨兵
- 集群
- Java使用Redis
- 缓存
- 缓存雪崩
- 缓存击穿:
- 缓存穿透:
Redis概述
Redis简介
- Redis(REmote DIctionary Server)是一个开源(BSD许可)的,内存中的数据结构存储系统。
- Redis是一个灵活的高性能key-value数据结构存储,可以用来作为数据库、缓存和消息队列。
- 目前Redis是互联网技术中使用最为广泛的中间件之一。
- Redis使用C语言开发。
- https://redis.com.cn/
Redis特点
- 高性能:数据集存储在内存中,每秒写(SET)11 万次,读(GET)8.1 万次。
- 可持久化。
- 支持多种数据结构。比如:字符串、散列、集合等等。
- 原子操作。处理不同数据类型的 Redis 操作是原子操作。
Redis适合于做
- 缓存、Session共享。
- 排行榜。利用SortedSet可以很轻松实现。
- 计算器/限速器。比如统计用户点赞数、用户访问数等;比如抢购时,防止用户疯狂点击带来的压力。
- 好友关系。利用集合的并集、交集、差集等命令即可实现。
- 简单消息队列。
Redis不适合于做
- 数据量太大时的业务。
- 数据访问频率非常低的业务。
Redis安装
- Windows安装:
官方不推荐windows安装,微软团队维护了开源的windows版本,地址:https://github.com/MicrosoftArchive/redis/releases。 - Linux安装:
目前最新版本为6,地址:https://redis.com.cn/download.html。
Redis命令
Redis命令
- dis针对键和不同数据类型的值提供了很多命令来进行操作。
- Redis命令手册,地址:https://redis.com.cn/commands.html。
Redis的键
- Redis key是二进制安全的,这意味着可以使用任意的二进制序列作为key。
- 关于key的规则:
- Key不要过长,否则存储和查找key,代价都很大。
- Key不要太短,否则键意义不够明确。
- 建议使用冒号、破折号连接单词。如user:1000:followers
- key最大允许的长度是512MB。
Redis数据类型
Redis支持的数据类型
- 字符串(string)。
- 哈希(hash)。
- 列表(list)。
- 集合(set)。
- 有序集合(sorted set)。
- 位图(Bitmaps)、基数统计(HyperLogLogs)、地理空间(Geographic)等等。
字符串及相关命令
- 字符串(string)是Redis中最基本、最简单的数据类型,最大存储512MB。
- 字符串有3种编码格式:int、embstr、raw。除int外均采用SDS(Simple Dynamic String)结构进行存储。
- int用于保存整数。
- embstr保存长度小于等于39的字符串(redis3、4版本)。
- raw保存长度大于39的字符串。
字符串应用场景:
- 缓存。
- 计数器(播放量、点赞量)。
- 统计(出勤统计)。
- 布隆过滤器。
列表及相关命令
- 列表(list)是按插入顺序排序的字符串列表。可以在列表的头部(左边)或尾部(右边)添加元素。他可以包含231-1个元素。
- Redis 3.2版之后,列表采用的quicklist结构,它代替了之前版本的ziplist和linkedlist。
列表应用场景:
- 消息队列。
- 排行榜。
- 朋友圈点赞列表、评论列表等。
集合及相关命令
- 集合(set)是string类型的无序集合。集合成员是唯一的。他可以包含231-1个元素。
- 集合类型内部编码有2种:
- intset(整数集合),当集合中元素都是整数且个数小于set-maxintset-entries配置(默认512个)时使用。
- hashtable(哈希表)。
- Ht[1]是为了扩容。
- 扩展:ht[1]的大小为第一个大于等于ht[0].used*2。
- 收缩:ht[1]的大小为第一个大于等于ht[0].used/2 。
集合应用场景:
- 好友、关注、粉丝。
- 随机展示产品。
- 抽奖等等。
有序集合及相关命令
- 有序集合(sorted set或zset)相比于集合类型,多了一个排序属性score(分值)。
- 有序集合由以下2种结构组成:
- ziplist(压缩表),当集合中元素个数小于128个;所集合中所有元素成员的长度必须小于64字节。
- skiplist(跳跃表)。
- Redis的跳跃表由skiplist和zskiplistNode结构定义。
- skiplist包含以下属性:
- header:指向跳跃表头结点。
- tail:指向跳跃表尾结点。
- level:记录跳跃表内的最高层数(不包括头结点)。
- length:记录跳跃表的长度,节点数量(不包括头节点)。
- zskiplistNode包含以下属性:
- level:L1、L2等标记各个层,每个层有前进指针和跨度2个属性。
- backward(后退指针):指向当前结点的前一个节点。
- score:分值,跳跃表中节点按分值由小到大排列。
- object:成员对象,有序集合中保存的数据,唯一。
- skiplist包含以下属性:
有序集合应用场景:
- 排行榜系统,比如某视频系统的播放量排名、电商系统中商品销量的排名等等。
哈希及相关命令
- 哈希(hash)是一个string类型的field和value的映射表,hash特别适合用于存储对象。
- 哈希内部编码有2种:
- ziplist(压缩表),当哈希元素个数小于512个;所有值都小于64字节。
- hashtable(哈希表)。
哈希应用场景:
- 存储对象,如用户信息、商品信息等。
- 购物车,如:HSET uid:1 pid:1 1。
- 计数器,如商品的好评数量,某网页的访问次数等。
Redis事务
传统事务与Redis事务区别
- 传统事务:
- 事务的四个特性:ACID。
- 原子性(Atomicity),原子性是指一个事务是一个不可分割的工作单位,其中的操作要么都做,要么都不做。数据库中:如果事务中一个sql语句执行失败,则已执行的语句也必须回滚,数据库退回到事务前的状态(Ps:上面只是举个例子,要注意的是MySQL的事务并不支持原子性,在MySQL中,如果事务中的一条sql无法执行,它会将这一条sql报错,并继续执行接下来的sql,且已执行的sql也不回滚,除非我们主动使用逻辑判断要求报错时执行回滚,否则MySQL的事务本身是不会回滚的)
- 持久性(Durability),持久性是指事务一旦提交,它对数据库的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。简单理解:就是数据的持久化
- 隔离性(Isolation)与原子性、持久性侧重于研究事务本身不同,隔离性研究的是不同事务之间的相互影响。隔离性是指,事务内部的操作与其他事务是隔离的,并发执行的各个事务之间不能互相干扰。通常使用锁机制来保证事务的隔离性
- Redis事务:
- Redis事务就是一次性、顺序性、排他性的执行一个队列中的一系列命令。
- Redis 的事务是非原子性的。
事务阶段
- 开始事务
- 命令入队
- 执行事务
Redis事务相关命令
- MULTI:组装事务,将指令放入队列。
- EXEC:执行事务,执行队列中的指令。
- DISCARD:取消事务,放弃执行执行块中的指令。
- WATCH:用来监视一些 key,一旦这些 key 在事务执行之前被改变,则取消事务的执行。
- UNWATCH:取消WATCH对所有key的监视。
Redis事务错误:
- 调用EXEC之前的错误,在客户端调用EXEC时,Redis会拒绝执行这一事务。
- 调用EXEC之后的错误,Redis继续向下执行事务中的其他命令。
Redis持久化
- Redis提供了2种持久化方式:
- RDB(Redis DataBase)。
- AOF(Append Only File)。
- 如果没有持久化需求,也可以关闭,这样Redis就成为了纯内存数据库。
RDB
- RDB持久化方式是在不同的时间点,将Redis存储的数据生成快照并存储到磁盘等介质上。
- Redis会将数据写入临时文件,待持久化结束才替换上次持久化的文件,确保快照文件完整。
- Redis会单独创建子进程来持久化,确保Redis高性能。
- 如果进行大规模数据恢复,且对数据完整性不敏感,那么RDB方式更高效。
AOF
- AOF持久化方式是将执行过的写指令记录下来,在数据恢复时按照从前到后的顺序再将指令都执行一遍。
- AOF文件重写机制:当文件太大时将重写AOF文件,重写后的AOF文件中是恢复全部数据的最小命令合集(比如一个key修改俩次的命令,只保留最后一次的修改命令)。
Redis持久化配置(redis.*.conf文件):
- RDB(Redis DataBase)
- AOF (Append Only File)
Redis架构模式
单机版
简单;但是内存有限,处理能力有限,无法高可用。
主从复制
maste同步数据到slave,读写分离;但是没有解决maste的写的压力,也无法高可用。
哨兵
Redis Sentinel会监控Redis主从服务器。他有三个特性:
- 监控(Monitoring):Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
- 提醒(Notification):当被监控的Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知。
- 自动故障迁移(Automatic failover):当一个主服务器不能正常工作时,Sentinel会开始一次自动故障迁移操作。
保证高可用,自动故障迁移,监控;但切换要时间,可能丢数据,没解决master写压力。
集群
- 集群(Redis Cluster)采用无中心结构,每个节点保存数据、集群状态,并和其它所有节点连接。
- 动态扩展性。
- 高可用性。
- 自动故障迁移(Automatic failover)。
Java使用Redis
- Java使用Redis的方案有很多,例如:Jedis、Lettuce、Redisson等等。
- 而SpringBoot默认集成Redis就是Spring Data Redis,底层使用的则Lettuce。
- SpringBoot集成Redis步骤:
- 添加Maven依赖。
- 进行Redis配置。
- 编写Redis配置类。
- 借助RedisTemplate或StringRedisTemplate完成操作。
缓存
缓存雪崩
- 他指缓存中大量热点数据过期后系统涌入大量查询请求,这些请求可能直接作用于数据库,造成查询堵塞甚至宕机。
- 解决办法:
- 将缓存失效时间分散开,比如每个key的过期时间是随机。
- 让Redis数据永不过期(在业务允许的情况下,比如一些不常改变的数据)。
缓存击穿:
- 他类似于缓存雪崩,但他是针对一个Key,当该值失效时,持续的大并发的请求就穿过缓存,直接作用于数据库。
缓存穿透:
- 他是指缓存和数据库中都没有的数据,而用户不断发起请求访问。
- 解决办法:
- 将对应Key的值设置为null,再设置一个较短的有效时间。
- 布隆过滤器。