第四阶段17-关于Redis中的list类型,缓存预热,关于Mybatis中的`#{}`和`${}`这2种格式的占位符

news2024/11/14 6:52:02

关于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 {

    @Override
    public 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 {

    @Autowired
    private 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"/>
    FROM
        ams_admin
    WHERE
        id=#{id}
</select>

以上占位符使用#{id}${id}最终的执行结果是完全相同的!

getLoginInfoByUsername()对应的查询:

<select id="getLoginInfoByUsername" resultMap="LoginInfoResultMap">
    SELECT
        <include refid="LoginInfoQueryFields"/>
    FROM
        ams_admin
    LEFT JOIN ams_admin_role ON ams_admin.id=ams_admin_role.admin_id
    LEFT JOIN ams_role_permission ON ams_admin_role.role_id=ams_role_permission.role_id
    LEFT JOIN ams_permission ON ams_role_permission.permission_id=ams_permission.id
    WHERE
        username=#{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语句中,所有值都应该使用一对单引号框住,否则,就会被当成字段名,但是,由于字段名不可能是纯数字,而布尔值的truefalse都是关键字,不可能被误认为字段名,所以,数值和布尔值可以不添加一对单引号!

在使用#{}格式的占位符时,无论是哪种类型的值,都不必考虑添加一对单引号的问题,是因为使用#{}格式的占位符时,SQL语句会被“预编译”的机制进行处理,而编译与执行的流程顺序是:词法分析、语义分析、编译、执行,在“预编译”的机制中,是会先编译,再将值代入到编译中执行!例如以下代码:

select * from user where username=?

在编译时,并不确定在where条件中username的值是多少,但是,即便不知道具体值,也不影响词法分析、语义分析!当经过编译后,以上语句中的?部分肯定只能是某个值,不可能是字段名,所以,在使用了“预编译”的机制中,传入的值不必考虑数据类型的问题,也就是说,即使传入字符串值,此值也不需要使用一对单引号框住。

基于以上特性,使用“预编译”的机制,也完全不存在“SQL注入”的风险!

在使用${}格式的占位符时,是先将值入代入到SQL语句中,再进行编译、执行,所以,非数值、非布尔值必须添加一对单引号,同时,存在SQL注入的风险!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/382575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux04-冯诺依曼体系结构||操作系统||进程概念

1.认识冯诺依曼系统 1.1冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体系。 截至目前&#xff0c;我们所认识的计算机&#xff0c;都是有一个个的硬件组件组成 输入单元&#xff1a;包括…

Linux: 中断只被GIC转发到CPU0问题分析

文章目录1. 前言2. 分析背景3. 问题4. 分析4.1 ARM GIC 中断芯片简介4.1.1 中断类型和分布4.1.2 拓扑结构4.2 问题根因4.2.1 设置GIC SPI 中断CPU亲和性4.2.2 GIC初始化&#xff1a;缺省的CPU亲和性4.2.2.1 boot CPU亲和性初始化流程4.2.2.1 其它非 boot CPU亲和性初始化流程5.…

【蓝桥杯入门不入土】变幻莫测的链表

文章目录一&#xff1a;链表的类型单链表双链表循环链表二&#xff1a;链表的存储方式三&#xff1a;链表的定义删除节点添加节点四&#xff1a;实战练习1.设计链表2. 移除链表元素最后说一句一&#xff1a;链表的类型 单链表 什么是链表&#xff0c;链表是一种通过指针串联在…

最经典的黑客技术入门知识大全

第一节、什么是黑客 以我的理解&#xff0c;“黑客”大体上应该分为“正”、“邪”两类&#xff0c;正派黑客依靠自己掌握的知识帮助系统管理员找出系统中的漏洞并加以完善&#xff0c;而邪派黑客则是通过各种黑客技能对系统进行攻击、入侵或者做其他一些有害于网络的事情&…

LCR数字电桥软件下载安装教程

软件&#xff1a;LCR数字电桥软件NS-LCR 语言&#xff1a;简体中文 环境&#xff1a;NI-VISA 安装环境&#xff1a;Win10以上版本&#xff08;特殊需求请后台私信联系客服&#xff09; 硬件要求&#xff1a;CPU2GHz 内存4G(或更高&#xff09;硬盘500G(或更高&#xff09; …

ProcDump+Mimikatz绕过杀毒软件抓密码

抓密码的奇淫技巧背景1、原理2、实操演示背景 如果主机上装了杀毒软件&#xff0c;开了防火墙&#xff0c;例如&#xff1a;360、火绒之类的话。Mimikatz就会被检测为病毒&#xff0c;无法使用&#xff0c;而想要对Mimikatz进行二次开发或者免杀难度会比较大&#xff0c;那有办…

边缘计算开源项目解读——kubeedge mappers实现

0 背景 本文重点解读kubeedge项目中的mapper模块。该模块位于kubeedge的edgecore的南向边缘侧&#xff0c;主要对接入kubeedge的终端设备&#xff0c;进行协议的适配和转换&#xff0c;使其可以和边缘设备通信&#xff0c;转换后的协议是我们前面描述的mqtt协议&#xff0c;当然…

玩转ThreadLocal

前言 ThreadLocal想必都不陌生&#xff0c;当多线程访问同一个共享变量时&#xff0c;就容易出现并发问题&#xff0c;为了保证线程安全&#xff0c;我们需要对共享变量进行同步加锁&#xff0c;但这又带来了性能消耗以及使用者的负担&#xff0c;那么有没有可能当我们创建一个…

只知道删除单张表的数据?不知道删除多张表的数据?

一些废话 可能在某某一天&#xff0c;你在表删除表数据的时候&#xff0c;不想一张表一张表的去删除&#xff0c;想把两个表的数据同时删除&#xff1b;然后你就会去搜索&#xff0c;然后你就很有很有很有很有可能会看到 me 的这篇优质&#xff08;呸&#xff01;&#xff01;…

HOT100--(5)最长回文子串

点击查看题目详情 中心扩散法 思路&#xff1a; 遍历字符串&#xff0c;以每个字符为中心点向两边扩散&#xff0c;如果遇到不一样的就跳出循环。以此类推&#xff0c;最后截取最大回文串返回。 细节 字符个数不一定都是奇数。当个数是偶数的是时候&#xff0c;我们可以“忽…

学习红客技术必备,手把手教你成为“安防第一人”

互联网时代已悄悄来临&#xff0c;作为新时代的人们&#xff0c;我们日常生活、工作、学习方面都需要借助互联网来完成&#xff0c;这样&#xff0c;又产生一种新的问题&#xff0c;那就是网络安全的问题&#xff0c;有时我们拼命加班好不容易完成的东西&#xff0c;在一夜之间…

优化Linux系统性能的必杀技:调整进程优先级!学会使用nice命令,让你的系统飞一般的顺畅!

文章目录前言一. nice命令介绍1.1 nice的介绍1.2 cpu资源的调度1.3 nice是控制内核吗&#xff1f;二. 语法格式及常用选项三. 参考案例3.1 将ls命令的优先级调整为最高3.2 将 find 命令的优先级调整为最低3.3 如何查看nice值四. nice和renice的区别总结前言 大家好&#xff0c…

Zookeeper的安装

目录 Zookeeper的安装 1、环境准备 2、上传 3、解压文件到opt/zookeeper目下 4、安装完后进入zookeeper&#xff0c;找到conf目录 5、复制zoo_sample.cfg 6、编辑zoo.cfg 7、复制一份会话&#xff0c;进入zookeeper安装目录&#xff0c;创建一个文件夹zkdata&#xff0…

Linux·DMA 与零拷贝技术

DMA 与零拷贝技术注意事项&#xff1a;除了 Direct I/O&#xff0c;与磁盘相关的文件读写操作都有使用到 page cache 技术。1. 数据的四次拷贝与四次上下文切换很多应用程序在面临客户端请求时&#xff0c;可以等价为进行如下的系统调用&#xff1a;File.read(file, buf, len);…

NOC2021年测试卷3

1. 角色初始位置坐标是(0,0),执行下面程序后,角色会出现在什么位置上?( ) A. x坐标为10,y坐标为50B. x坐标为40,y坐标为50C. x坐标为50,y坐标为40D. x坐标为30,y坐标为502. 执行下面程序后,按一次→键,兔子会?() A. 向右移动10步B. 向左移动10步C. 向上移动…

入职外包三个月,我提桶跑路了

有一种打工人的羡慕&#xff0c;叫做“大厂”。 真是年少不知大厂香&#xff0c;错把青春插稻秧。 但是&#xff0c;在深圳有一群比大厂员工更庞大的群体&#xff0c;他们顶着大厂的“名”&#xff0c;做着大厂的工作&#xff0c;还可以享受大厂的伙食&#xff0c;却没有大厂…

基于龙芯+国产FPGA 的VPX以太网交换板设计(一)

“棱镜门”的曝光&#xff0c;暴露出我国的信息安全存在极大的安全隐患&#xff0c;作为信息传输 载体的网络设备&#xff0c;其国产化需求迫切&#xff0c;国产处理器、国产可编程逻辑器件、以太网交 换芯片等具有良好的应用前景&#xff0c;另一方面&#xff0c;宽带数据业务…

Java 对象深拷贝

需求 写一个java对象深拷贝工具&#xff0c;用以对象深拷贝。 分析 在 Java 中&#xff0c;变量间值的传递分为两种。对于 int,char,string,等基本数据类型进行值传递时&#xff0c;使用值传递。即原变量 a 的值与新变量 b 的值相等&#xff0c;且 a 与 b 拥有不同的内存地址…

HTML认知

HTML认知 文章目录HTML认知语法规范注释标签组成和关系标签的关系标签学习排版系列标签**标题标签****段落标签**换行标签水平线标签文本格式化标签媒体标签图片标签src 目标图片的路径alt 替换文本title 图片的标题width 宽度 / height 高度路径绝对路径相对路径&#xff08;常…

win10搭建android monkeyrunner自动化测试环境

本文记录一下monkeyrunner环境搭建遇到的各种坑&#xff0c;以免以后再次踩坑。首先要提一下巨坑&#xff0c;务必要安装java 8&#xff08;本文记录于2023.3&#xff09;&#xff0c;安装其他版本java&#xff0c;运行monneyrunner会有很多问题&#xff0c;见第七节。 一、安…