第四阶段17-关于Redis中的list类型,缓存预热,关于Mybatis中的`#{}`和`${}`这2种格式的占位符
关于Redis中的list类型
Redis中的list是一种先进后出、后进先出的栈结构的数据。
在使用Redis时,应该将list想像为以上图例中翻转了90度的样子,例如:
在Redis中的list数据,不仅可以从左侧压入,也可以选择从右侧压入,例如:
在Redis中的list数据,每个元素都有2个下标值,如下图所示:
如果需要获取list中的全部元素,通常从0
开始,直至-1
即可。
关于Redis中的数据的Key
根据《阿里巴巴Java开发手册》,各Key必须声明为常量,所以,应该在接口中定义Key值。
由于Redis的定位是用于缓存海量的数据,为了有效的管理各个Key,强烈建议使用多个单词组成各个Key,例如“品牌列表”的Key应该由“品牌”和“列表”这2个词对应的英语单词组成,且强烈建议各单词之间使用冒号进行分隔,在许多可视化工具中,会默认(通常可配置)使用冒号来分隔并形成文件夹的显示效果,例如:
public interface IBrandRedisRepository {/*** 品牌数据在缓存中的Key的前缀*/String BRAND_ITEM_KEY_PREFIX = "brand:item:";/*** 品牌列表数据在缓存中的Key*/String BRAND_LIST_KEY = "brand:list";// 暂不关心其它代码}
在Another Redis Desktop Manager中的显示效果:
缓存预热
当服务器端启动时,就读取MySQL数据库,并将相关数据写入到Redis中,使得“启动完成时,Redis中就已经存入了需要缓存的数据”,这种做法称之为“缓存预热”。
在Spring Boot中,可以自定义组件类,实现ApplicationRunner
接口,此接口中有run()
方法,此方法会在项目启动成功后的第一时间自动执行!
在项目的根包下创建preload.CachePreload
类,用于处理缓存预热:
@Slf4j
@Component
public class CachePreload implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {log.debug("开始执行CachePreload.run()");}}
启动项目,可以看到run()
方法在启动项目之后自动执行了:
使用缓存导致的数据一致性问题
当使用缓存后,在关系型数据库(例如MySQL)中存有数据,在缓存(例如Redis)中也存在数据,这2处的数据可能是不一致的(例如修改了MySQL中的数据,但是没有同时修改Redis中的数据),那么,则存在数据一致性问题,可能需要保证这2处的数据一致!
**注意:**如果需要保持数据一致,当数据发生变化,向MySQL或Redis中写入数据时,还必须向Redis或MySQL中也写入数据,即2个数据库必须同时写入!同时写入也会带来许多问题,例如,消耗服务器端的资源,事务相关问题。
**注意:**并不是所有数据都必须时刻保持一致!例如:热门话题的阅读量。
**注意:**通常,绝大部分数据只需要在某段时间内保持数据一致即可,并不需要时刻保持一致性。某些特殊场景中的重要数据才需要始终保持数据的一致性!
计划任务
计划任务:周期性的,在满足某条件(例如到了某个时间点)执行某个任务。
在Spring Boot中,要执行计划任务,首先,需要在配置类上使用@EnableScheduling
注解开启计划任务。
在项目的根包下创建config.ScheduleConfiguration
类,以开启计划任务:
package cn.tedu.csmall.product.config;import lombok.extern.slf4j.Slf4j;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;/*** 计划任务配置类** @author java@tedu.cn* @version 0.0.1*/
@Slf4j
@Configuration
@EnableScheduling
public class ScheduleConfiguration {public ScheduleConfiguration() {log.debug("创建配置类对象:ScheduleConfiguration");}}
然后,自定义组件类,作为计划任务类,然后,在类中自定义计划任务方法,并在方法上通过@Scheduled
注解配置计划任务参数。
在项目的根包下创建schedule.CacheSchedule
类,在类上添加@Component
注解,在类中定义方法作为计划任务方法:
@Slf4j
@Component
public class CacheSchedule {@Autowiredprivate IBrandService brandService;public CacheSchedule() {log.debug("创建计划任务类对象:CacheSchedule");}// fixedRate:执行计划任务的间隔时间,以毫秒为单位@Scheduled(fixedRate = 5000)public void xxxxx() {log.debug("开始执行计划任务……");// brandService.rebuildCache();}}
关于Mybatis中的#{}
和${}
这2种格式的占位符
以AdminMapper.xml
中的getStandardById()
对应的查询为例:
<select id="getStandardById" resultMap="StandardResultMap">SELECT<include refid="StandardQueryFields"/>FROMams_adminWHEREid=#{id}
</select>
以上占位符使用#{id}
或${id}
最终的执行结果是完全相同的!
而getLoginInfoByUsername()
对应的查询:
<select id="getLoginInfoByUsername" resultMap="LoginInfoResultMap">SELECT<include refid="LoginInfoQueryFields"/>FROMams_adminLEFT JOIN ams_admin_role ON ams_admin.id=ams_admin_role.admin_idLEFT JOIN ams_role_permission ON ams_admin_role.role_id=ams_role_permission.role_idLEFT JOIN ams_permission ON ams_role_permission.permission_id=ams_permission.idWHEREusername=#{username}
</select>
以上配置中,使用#{username}
可以正常查询,如果换成${username}
则会出现异常:
Cause: java.sql.SQLSyntaxErrorException: Unknown column 'root' in 'where clause'
提示:以上错误信息中的root
是测试执行时传入的参数。
当使用${username}
作为占位符时,需要使用一对单引号将${username}
框住,即:
where username='${username}'
或者,传入的字符串需要使用单引号框,例如:
@Test
void getLoginInfoByUsername() {String username = "'root'"; // 使用一对单引号框住字符串值Object queryResult = mapper.getLoginInfoByUsername(username);log.debug("根据用户名【{}】查询数据详情完成,查询结果:{}", username, queryResult);
}
出现这样的问题,原因在于:在SQL语句中,除了关键字(例如SELECT
)、数值、布尔值、标点符号以外的内容,除非是在特定语法格式中表现的(例如数据表名称可能出现的位置就非常固定),否则,其它所有未被单引号框住的,都会被视为“字段名”!
或者说,在SQL语句中,所有值都应该使用一对单引号框住,否则,就会被当成字段名,但是,由于字段名不可能是纯数字,而布尔值的true
和false
都是关键字,不可能被误认为字段名,所以,数值和布尔值可以不添加一对单引号!
在使用#{}
格式的占位符时,无论是哪种类型的值,都不必考虑添加一对单引号的问题,是因为使用#{}
格式的占位符时,SQL语句会被“预编译”的机制进行处理,而编译与执行的流程顺序是:词法分析、语义分析、编译、执行,在“预编译”的机制中,是会先编译,再将值代入到编译中执行!例如以下代码:
select * from user where username=?
在编译时,并不确定在where
条件中username
的值是多少,但是,即便不知道具体值,也不影响词法分析、语义分析!当经过编译后,以上语句中的?
部分肯定只能是某个值,不可能是字段名,所以,在使用了“预编译”的机制中,传入的值不必考虑数据类型的问题,也就是说,即使传入字符串值,此值也不需要使用一对单引号框住。
基于以上特性,使用“预编译”的机制,也完全不存在“SQL注入”的风险!
在使用${}
格式的占位符时,是先将值入代入到SQL语句中,再进行编译、执行,所以,非数值、非布尔值必须添加一对单引号,同时,存在SQL注入的风险!
相关文章:
第四阶段17-关于Redis中的list类型,缓存预热,关于Mybatis中的`#{}`和`${}`这2种格式的占位符
关于Redis中的list类型 Redis中的list是一种先进后出、后进先出的栈结构的数据。 在使用Redis时,应该将list想像为以上图例中翻转了90度的样子,例如: 在Redis中的list数据,不仅可以从左侧压入,也可以选择从右侧压入…...
stringstream用法
stringstream是 C++ 提供的另一个字串型的串流(stream)物件,和之前学过的iostream、fstream有类似的操作方式。包含在头文件sstream中(#include <sstream>)。 实例: 1、C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性、类…...
2022年下半年系统集成项目管理工程师综合知识真题及答案解析
2022年下半年系统集成项目管理工程师综合知识真题及答案解析 1、()不属于“提升云计算自主创新能力”的工作内容。A.加强云计算相关基础研究、应用研究、技术研发、市场培育和产业政策密衔接与统筹协调B.引导大型云计算中心优先在能源充足、气候适宜、自然灾害较少的地区部…...
【洛谷 P2089】烤鸡(搜索)
烤鸡 题目背景 猪猪 Hanke 得到了一只鸡。 题目描述 猪猪 Hanke 特别喜欢吃烤鸡(本是同畜牲,相煎何太急!)Hanke 吃鸡很特别,为什么特别呢?因为他有 101010 种配料(芥末、孜然等)…...
Mac item2 配置免密登录开发机
1、配置 vi ~/.ssh/config 内容如下: Host * ControlMaster auto ControlPath ~/.ssh/master-%r%h:%p ControlPersist yes ServerAliveInterval 60 学习: ControlMaster #连接共享 ControlPath #与ControlMaster一起使用,指定连接共享的路径…...
vue 解决问题:Webpack安装不成功,webpack -v无法正常显示版本号
目录 一、解决问题:Webpack安装不成功,webpack -v无法正常显示版本号 二、解决问题: ERROR Error: Cannot find module webpack-log 三、 解决报错:error:03000086:digital envelope routines::initialization error 四、解决…...
07-1【openEuler】系统及进程管理(网络管理的补充实验及说明)
文章目录说在前面关于nmcli命令的使用使用nmcli命令修改主机IP地址1、运行ip addr列出openEuler20.03上的以太网卡2、列出当前活动的以太网卡3、开始分配静态IP地址(1)命令语法(2)将 IPv4 地址192.168.74.175分配给 ens33 网卡上&…...
【Linux】磁盘结构、文件系统、软硬链接、动静态库链接
文章目录1、磁盘结构1.1 磁盘的物理结构1.2 磁盘的存储结构1.3 磁盘的逻辑结构2、文件系统2.1 4KB加载到内存2.2 文件系统结构3、软硬链接3.1 软链接3.2 硬链接4、动静态库4.1 什么是库?4.2 静态库和静态库链接4.3 动态库和动态库链接4.4 动静态库的加载下面了解到&…...
交换机电口、光口、网络速率的基本概念总结
电口和光口千兆网 & 万兆网:POE:包转发率:背板带宽/交换容量:)电口和光口 电口: 电口也即RJ45口,插双绞线的端口(网线),一般速率为10M或100M,即为百兆工…...
【面试题 05.02. 二进制数转字符串】
来源:力扣(LeetCode) 描述: 二进制数转字符串。给定一个介于0和1之间的实数(如0.72),类型为double,打印它的二进制表达式。如果该数字无法精确地用32位以内的二进制表示࿰…...
webpack - webpack的基本使用和总结
文章目录1,webpack概念2,为什么学webpack3,webpack特点4,相对于其他工具优点5,准备工作6,webpack的核心介绍7,webpack使用 - 打包js代码8,打包css代码9,生成html文件10&a…...
【蓝桥杯嵌入式】定时器实现按键单击,双击,消抖以及长按的代码实现
🎊【蓝桥杯嵌入式】专题正在持续更新中,原理图解析✨,各模块分析✨以及历年真题讲解✨都在这儿哦,欢迎大家前往订阅本专题,获取更多详细信息哦🎏🎏🎏 🪔本系列专栏 - 蓝…...
基于SSM的Javaweb爱心扶贫捐赠系统
文章目录 项目介绍主要功能截图:后台登录首页个人中心用户管理扶贫物资管理扶贫产品管理留言板管理前台前台首页扶贫产品新闻资讯留言板部分代码展示设计总结项目获取方式🍅 作者主页:Java韩立 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,…...
Spring Cloud(微服务)学习篇(三)
Spring Cloud(微服务)学习篇(三) 1 nacos中使用openFeign(调用方式)实现短信发送 1.1 在shop-sms-api中创建com.zlz.shop.sms.api.service/vo/dto/util,目录结构如下所示 1.2 在pom.xml(shop-sms-api)中加入如下依赖 <dependencies><dependency><groupId>…...
一文带你吃透JSP,增删改查实战案例详细解读
文章目录前言JSP 概述JSP快速入门搭建环境导入JSP依赖创建 JSP 页面编写代码测试JSP原理JSP 脚本实战案例JSP缺点发展阶段EL 表达式概述实战案例域对象JSTL 标签用法1用法2前言 不得不说,JSP 现在已经是一门十分老旧的技术了,学习编程时,不仅…...
taobao.item.propimg.upload( 添加或修改属性图片 )
¥开放平台基础API必须用户授权 添加一张商品属性图片到num_iid指定的商品中 传入的num_iid所对应的商品必须属于当前会话的用户 图片的属性必须要是颜色的属性,这个在前台显示的时候需要和sku进行关联的 商品属性图片只有享有服务的卖家(如&a…...
TDEngine集群监控组件安装配置(Telegra+Grafana方案)
Tdengine的监控指标包括以下几个方面: 系统指标:CPU使用率、内存使用率、磁盘空间、网络流量等。数据库指标:连接数、查询数、写入数、读取数等。SQL指标:执行时间、执行计划、索引使用情况等。集群指标:节点状态、数…...
【定位】高德地图wifi定位接口使用效果实践
高德地图wifi定位接口使用效果实践 背景 目的是基于高德地图wifi定位接口实现在高德地图上展示终端设备的位置和轨迹。 原理 为了将原理阐述的稍微直白一点,特意使用UML图表产生下面的一个序列图: #mermaid-svg-iHgWizHiUSRqCWdF {font-family:"trebuchet ms",…...
Nacos注册中心
目录 认识和安装Nacos 启动方式 Nacos快速入门 提示 Nacos服务分级存储模型 服务跨集群调用问题 管理端设置策略 总结 Nacos环境隔离 如何创建 使用方式 编辑 总结 Nacos注册中心分析 临时实例和非临时实例 定义 配置方式 总结 认识和安装Nacos Nacos是Sp…...
Liunx常用命令总结
常用命令arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdparm -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/cpuinfo …...
MySQL表的增删查改(进阶)
所有操作:主要讲了数据库的约束,表之间的关系,新增,聚合查询,联合查询等内容。是一篇博客所有操作的记录。 844d186 风夏/mysql_learning - Gitee.com数据库约束1.1 约束条件not null -指定某个列不能储存null值。un…...
【RocksDB】Ubuntu20.04下编译rocksdb
前言: 我在刚学rocksdb的时候是在2022年,但是网上的资源很少,查了好久才把rocksdb安装成功,在这里向大家分享一下我的经历,安装过程中也报了很多错误,希望大家不要迷路 首先 在虚拟机里面安装依赖的包以…...
这可能是Spring Boot Starter 讲的最清楚的一次了
Spring Boot Starter 是 Spring Boot 中非常重要的一个功能,它可以帮助开发人员快速集成各种第三方库和框架。本文将从 Spring Boot Starter 的基本概念入手,深入讲解 Spring Boot Starter 的实现原理及其应用场景。 一、Spring Boot Starter 的概念 S…...
activiti7执行流程详解
什么是工作流? 官方定义:工作流是将一组任务组织起来以完成某个经营过程:定义了任务的触发顺序和触发条件,每个任务可以由一个或多个软件系统完成,也可以由一个或一组人完成,还可以由一个或多个人与软件系统…...
iframe页面传值取值
业务:目标界面的是用原生js写的 , 被镶嵌到vue平台上 , 现在要求vue点击跳转的时候 ,要附带上值 ,让原生界面获取到值 , 完成页面设置查询。 想法 : vue跳转,使用this.$route.qu…...
2023年2月安全事件盘点
一、基本信息 2023年2月安全事件共造成约3796万美元损失,相较于上个月,安全事件数量与损失金额都有显著上升,其中Platypus Finance闪电贷攻击为单次利用损失之最高达850万美元。本月RugPull数量基本与上月持平,损失金额占比显著降…...
2023上海国际电商物流包装产业展览会相约上海
2023年7月5-7日 | 上海新国际博览中心 同期举办:2023上海国际快递物流产业博览会 指导单位:上海市邮政管理局 中国快递协会 主办单位:上海市快递行业协会 上海市仓储与配送行业协会 上海市物流协会 承办单位:上海信世展览服务有…...
营业执照注册资本是什么意思
一、营业执照注册资本是什么意思 营业执照上的注册资本是指合营企业在登记管理机构登记的资本总额,是合营各方已经缴纳的或合营者承诺一定要缴纳的出资额的总和。我国法律、法规规定,合营企业成立之前必须在合营企业合同、章程中明确企业的注册资本&…...
GB28181协议--SIP协议介绍
1、SIP协议简介 SIP(Session Initiation Protocol,会话初始协议)是一个用于建立、更改和终止多媒体会话的应用层控制协议,其中的会话可以是IP电话、多媒体会话或多媒体会议(GB28181安防使用的是SIP协议)。S…...
Python3 入门教程||Python3 元组||Python3 字典
Python3 元组 Python 的元组(tuple,简写为tup)与列表类似,不同之处在于元组的元素不能修改。 元组使用小括号(),列表使用方括号[]。 元组创建很简单,只需要在括号中添加元素,并使用逗…...
做网站好处/今日最火的新闻
pandas DataFrame 数据转化为 列表 list的方法 大家好,我叫亓官劼(q guān ji ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客 本文原创为亓官劼&am…...
怎么制作网站下载软件/网站如何快速被百度收录
Cmake是一个跨平台的工具,在Mac平台下,生成Xcode工程文件如下方式: #!/bin/bash# 获取当前目录 CUR_DIR$(pwd) BUILD_DIR${CUR_DIR}/../build rm -fr ${BUILD_DIR} cmake -S ${CUR_DIR} -B ${BUILD_DIR} \-D CMAKE_BUILD_TYPEDebug \-G &quo…...
网站建设需要的语言/北京seo网络推广
一.什么是代码片段(code snippets) 代码片段:指用来存放程序执行代码的一块内存区域。 诸如很多开发工具基本都集成了这一功能,可以说你在coding的时候经常都在使用它,或许你不知道你在使用的正是snippet的…...
分析网站做的好坏/网络广告营销案例
建一个表 t_hoteladvertise 有如下字段:ID 自动增长(主要)SortID INT (主要)Title NVARCHAR(50) 代码: CREATE proc sp_ehotel_DownAdvertiseID INTasDECLARE SortID intDECLARE TempSortID INTDECLARE TempID INTBEGIN TRANSELECT SortIDSortID from t_hote…...
网站如何生成静态页面/软文案例大全
一:引言 数据驱动的编程方法可以根据不同的数据类型灵活的控制执行逻辑,但目前这种编程方法中并未引入调度技术,待执行的逻辑序列固定编码在执行程序中,虽然可以将数据与过程的对应关系抽取出来,单独放在数据库或者采…...