简介

Redis 的全称是 Remote Dictionary Server,是一个使用 C 语言编写的、开源的(BSD 许可)高性能非关系型(NoSQL)的键值对数据库。

Redis 的数据是存储在内存中的,所以读写速度非常快,被广泛应用于缓存方向,当然也有持久化数据库的用法。

优缺点

优点

  • 读写性能优异, Redis 能读的速度是 110000 次/s,写的速度是 81000 次/s
  • 数据类型丰富,有 String、List、Hash、Set、SortedSet 等
  • 单线程原子性,Redis 所有的操作都是原子性的,也支持多个操作合并后的原子执行
  • 丰富的特性,Redis 支持发布订阅、通知、key 过期等功能
  • 支持持久化,Redis 支持 RDB、AOF 等持久化方式
  • 高可用性,Redis 支持主从复制、哨兵模式、Cluster 等高可用方式

缺点

  • 数据库容量受物理内存的限制,不能用作海量数据的读写
  • Redis 难以支持在线扩容,修改配置文件之后重启 Redis,恢复磁盘上的数据耗费时间较久

使用场景

数据缓存

Redis 是高性能的内存数据库,因此,缓存是 Redis 最常用的场景。Redis 作为缓存使用的时候,一般是采用先更新数据库,再删除缓存的 Cache Aside Pattern 策略。

整体的逻辑是:业务从 Redis 中读取数据,如果 Redis 中访问不到数据,然后读取数据库中的数据,将数据库中的数据缓存到 Redis 中;业务更新数据,直接修改数据库中的数据,然后将 Redis 中的缓存删除。

这种方案需要注意的就是:避免缓存击穿,数据的实时性相对较低。

限时业务

Redis 支持给 key 设置过期时间,客户端无法访问到过期的 key,利用这一特性可以运用在限时的优惠活动、手机验证码等业务场景。

计数器

Redis 的 INCRBY 命令可以实现原子性的递增,可以直接作为计数器存储和递增。尤其是,该命令在键不存在时会直接初始化值再执行 INCRBY 命令,执行成功后会直接返回计算增量之后的数值。

高并发的秒杀活动、分布式序列号的生成、限制手机发送短信次数、接口限制访问次数等需要计数的功能,都涉及到计数器的概念,尤其是分布式系统会涉及到分布式计数器。

分布式锁

先使用 SETNX 命令来争抢锁,结果返回 1 表示设置成功,抢到之后再用 EXPIRE 命令给锁加一个过期时间防止忘记释放锁。

从 Redis 的 2.6.12 版本开始,可以通过 SET 命令的复杂参数,将 SETNX 命令和 EXPIRE 命令合并成一条命令来使用:

  • EX second: 设置键的过期时间为 second 秒,使用 EX 选项效果等同于 SETEX 命令。
  • PX millisecond: 设置键的过期时间为 millisecond 毫秒,使用 PX 选项效果等同于 PSETEX 命令。
  • NX: 只在键不存在时,才对键进行设置操作,使用 NX 选项效果等同于 SETNX 命令。
  • XX: 只在键已经存在时,才对键进行设置操作。

同样的,使用 SET 命令操作成功之后会返回 OK,这样才表示抢到了锁。

为了避免分布式锁被误删,加锁时可以设置线程 ID 作为 value 值,删除时需要线程的线程 ID 和 Redis 存储的值一致才能够删除分布式锁,否则只能等待锁自动过期,整个删除过程使用事务的方式保证原子性。

排行榜功能

通过 Redis 的 SortedSet 可以实现排行榜功能。

比如说需要展示点赞排行榜,可以将用户 ID 作为 SortedSet 的 value 值,将用户的点赞数作为 SortedSet 的 score 值,SortedSet 提供的 ZRANGEBYSCORE 命令可以快速返回已排序的点赞排行榜。

延时队列

延时队列其实就是一个带有延迟功能的消息队列,Redis 可以通过 SortedSet 实现延时队列。

具体的实现如下:

  1. 将消息内容序列化成一个字符串作为 SortedSet 的 value 值,这个消息的到期处理时间作为 score,生产者调用 ZADD 命令生产消息,消费者可以使用 ZRANGEBYSCORE 命令获取一段时间之前的数据轮询处理;
  2. 通常使用多个线程轮询 SortedSet 获取到期的任务进行处理,多个线程是为了保障可用性,万一挂了一个线程还有其他线程可以继续处理;
  3. 因为有多个线程,所以需要考虑并发争抢任务,确保任务不能被多次执行,Redis 的 ZREM 命令是多线程争抢任务的关键,ZREM 命令会返回被成功移除的成员数量,可以通过 ZREM 命令来决定任务的唯一属主;
  4. 同时也要注意一定要进行异常捕获,避免因为个别任务处理问题导致循环异常退出,同一个任务可能会被多个进程取到之后再使用 ZREM 命令进行争抢,那些没抢到的进程都是白取了一次任务,这是浪费;
  5. 通常可以使用 Lua 脚本的方式,将 ZRANGEBYSCORE 命令和 ZREM 命令一同挪到服务器端进行原子化操作,这样多个进程之间争抢任务时就不会出现这种浪费了。

异步队列

第一种方案 是使用 List 结构作为异步队列,RPUSH 命令生产消息,LPOP 命令消费消息。当使用 LPOP 命令没有得到消息的时候,需要适当 sleep 一会再重试,在这里 sleep 会导致消息的处理延迟增加。

如果不做 sleep 重试,改进的 第二种方案 是,使用 LPOP 命令的阻塞版本 BLPOP 命令,在 List 队列中没有消息的时候,它会阻塞直到消息到来,一旦数据到来,则立刻醒过来,消息的延迟几乎为零。但是如果线程一直阻塞,Redis 的客户端连接就成了闲置连接,闲置过久,服务器一般会主动断开连接,减少闲置资源占用。这个时候 BLPOP 命令会抛出异常来,代码中需要处理这样的异常。

除了 List 队列之外,第三种方案 是使用 Pub/Sub 订阅者模式实现一对多的消息队列。但是 Redis 的发布订阅功能是无状态的,对于发布者来说,无法知道发布的消息是否被订阅者接收到,在消费者下线的情况下,生产的消息会丢失。

Redis - 介绍与使用场景的更多相关文章

  1. 【Redis缓存机制】1.Redis介绍和使用场景

    (1)持久化数据库的缺点平常我们使用的关系型数据库有Mysql.Oracle以及SqlServer等,在开发的过程中,数据通常都是通过Web提供的数据库驱动来链接数据库进行增删改查. 那么,我们日常使 ...

  2. 1.Redis介绍和使用场景

    (1)持久化数据库的缺点 平常我们使用的关系型数据库有Mysql.Oracle以及SqlServer等,在开发的过程中,数据通常都是通过Web提供的数据库驱动来链接数据库进行增删改查. 那么,我们日常 ...

  3. Redis常用数据类型介绍、使用场景及其操作命令

    Redis常用数据类型介绍.使用场景及其操作命令 本文章同时也在cpper.info发布. Redis目前支持5种数据类型,分别是: 1.String(字符串) 2.List(列表) 3.Hash(字 ...

  4. Redis学习笔记(4)——Redis五大数据结构介绍以及应用场景

    出处:https://www.jianshu.com/p/f09480c05e42 Redis是典型的Key-Value类型数据库,Key为字符类型,Value的类型常用的为五种类型:String.H ...

  5. Redis介绍及常用命令

    一 Redis介绍 Redis是一个开源的使用ANSI C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API.从2010年3月15日起,Redis的开发 ...

  6. key-list类型内存数据引擎介绍及使用场景

    “互联网数据目前基本使用两种方式来存储,关系数据库或者key value.但是这些互联网业务本身并不属于这两种数据类型,比如用户在社会化平台中的关系,它是一个list,如果要用关系数据库存储就需要转换 ...

  7. redis 介绍和常用命令

    redis 介绍和常用命令 redis简介 Redis 是一款开源的,基于 BSD 许可的,高级键值 (key-value) 缓存 (cache) 和存储 (store) 系统.由于 Redis 的键 ...

  8. Redis介绍及Jedis测试

    1.Redis简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes ...

  9. Redis简介及应用场景

    一丶Redis介绍 Redis是一个开源的 key—value型 单线程 数据库,支持string.list.set.zset和hash类型数据. 默认端口:6379 默认数据库数量:16 二.优点: ...

  10. Redis介绍及Jedis基础操作

    1.Redis简介 Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes ...

随机推荐

  1. 【FAQ】关于华为地图服务定位存在偏差的原因及解决办法

    一. 问题描述: 华为地图服务"我的位置"能力,在中国大陆地区,向用户展示他们在地图上的当前位置与用户的实际位置存在较大的偏差. 具体差别可以查看下方的图片: 二. 偏差较大的原因 ...

  2. Modbus协议及python库实现

    基础知识 硬件层协议:解决0和1的可靠传输,常有RS232.RS485.CAN.IIC.SPI - 软件层协议:解决传输目的,常有Modbus.TCP/IP.CANopen - 协议优点: Modbu ...

  3. Linux操作系统,笔录!

    1.Linux 1.1.Linux介绍: Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户.多任务.支持多线程和多CPU的操作系统.它能运行主要的UNIX ...

  4. Springboot结构梳理

    springboot各层关系梳理 1.基本流程 View层-->Controller层(响应用户请求):导入 service层,调用你service方法,controller通过接受前端传来的参 ...

  5. TKK: 更新 TKK 失败,请检查网络连接 idea翻译错误-IDEA翻译失败-Translation用不了

    IDEA 提示:更新 TKK 失败,请检查网络连接 解决方法: 1.进入 C:\Windows\System32\drivers\etc 找到 hosts文件修改 注意:如果用记事本打开不能修改,则修 ...

  6. 【笔记】入门DP

    复习一下近期练习的入门 \(DP\) .巨佬勿喷.\(qwq\) 重新写一遍练手,加深理解. 代码已经处理,虽然很明显,但请勿未理解就贺 \(qwq\) 0X00 P1057 [NOIP2008 普及 ...

  7. jmeter分布式压测对master、slave防火墙配置

    首先要了解jmeter分布式压测的基础概念:master为统计结果的服务器,slave为各台压力机,如下图所示 一.结论 针对master 1.修改jmeter.properties的client.r ...

  8. 基于python的数学建模---机场航线设计

    数据集 拿走: 链接:https://pan.baidu.com/s/1zH5xhpEmx2_u5qO9W4gCkw 提取码:2wl5 数据集来自航空业,有一些关于航线的基本信息.有某段旅程的起始点和 ...

  9. Blazor Server完美实现Cookie Authorization and Authentication

    Blazor server-side application用Microsoft.AspNetCore.Identity.EntityFrameworkCore实现Authorization 和 Au ...

  10. .NET性能优化-ArrayPool同时复用数组和对象

    前两天在微信后台收到了读者的私信,问了一个这样的问题,由于私信回复有字数和篇幅限制,我在这里统一回复一下.读者的问题是这样的: 大佬您好,之前读了您的文章受益匪浅,我们有一个项目经常占用 7-8GB ...