Redis的计数功能
Redis的学习专栏:http://t.csdnimg.cn/a8cvV
许多应用都会使用Redis作为计数的基本工具,可以实现快速计数、查询缓存的功能,同时数据也可以异步处理。例如:博客浏览,用户每查看一次,就会增加一次的访问量;手机验证码,一分钟之内只能发送一次!
普通的计数器,有很多bug,比如:访问量计数方式呢?阅读程度呢?总不可能一刷新就增加一次吧!
解决方法:在规定时间内一个用户,不能超过规定只能访问一次。而这种情况,我们可以先将数据存储在主存里,然后同步到数据库当中。
方法:
- 先初始化一下RedisTemplate,这个是操作redis的第三方库,我们先要对他初始化一下(重新序列化)
@Autowiredprivate StringRedisTemplate stringRedisTemplate;@Configuration
public class RedisConfig {@Beanpublic RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();redisTemplate.setConnectionFactory(connectionFactory);redisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setValueSerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());// 这个地方不可使用 json 序列化,如果使用的是ObjectRecord传输对象时,可能会有问题,会出现一个 java.lang.IllegalArgumentException: Value must not be null! 错误redisTemplate.setHashValueSerializer(RedisSerializer.string());return redisTemplate;}
}
2.访问
/*** 利用redis做计数器* 可以处理业务上面的的一些访问次数之类的* 例如:文章的点赞数,阅读量,允许有一点的延迟效果,先保存到redis中,然后在同步到数据库当中*/@RequestMapping("hello")public void count() {/*** 判断是否到达次数*/Boolean aBoolean = invokeExceededTimes("time_key2",1,3);if (aBoolean) {LOGGER.info("可以访问");}else {LOGGER.info("请求次数达标了");}}/*** 判断同一个key在规定时间内访问次数是否到达了最高值* @param key 键* @param days 时间* @param count 一定时间内的访问次数* @return*/public Boolean invokeExceededTimes(String key, int days, int count) {LOGGER.info("key值:{}",key);// 判断在redis中是否有key值Boolean redisKey = stringRedisTemplate.hasKey(key);if (redisKey) {// 获取key所对应的valueInteger hasKey =Integer.parseInt((String)stringRedisTemplate.opsForValue().get(key));if (hasKey >= count) {return false;}// 对value进行加1操作stringRedisTemplate.opsForValue().increment(key,1);return true;}else {// 如果没有key值,对他进行添加到redis中stringRedisTemplate.opsForValue().set(key,"1",days,TimeUnit.DAYS);}return true;}
我们设置每一个Redis当中的KEY值,如果KEY当中的值超过固定次数,则不会再自增了,而一旦过了存活时间之后就可以再次访问了。
RedisTemplate 常用方法
| Boolean expire(K key, final long timeout, final TimeUnit unit) | 为指定的 key 指定缓存失效时间。时间一到 key 会被移除。key 不存在时,不影响 |
| Boolean expireAt(K key, final Date date) | 设置 key 失效日期。注意:如果 key 后续被重新设置值,比如 set key value,则 key 过期时间失效,需要重新设置。 |
| Long getExpire(K key) | 获取 key 的剩余过期时间。 -1 表示永久有效。-2 表示 key 不存在。 |
| Long getExpire(K key, final TimeUnit timeUnit) | 获取 key 的剩余过期时间,并换算成指定的时间单位 |
| Boolean hasKey(K key) | 判断 key 是否存在 |
| Boolean delete(K key) | 删除指定的 key |
| Long delete(Collection keys) | 删除多个 key |
| RedisSerializer<?> getDefaultSerializer() | 获取默认的序列化方式。RedisTemplate 是 JdkSerializationRedisSerializer; |
| Set keys(K pattern) | 获取整个库下符合指定正则的所有 key,如 keys(*) 获取所有 key |
| Boolean move(K key, final int dbIndex) | 将 key 从当前库移动目标库 dbIndex |
| ClusterOperations<K, V> opsForCluster() | 获取 ClusterOperations 用于操作集群 |
| GeoOperations<K, V> opsForGeo() | 获取 GeoOperations 用于操作地图 |
| redisTemplate.getConnectionFactory().getConnection().flushAll(); | //清空 redis 所有数据库(all databases)中的所有数据(all keys) |
| redisTemplate.getConnectionFactory().getConnection().flushDb(); | 清空 redis 当前连接的数据库(selected database)中的所有数据(all keys) |
还有很多很多方法,需要时再去找、使用。
相关文章:
Redis的计数功能
Redis的学习专栏:http://t.csdnimg.cn/a8cvV 许多应用都会使用Redis作为计数的基本工具,可以实现快速计数、查询缓存的功能,同时数据也可以异步处理。例如:博客浏览,用户每查看一次,就会增加一次的访问量&a…...
WPF学习(7) --MVVM模式
1. MVVM模式概述 MVVM模式由三个主要部分组成: Model(模型):包含应用程序的业务逻辑和数据。通常是数据对象和数据访问层。View(视图):用户界面部分,展示数据并与用户进行交互。通…...
【人工智能】-- 受限玻尔兹曼机
个人主页:欢迎来到 Papicatch的博客 课设专栏 :学生成绩管理系统 专业知识专栏: 专业知识 文章目录 🍉引言 🍉受限玻尔兹曼机 🍈RBM的结构 🍍RBM的架构图 🍍RBM的经典实现 &…...
在 Android 中定义和使用自定义属性
1. 定义自定义属性 首先,我们需要在 res/values/attrs.xml 文件中定义自定义属性。这些属性可以是颜色、尺寸、字符串等。 创建或打开 res/values/attrs.xml 文件,并添加以下内容: <?xml version"1.0" encoding"utf-8&…...
【实战:python-Django发送邮件-短信-钉钉通知】
一 Python发送邮件 1.1 使用SMTP模块发送邮件 import smtplib from email.mime.text import MIMEText from email.header import Headermsg_from 306334678qq.com # 发送方邮箱 passwd luzdikipwhjjbibf # 填入发送方邮箱的授权码(填入自己的授权码,相当于邮箱…...
Todo List
待整理的笔记,先列出来,防止后面忘记要整理什么内容。一个一个整理: Linux内核ARM架构(v8)的系统调用的实现过程;open()/write()/read()在Linux内核中的详细实现过程,到驱动中注册的操作集的调用过程;文件…...
【Redis】Redis十大类型
文章目录 前言一、string字符串类型二、List列表类型三、 Hash表四、 Set集合五、 ZSet有序集合六、 GEO地理空间七、 HyperLogLog基数统计八、Bitmap位图九、bitfield位域十、 Stream流10.1 队列指令10.2 消费组指令10.3 ACK机制 前言 redis是k-v键值对进行存储,k…...
存储实验:Linux挂载iscsi硬盘与华为OceanStor创建LUN全流程
目录 目的环境规划实验实验流程Centos配置0. 关闭防火墙1. 设置网卡信息2. 配置路由3. iscsiadm连接存储 iSCSI LUN创建(以华为OceanStor为例)验证1. 验证是否成功2. 开启自动挂载 目的 实现Linux连接iscsi硬盘,同时实现开机自启挂载 环境规…...
高可用系统架构设计技术方案:Java架构师视角
在现代互联网环境下,高可用性(High Availability, HA)已成为衡量系统质量的重要指标之一。对于Java架构师而言,设计一套能够保证业务连续性、快速恢复和持续服务的高可用系统架构,是一项复杂而挑战性的任务。本文将从J…...
C++ --> 类和对象(三)
欢迎来到我的Blog,点击关注哦💕 前言 前面已经对类和对象有一定的了解,接下来再次深入的了解一下。 一、深入理解构造函数 构造函数体赋值: 虽然上述构造函数调用之后,对象中已经有了一个初始值,但是不能…...
JS【详解】类 class ( ES6 新增语法 )
本质上,类只是一种特殊的函数。 console.log(typeof 某类); //"function"声明类 class 方式 1 – 类声明 class Car {constructor(model, year) {this.model model;this.year year;} }方式 2 – 类表达式 匿名式 const Car class {constructor(mod…...
vue中使用$set方法给对象添加属性
vue中可以使用$set()给对象添加属性,但不是所有的对象都可以使用,vue中api明确说明,它必须用于向响应式对象上添加属性 响应式对象,vue的响应式原理,可以查看:深入响应式原理 — Vue.js ①对象赋值 this…...
【Python】ftplib的使用
仅描述基础要点,备忘。 python自带ftplib库,可实现ftp读写。 1 要点 ftp未使用默认端口21时,需显示指定端口。ftp路径带有中文,可能需要设置ftp的encoding属性为 gbk。ftplib不支持递归创建目录,需手动创建层级目录…...
CSS 【详解】CSS 函数(含 calc,min,max,clamp,cubic-bezier,env,steps 等)
函数描述CSS 版本attr()返回选择元素的属性值。2calc()允许计算 CSS 的属性值,比如动态计算长度值。3cubic-bezier()定义了一个贝塞尔曲线(Cubic Bezier)。3hsl()使用色相、饱和度、亮度来定义颜色。3hsla()使用色相、饱和度、亮度、透明度来定义颜色。3linear-grad…...
简单理解Lua 协程(coroutine)
也许更好的阅读体验 协程简单理解为可以暂停的线程,但是同一时刻只有一个协程可以处于运行状态。 文章目录 coroutine.create()coroutine.resume()coroutine.wrap()coroutine.yield()coroutine.resume()参数传递resume和yield之间互换数据 coroutine.create() lua…...
(day18) leetcode 204.计数质数
描述 给定整数 n ,返回 所有小于非负整数 n 的质数的数量 。 示例 1: 输入:n 10 输出:4 解释:小于 10 的质数一共有 4 个, 它们是 2, 3, 5, 7 。示例 2: 输入:n 0 输出:0示例 3…...
SadTalker数字人服务器部署
一、单独SadTalker部署 git clone https://github.com/OpenTalker/SadTalker.gitcd SadTalker conda create -n sadtalker python3.8conda activate sadtalkerpip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pyto…...
Python实现一对多WebSocket发送给指定多个客户端
在一对多的WebSocket场景下,如果你想要向特定的多个客户端发送消息,而不是广播给所有客户端,你需要维护一个能够标识每个客户端的方式,比如使用用户名或者客户端ID。这样,你就可以根据需要选择向哪些客户端发送消息。 …...
Power BI 工具介绍
Power BI是一款商业智能(BI)软件,由微软开发,旨在帮助用户将复杂的数据转化为视觉化的交互式见解。Power BI提供了一套完整的工具,包括数据连接、数据准备、数据建模、数据分析和数据可视化等功能,使用户能…...
银河麒麟高级服务器操作系统V10加固操作指南
1:检查系统openssh安全配置: 2:检查是否设置口令过期前警告天数: 3:检查账户认证失败次数限制: 修改/etc/pam.d/system-auth文件中deny的参数即可 4:检查是否配置SSH方式账户认证失败次数限制:...
Python爬虫实战:手把手教你古文字字形索引全量采集与图文数据库构建!
㊗️本期内容已收录至专栏《Python爬虫实战》,持续完善知识体系与项目实战,建议先订阅收藏,后续查阅更方便~ ㊙️本期爬虫难度指数:⭐ (基础入门篇) 🉐福利: 一次订阅后,专栏内的所有…...
Jimeng LoRA动态热切换实战:避免显存爆炸,轻松测试多训练阶段模型
Jimeng LoRA动态热切换实战:避免显存爆炸,轻松测试多训练阶段模型 1. 项目背景与核心价值 你是否遇到过这样的困扰:在测试不同训练阶段的LoRA模型时,每次切换版本都需要重新加载底座模型,不仅耗时耗力,还…...
基于Spring Boot+Vue3的烹饪交流学习系统 设计与实现
基于 Spring Boot Vue3 的烹饪交流学习系统 设计与实现 一、项目概述 随着人们对烹饪学习与交流需求的增加,传统线下学习模式在菜谱管理、内容发现、交流共享与个性化推荐等方面存在明显不足。为此,本项目基于 Spring Boot Vue3 技术栈,构建…...
Qwen3-VL-8B-Instruct-GGUF实战:上传图片秒懂内容,智能问答体验分享
Qwen3-VL-8B-Instruct-GGUF实战:上传图片秒懂内容,智能问答体验分享 1. 模型概述与核心优势 Qwen3-VL-8B-Instruct-GGUF是阿里通义最新推出的中量级多模态模型,它最大的特点可以用一句话概括:用8B参数实现72B级别的视觉语言理解…...
Spire.Doc转PDF授权限制解析与解决方案
1. Spire.Doc转PDF的三页限制是怎么回事 第一次用Spire.Doc转换PDF时,我盯着生成的3页文档愣了半天——明明50页的Word文件,怎么输出就只剩个开头了?后来查文档才发现,这是未授权版本的硬性限制。就像试用版软件经常会有功能阉割&…...
Llama-3.2V-11B-cot参数详解:官方最优推理配置+冲突参数自动剔除机制说明
Llama-3.2V-11B-cot参数详解:官方最优推理配置冲突参数自动剔除机制说明 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具,专为双卡RTX 4090环境深度优化。该工具通过一系列技术创新,解…...
Step3-VL-10B基础教程:Gradio WebUI本地/远程访问配置与常见报错解决
Step3-VL-10B基础教程:Gradio WebUI本地/远程访问配置与常见报错解决 1. 引言 你是不是已经部署好了Step3-VL-10B这个强大的视觉语言模型,但在浏览器里输入地址后,要么页面打不开,要么显示一堆看不懂的错误信息?别着…...
UE4动画师救星:用Control Rig快速修复动捕数据的5个实战技巧与避坑指南
UE4动画师救星:用Control Rig快速修复动捕数据的5个实战技巧与避坑指南 在动作捕捉技术日益普及的今天,动画师们常常面临一个尴尬的现实:昂贵的动捕设备能捕捉到演员生动的表演,但原始数据往往充斥着各种瑕疵——手部穿模、脚步滑…...
Problem - 2180D - Codeforces
Problem - 2180D - Codeforces 题意很简单 要求圆的面积没有交点 然后求尽可能大的相切点的个数 首先每个点的半径的上界就是他到相邻两个节点的距离的最小值 对于一段合法的圆 我们可以求一下第一个圆的半径的范围 然后就可以根据圆之间的距离求出下一个圆的半径的范围 如…...
09_微服务划分与团队人数之阿里实践与行业案例
微服务划分与团队人数之阿里实践与行业案例 体系内容 拆分维度:业务能力维度、通用能力维度、非功能维度 组织原则:康威定律、领域自治、平台沉淀、核心/非核心差异化治理 Spring Cloud Alibaba 视角:Nacos、Sentinel、RocketMQ、Seata、Dubbo 在企业场景中的组合打法 行业…...
