redis 字符串类型常用场景以及相关示例
如题,记录一下相关内容
可以先看一下系列第一篇文章
缓存
字符串可以用作缓存键值对的存储方式。通过将经常使用的数据存储为字符串,可以提高读取速度,并减少数据库等后端系统的负载
数据库查询结果的缓存
场景
频繁读取相同数据
当某个数据被频繁地读取,而且这些读取操作对应的数据库查询操作比较耗时时,可以将查询结果缓存起来。这样避免每次都去执行数据库查询操作,提高读取速度和系统性能。数据更新频率较低
如果某个数据的更新频率较低,哪怕在缓存中存储的数据不是最新的,也不会对业务造成严重影响。例如某个网站的用户列表,在短时间内用户的新增、删除或修改操作较少,可以通过缓存数据库查询结果减少对数据库的访问,提高响应速度。并发读取压力较大
当多个用户同时访问并请求相同的数据时,如果每个请求都去执行数据库查询操作,会增加数据库的并发读取压力。通过缓存数据库查询结果,可以减少并发读取对数据库的影响,提高系统的并发处理能力。数据库性能有限
某些情况下,数据库本身的性能较差或者无法进行水平扩展,无法满足高并发读取需求。通过缓存查询结果,可以减少对数据库的访问次数,降低数据库负载,提高整体系统性能。
流程
client
发送一个请求到应用程序,请求某个数据server
检查缓存中是否存在相应的数据,以键值对的形式进行查找- 如果缓存中存在该数据,
server
直接从缓存中获取并返回给client
- 如果缓存中不存在该数据,
server
会执行数据库查询操作,从数据库中获取数据。 server
将从数据库中获取的数据存储到缓存中,以便下次使用。server
将从数据库中获取的数据返回给client
并在返回前将数据存储到缓存中。- 下次如果有相同的请求,
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的实际响应时间,减少了等待时间
流程
- 客户端发送一个请求到应用程序,请求某个API接口的数据。
- 应用程序首先检查缓存中是否存在对应的API请求结果,以键值对的形式进行查找。
- 如果缓存中存在该API请求结果,应用程序直接从缓存中获取并返回给客户端。
- 如果缓存中不存在该API请求结果,应用程序会向API服务发送请求,获取数据。
- 应用程序将从API服务获取的数据存储到缓存中,以便下次使用。
- 应用程序将从API服务获取的数据返回给客户端,并在返回前将数据存储到缓存中。
- 下次如果有相同的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时,可以直接从缓存中获取数据。复杂计算结果的缓存
如果某个计算结果的计算成本很高,但是在一段时间内保持不变,可以将计算结果进行缓存。这样在后续请求中可以直接使用缓存结果,避免重复计算,提高系统的性能。
流程
- 应用程序执行某个复杂的计算操作,得到一个结果。
- 应用程序首先检查缓存中是否存在该计算结果,以键值对的形式进行查找。
- 如果缓存中存在该计算结果,应用程序直接从缓存中获取并使用。
- 如果缓存中不存在该计算结果,应用程序会执行该复杂计算操作,得到结果。
- 应用程序将计算得到的结果存储到缓存中,以便下次使用。
- 应用程序使用计算得到的结果进行后续操作,并在使用前将结果存储到缓存中。
- 下次如果需要相同的计算结果,应用程序会直接从缓存中获取,并使用缓存的结果,无需再次执行复杂计算操作。
示例
和api结果缓存差不多
计数器
字符串可以用来存储和操作计数器。例如,统计网页的访问量、用户的登录次数等
场景
点击统计
记录网页、广告或按钮的点击次数。每当有用户点击时,可以通过 INCR 命令将计数器加一。这样可以实时统计点击量,并根据数据进行分析和优化。并发控制
在某些场景下,需要限制或控制用户对资源的并发访问量,例如 API 接口的并发请求控制。记录每个用户的请求次数,在达到设定的阈值时进行限制或采取相应的策略。投票系统
在投票系统中,记录每个候选项的得票数。每当有用户投票时,可以通过 INCR 命令将对应候选项的计数器加一。这样可以方便地统计和显示各候选项的得票情况。消息通知计数
对于社交网络或消息推送应用,记录用户收到的未读消息数量。每当有新消息到达时,可以通过 INCR 命令将对应用户的计数器加一。这样可以快速查询和显示用户未读消息数量。API 访问频率限制
在需要对 API 访问频率进行限制的场景中,记录每个 API 的访问次数。通过适当的设置和检查计数器的值,可以实施访问频率限制策略,防止恶意请求或超出授权范围的访问。缓存失效通知
在缓存应用中,记录缓存的更新时间或版本号。每当缓存发生变化时,可以通过 INCR 命令将计数器加一。这样可以在需要时快速判断缓存是否过期或需要更新。
世人慌慌张张,不过图碎银几两