4.15学习(相向双指针,缓存预热,定时任务)
对给定的字符串,本题要求你输出最长对称子串的长度。例如,给定Is PAT&TAP symmetric?,最长对称子串为s PAT&TAP s,于是你应该输出11。
输入格式:
输入在一行中给出长度不超过1000的非空字符串。
输出格式:
在一行中输出最长对称子串的长度。
输入样例:
Is PAT&TAP symmetric?
输出样例:
11
思路:使用相向双指针,定义一个K从前往后遍历,i=k
i从前往后移动
j从后往前移动,
如果s[i]s[j],那么从i到j可能是一个对称子串,我们让i++,j--不断匹配直到ij(该字串字符数为奇数)或者i>j(该字串字符数为偶数)。
如果s[i]!=s[j]则继续移动j直到i==j,说明没有找到与s[i]相等的后缀。我们让k++,重复上面的操作。
点击查看代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
int i,j;
int maxLength = 0;
for(int k=0;k<s.length();k++) {
i=k;
for(j=s.length()-1;j>=0;j--) {
int length=0;
while(i<j&&s.charAt(i)==s.charAt(j)) {
i++;
j--;
length+=2;
}
if(i==j){//该子串为奇数个
length+=1;
maxLength=Math.max(maxLength,length);
} else if (i>j) {//该子串为偶数个
maxLength=Math.max(maxLength,length);
}
}
}
System.out.println(maxLength);
}
}
Jedis独立于spring操作redis的客户端
redisson:分布式操作redis的java客户端,可以像使用集合一样操作redis
lettuce:高阶操作redis的java客户端 异步,连接池
连接池的概念

Redis存储的数据结构(面试考,5种)
String字符串 name:"wcy"
List集合 name:["wcy","cjj","cyx","wcy"]
Set name:["wcy","cjj"]
Zset name:{wcy-1,cjj-2} 在添加进来的元素后面加一个分数
Hash nameAge:{"wcy":1,"cjj":2}
设计主页缓存
设计缓存的key: systemId.moduleId.funcId.userId
key: systemId:moduleId:funcId:userId
中间的分隔符不要和systemId、moduleId、funcId、userId中的值冲突,比如systemId为partner:backend
所以设计为partner:user:recommend:userId
使用数据库查询时间大概为170ms,使用缓存后为17ms,速度提高了10倍
记得设置过期时间,如果不设置当redis内存满了,就会执行自己的淘汰策略
缓存预热
第一个用户访问的时候是查询数据库,访问速度很慢
优点:解决用户首次访问速度很忙
缺点:需要进行设计,增加开发成本
预热的时机需要确定,否则可能导致拿到的数据不对或者太老
需要占用空间,比如redis有4g,上线的时候平均使用3g,但是如果预热的时候需要2g,2+3>4,直接超出内存了。
怎么缓存预热
1.定时触发
2.模拟触发(手动触发)
实现:
用定时任务,每天刷新所有用户的推荐列表
注意点:
缓存预热的意义:
1.主页是用来展示用户的,新增的用户很少,但是用户数量多,即使隔一天展示新用户影响也不会很大。
2.预热占用的空间不能太大
3.预热的周期:每天一次
定时任务
1.spring sheduler(springboot整合)
2.Quartz(独立于spring存在的定时任务框架)
3.XXL-JOB分布式任务调度平台(界面+sdk)

浙公网安备 33010602011771号