2024年Java最全SpringBoot学习笔记(七、Redis),美团java一面二面HR面面经

总结

我们总是喜欢瞻仰大厂的大神们,但实际上大神也不过凡人,与菜鸟程序员相比,也就多花了几分心思,如果你再不努力,差距也只会越来越大。

面试题多多少少对于你接下来所要做的事肯定有点帮助,但我更希望你能透过面试题去总结自己的不足,以提高自己核心技术竞争力。每一次面试经历都是对你技术的扫盲,面试后的复盘总结效果是极好的!

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

public KeyGenerator keyGenerator() {

return new KeyGenerator() {

@Override

public Object generate(Object target, Method method, Object… params) {

StringBuilder sb = new StringBuilder();

sb.append(target.getClass().getName());

sb.append(method.getName());

for (Object obj : params) {

sb.append(obj.toString());

}

return sb.toString();

}

};

}

}

3.3、测试

在单元测试中,注⼊ RedisTemplate。String 是最常⽤的⼀种数据类型,普通的 key/value 存储都可以归为此类,value 其实不仅是 String 也可以是数字。

@RunWith(SpringRunner.class)

@SpringBootTest

public class RedisTest {

@Autowired

private RedisTemplate redisTemplate;

@Test

public void testString() {

redisTemplate.opsForValue().set(“trytry”, “it’s time”);

Assert.assertEquals(“it’s time”, redisTemplate.opsForValue().get(“trytry”));

}

}

在这个单元测试中,我们使⽤ redisTemplate 存储了⼀个字符串 “it’s time”,存储之后获取进⾏验证,多次进⾏set 相同的 key,键对应的值会被覆盖。

综上所述,进行使⽤ spring-boot-starter-data-redis只需要上面的三步。

三、操作Redis各数据类型

================================================================================

Redis ⽀持多种数据类型,实体、哈希、列表、集合、有序集合,通过spring-boot-starter-data-redis都可以进行存储、读取、超时失效、删除操作。

1、实体


新建一个实体类:

public class User implements Serializable {

private String name;

private String description;

public User(String name, String description) {

this.name = name;

this.description = description;

}

}

将实体类放入缓存,再取出来:

@Test

public void testModel(){

User user=new User(“zhangtiedan”,“头铁”);

//获取一个操作对象

ValueOperations<String, User> operations=redisTemplate.opsForValue();

//将user存入缓存

operations.set(“tiedan”, user);

//取出缓存中的user

User u=operations.get(“tiedan”);

System.out.println("user: "+u.toString());

}

运行结果:

在这里插入图片描述

2、超时失效


Redis 在存⼊每⼀个数据的时候都可以设置⼀个超时时间,过了这个时间就会⾃动删除数据,这种特性⾮常适合我们对阶段数据的缓存。

新建⼀个 User 对象,存⼊ Redis 的同时设置 100 毫秒后失效,设置⼀个线程暂停 1000 毫秒之后,判断数据是否存在并打印结果。

@Test

public void testExpire() throws InterruptedException {

User user=new User(“gangdan”,“人狠话不多”);

ValueOperations<String, User> operations=redisTemplate.opsForValue();

//将user存⼊ Redis 的同时设置 100 毫秒后失效

operations.set(“expire”, user,100, TimeUnit.MILLISECONDS);

Thread.sleep(1000);

boolean exists=redisTemplate.hasKey(“expire”);

if(exists){

System.out.println(“exists is true”);

}else{

System.out.println(“exists is false”);

}

}

运行结果:

在这里插入图片描述

3、删除数据


删除数据也是必需的。

@Test

public void testDelete(){

User user=new User(“hage”,“不怂但是没什么用”);

ValueOperations<String, User> operations=redisTemplate.opsForValue();

//存入

redisTemplate.opsForValue().set(“deletekey”, user);

System.out.println(“存入–是否存在:”+redisTemplate.hasKey(“deletekey”));

//删除

redisTemplate.delete(“deletekey”);

System.out.println(“删除–是否存在:”+redisTemplate.hasKey(“deletekey”));

}

运行结果:

在这里插入图片描述

4、Hash(哈希)


Redis 存储⼀个 key会有⼀个最⼩内存,不管你存的这个键多⼩,都不会低于这个内存,因此合理的使⽤ Hash 可以帮我们节省很多内存。

在Redis中,哈希类型是指键值本身又是一个键值对 结构,形如value={{field1,value1},…{fieldN,valueN}}。

String和Hash的区别

在这里插入图片描述

Hash Set 就在哈希表 Key 中的域(Field)的值设为 value。如果 Key 不存在,⼀个新的哈希表被创建并进⾏ HSET 操作;如果域(field)已经存在于哈希表中,旧值将被覆盖。

@Test

public void testHash(){

HashOperations<String, Object, Object> hash = redisTemplate.opsForHash();

hash.put(“hash”,“you”,“you”);

String value=(String) hash.get(“hash”,“you”);

System.out.println(“hash value :”+value);

}

运行结果:

在这里插入图片描述

Hash set 的时候需要传⼊三个参数,第⼀个为 key,第⼆个为 field,第三个为存储的值。⼀般情况下 Key 代表⼀组数据,field 为 key 相关的属性,⽽ value 就是属性对应的值。

5、List


Redis List 的应⽤场景⾮常多,也是 Redis 最重要的数据结构之⼀。 使⽤ List 可以轻松的实现⼀个队列,List 典型的应⽤场景就是消息队列,可以利⽤ List 的 Push 操作,将任务存在 List 中,然后⼯作线程再⽤POP 操作将任务取出进⾏执⾏。

List push和pop示意图

在这里插入图片描述

@Test

public void testList() {

ListOperations<String, String> list = redisTemplate.opsForList();

list.leftPush(“list”,“you”);

list.leftPush(“list”,“go”);

list.leftPush(“list”,“home”);

String value=(String)list.leftPop(“list”);

System.out.println(“list value :”+value.toString());

}

运行结果:

在这里插入图片描述

上面的例子上⾯的例⼦从左侧插⼊⼀个 key 为 “list” 的队列,然后取出左侧最近的⼀条数据。List 有很多 API可以操作,⽐如从右侧进⾏插⼊队列从右侧进⾏读取,或者通过⽅法 range 读取队列的⼀部分。接着上⾯的例⼦使⽤ range 来读取。

子列表获取、删除等操作

在这里插入图片描述

List values=list.range(“list”,0,2);

for (String v:values){

System.out.println(“list range :”+v);

}

运行结果:

在这里插入图片描述

6、Set


集合(set)类型也是用来保存多个的字符串元素,但和列表类型不一 样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过 索引下标获取元素。

集合类型示意图

在这里插入图片描述

@Test

public void testSet() {

String key=“set”;

SetOperations<String, String> set = redisTemplate.opsForSet();

set.add(key,“kick”);

set.add(key,“you”);

set.add(key,“you”);

set.add(key,“now”);

Set values=set.members(key);

for (String v:values){

System.out.println(“set value :”+v);

}

}

运行结果:

在这里插入图片描述

Redis 为集合提供了求交集、并集、差集等操作,可以⾮常⽅便的使⽤。

  • difference

difference() 函数会把 key 1 中不同于 key 2 的数据对⽐出来

@Test

public void testDifference(){

SetOperations<String, String> set = redisTemplate.opsForSet();

String key1=“setMore1”;

String key2=“setMore2”;

set.add(key1,“it”);

set.add(key1,“you”);

set.add(key1,“you”);

set.add(key1,“know”);

set.add(key2,“xx”);

set.add(key2,“know”);

Set diffs=set.difference(key1,key2);

for (String v:diffs){

System.out.println(“diffs set value :”+v);

}

}

运行结果:

在这里插入图片描述

  • unions

unions 会取两个集合的合集。

@Test

最后

我还通过一些渠道整理了一些大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

新鲜出炉的蚂蚁金服面经,熬夜整理出来的答案,已有千人收藏

还有专门针对JVM、SPringBoot、SpringCloud、数据库、Linux、缓存、消息中间件、源码等相关面试题。

新鲜出炉的蚂蚁金服面经,熬夜整理出来的答案,已有千人收藏

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

运行结果:

在这里插入图片描述

  • unions

unions 会取两个集合的合集。

@Test

最后

我还通过一些渠道整理了一些大厂真实面试主要有:蚂蚁金服、拼多多、阿里云、百度、唯品会、携程、丰巢科技、乐信、软通动力、OPPO、银盛支付、中国平安等初,中级,高级Java面试题集合,附带超详细答案,希望能帮助到大家。

[外链图片转存中…(img-kRKgAXPv-1714871286209)]

还有专门针对JVM、SPringBoot、SpringCloud、数据库、Linux、缓存、消息中间件、源码等相关面试题。

[外链图片转存中…(img-MYZpnpZh-1714871286210)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

需要这份系统化的资料的朋友,可以点击这里获取

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值