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:成员对象,有序集合中保存的数据,唯一。在这里插入图片描述在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述
        在这里插入图片描述

在这里插入图片描述

有序集合应用场景:

  • 排行榜系统,比如某视频系统的播放量排名、电商系统中商品销量的排名等等。

哈希及相关命令

  • 哈希(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,再设置一个较短的有效时间。
    • 布隆过滤器。
  • 17
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值