redis 字符串类型常用场景以及相关示例

如题,记录一下相关内容

可以先看一下系列第一篇文章

缓存

字符串可以用作缓存键值对的存储方式。通过将经常使用的数据存储为字符串,可以提高读取速度,并减少数据库等后端系统的负载

数据库查询结果的缓存

场景


  • 频繁读取相同数据 当某个数据被频繁地读取,而且这些读取操作对应的数据库查询操作比较耗时时,可以将查询结果缓存起来。这样避免每次都去执行数据库查询操作,提高读取速度和系统性能。
  • 数据更新频率较低 如果某个数据的更新频率较低,哪怕在缓存中存储的数据不是最新的,也不会对业务造成严重影响。例如某个网站的用户列表,在短时间内用户的新增、删除或修改操作较少,可以通过缓存数据库查询结果减少对数据库的访问,提高响应速度。
  • 并发读取压力较大 当多个用户同时访问并请求相同的数据时,如果每个请求都去执行数据库查询操作,会增加数据库的并发读取压力。通过缓存数据库查询结果,可以减少并发读取对数据库的影响,提高系统的并发处理能力。
  • 数据库性能有限 某些情况下,数据库本身的性能较差或者无法进行水平扩展,无法满足高并发读取需求。通过缓存查询结果,可以减少对数据库的访问次数,降低数据库负载,提高整体系统性能。

流程


  1. client 发送一个请求到应用程序,请求某个数据
  2. server 检查缓存中是否存在相应的数据,以键值对的形式进行查找
  3. 如果缓存中存在该数据,server 直接从缓存中获取并返回给 client
  4. 如果缓存中不存在该数据,server 会执行数据库查询操作,从数据库中获取数据。
  5. server 将从数据库中获取的数据存储到缓存中,以便下次使用。
  6. server 将从数据库中获取的数据返回给 client 并在返回前将数据存储到缓存中。
  7. 下次如果有相同的请求, server 会直接从缓存中获取数据,并返回给 client 无需再次查询数据库。

代码示例 (省略配置redis)


/**
* laravel 查询构造器中已经内置了相应的缓存方法
*/
$where = [];//查询条件
// 查找符合 $where 条件的用户,并将查询结果缓存起来,有效期为 10 分钟。通过 get 方法获取查询结果的集合。
$users = User::where($where)->remember(10)->get();
/**
* thinkphp同laravel一样实现了查询构造器的内嵌
*/
// cache(true, 600) 表示将查询结果缓存起来,有效期为 600 秒(即 10 分钟)
$users = User::where($where)->cache(true, 600)->select();

API请求结果的缓存

场景


  • 提高性能 当API的响应结果相对稳定且耗时较长时,将API请求结果进行缓存。在后续相同的请求中,可以直接从缓存中获取结果,减少了对API的实际调用,加快了响应速度,提高了系统的整体性能
  • 减轻服务压力 高并发的情况下如果每次请求都要去实际调用API获取结果,会加重服务器的负载。通过缓存API请求结果,可以减轻服务器的压力,降低系统资源消耗,提高系统的可扩展性和稳定性
  • 优化用户体验 对于一些公共数据、静态数据或者频繁请求的数据,将其缓存可以提供更好的用户体验。用户可以快速获取到经过缓存的数据,无需等待API的实际响应时间,减少了等待时间

流程


  1. 客户端发送一个请求到应用程序,请求某个API接口的数据。
  2. 应用程序首先检查缓存中是否存在对应的API请求结果,以键值对的形式进行查找。
  3. 如果缓存中存在该API请求结果,应用程序直接从缓存中获取并返回给客户端。
  4. 如果缓存中不存在该API请求结果,应用程序会向API服务发送请求,获取数据。
  5. 应用程序将从API服务获取的数据存储到缓存中,以便下次使用。
  6. 应用程序将从API服务获取的数据返回给客户端,并在返回前将数据存储到缓存中。
  7. 下次如果有相同的API请求,应用程序会直接从缓存中获取数据,并返回给客户端,无需再次请求API服务。

代码示例


/**
* laravel中可以拿cache助手函数或者Cache门面类来优雅使用缓存
*/
use Illuminate\Support\Facades\Cache;

public function getApiData()
{
    $key = 'api_data'; // 缓存键名
    $minutes = 10; // 缓存有效期,单位分钟

    // 尝试从缓存中获取数据,如果缓存不存在,则执行回调函数获取数据
    $result = Cache::remember($key, $minutes, function () {
        $apiResult = // 发起数据查询并获取结果
        return $apiResult;
    });
    return $result;
}

/**
* thinkphp 中也是差不多
*/
use think\facade\Cache;
public function getApiData()
{
    $key = 'api_data'; // 缓存键名
    $expire = 600; // 缓存有效期,单位秒
    // 尝试从缓存中获取数据,如果缓存不存在,则执行回调函数获取数据
    $result = Cache::remember($key, $expire, function () {
        $apiResult = // 发起数据查询并获取结果
        return $apiResult;
    });
    return $result;
}

预先计算结果的缓存

场景


  • 频繁计算且结果稳定 当某个计算过程相对耗时且结果在特定时间段内保持不变时,可以将计算结果缓存起来。这样,在后续请求中可以直接从缓存中获取结果,避免重复计算,提高响应速度。
  • 数据库查询结果缓存 当数据库的查询操作比较复杂且耗时,而查询结果又在一段时间内保持一致时,可以将查询结果进行缓存。这样,在后续请求中可以直接从缓存中获取数据,减轻数据库负载。
  • API请求结果缓存 当应用需要频繁调用第三方API获取数据时,可以将API请求结果进行缓存。这样可以减少对第三方API的请求次数,降低延迟,并且在短时间内多次请求相同的API时,可以直接从缓存中获取数据。
  • 复杂计算结果的缓存 如果某个计算结果的计算成本很高,但是在一段时间内保持不变,可以将计算结果进行缓存。这样在后续请求中可以直接使用缓存结果,避免重复计算,提高系统的性能。

流程


  1. 应用程序执行某个复杂的计算操作,得到一个结果。
  2. 应用程序首先检查缓存中是否存在该计算结果,以键值对的形式进行查找。
  3. 如果缓存中存在该计算结果,应用程序直接从缓存中获取并使用。
  4. 如果缓存中不存在该计算结果,应用程序会执行该复杂计算操作,得到结果。
  5. 应用程序将计算得到的结果存储到缓存中,以便下次使用。
  6. 应用程序使用计算得到的结果进行后续操作,并在使用前将结果存储到缓存中。
  7. 下次如果需要相同的计算结果,应用程序会直接从缓存中获取,并使用缓存的结果,无需再次执行复杂计算操作。

示例

和api结果缓存差不多

计数器

字符串可以用来存储和操作计数器。例如,统计网页的访问量、用户的登录次数等

场景


  • 点击统计 记录网页、广告或按钮的点击次数。每当有用户点击时,可以通过 INCR 命令将计数器加一。这样可以实时统计点击量,并根据数据进行分析和优化。
  • 并发控制 在某些场景下,需要限制或控制用户对资源的并发访问量,例如 API 接口的并发请求控制。记录每个用户的请求次数,在达到设定的阈值时进行限制或采取相应的策略。
  • 投票系统 在投票系统中,记录每个候选项的得票数。每当有用户投票时,可以通过 INCR 命令将对应候选项的计数器加一。这样可以方便地统计和显示各候选项的得票情况。
  • 消息通知计数 对于社交网络或消息推送应用,记录用户收到的未读消息数量。每当有新消息到达时,可以通过 INCR 命令将对应用户的计数器加一。这样可以快速查询和显示用户未读消息数量。
  • API 访问频率限制 在需要对 API 访问频率进行限制的场景中,记录每个 API 的访问次数。通过适当的设置和检查计数器的值,可以实施访问频率限制策略,防止恶意请求或超出授权范围的访问。
  • 缓存失效通知 在缓存应用中,记录缓存的更新时间或版本号。每当缓存发生变化时,可以通过 INCR 命令将计数器加一。这样可以在需要时快速判断缓存是否过期或需要更新。

posted @ 2023-07-09 00:52  Death-Satan  阅读(10)  评论(0编辑  收藏  举报