Spring Boot 操作 Redis 的各种实现

2.2、使用示例

@Resource

private StringRedisTemplate stringRedisTemplate;

@Override

public CustomersEntity findById(Integer id) {

// 需要缓存

// 所有涉及的缓存都需要删除,或者更新

try {

String toString = stringRedisTemplate.opsForHash().get(REDIS_CUSTOMERS_ONE, id + “”).toString();

if (toString != null) {

return JSONUtil.toBean(toString, CustomersEntity.class);

}

} catch (Exception e) {

e.printStackTrace();

}

// 缓存为空的时候,先查,然后缓存redis

Optional byId = customerRepo.findById(id);

if (byId.isPresent()) {

CustomersEntity customersEntity = byId.get();

try {

stringRedisTemplate.opsForHash().put(REDIS_CUSTOMERS_ONE, id + “”, JSONUtil.toJsonStr(customersEntity));

} catch (Exception e) {

e.printStackTrace();

}

return customersEntity;

}

return null;

}

2.3、扩展

2.3.1、spring-boot-starter-data-redis的依赖包

3.3.2、stringRedisTemplate API(部分展示)

  • opsForHash --> hash操作

  • opsForList --> list操作

  • opsForSet --> set操作

  • opsForValue --> string操作

  • opsForZSet --> Zset操作

3.3.3 StringRedisTemplate默认序列化机制

public class StringRedisTemplate extends RedisTemplate<String, String> {

/**

* Constructs a new StringRedisTemplate instance. {@link #setConnectionFactory(RedisConnectionFactory)}

* and {@link #afterPropertiesSet()} still need to be called.

*/

public StringRedisTemplate() {

RedisSerializer stringSerializer = new StringRedisSerializer();

setKeySerializer(stringSerializer);

setValueSerializer(stringSerializer);

setHashKeySerializer(stringSerializer);

setHashValueSerializer(stringSerializer);

}

}

三、RedissonClient 操作示例


3.1 基本配置

3.1.1、Maven pom 引入

org.springframework.boot

spring-boot-starter-data-redis

org.redisson

redisson

3.8.2

true

org.redisson

redisson-spring-boot-starter

LATEST

3.1.2、添加配置文件Yaml或者json格式

redisson-config.yml

# Redisson 配置

singleServerConfig:

address: “redis://192.168.1.140:6379”

password: null

clientName: null

database: 15 #选择使用哪个数据库0~15

idleConnectionTimeout: 10000

pingTimeout: 1000

connectTimeout: 10000

timeout: 3000

retryAttempts: 3

retryInterval: 1500

reconnectionTimeout: 3000

failedAttempts: 3

subscriptionsPerConnection: 5

subscriptionConnectionMinimumIdleSize: 1

subscriptionConnectionPoolSize: 50

connectionMinimumIdleSize: 32

connectionPoolSize: 64

dnsMonitoringInterval: 5000

#dnsMonitoring: false

threads: 0

nettyThreads: 0

codec:

class: “org.redisson.codec.JsonJacksonCodec”

transportMode: “NIO”

或者,配置 redisson-config.json

{

“singleServerConfig”: {

“idleConnectionTimeout”: 10000,

“pingTimeout”: 1000,

“connectTimeout”: 10000,

“timeout”: 3000,

“retryAttempts”: 3,

“retryInterval”: 1500,

“reconnectionTimeout”: 3000,

“failedAttempts”: 3,

“password”: null,

“subscriptionsPerConnection”: 5,

“clientName”: null,

“address”: “redis://192.168.1.140:6379”,

“subscriptionConnectionMinimumIdleSize”: 1,

“subscriptionConnectionPoolSize”: 50,

“connectionMinimumIdleSize”: 10,

“connectionPoolSize”: 64,

“database”: 0,

“dnsMonitoring”: false,

“dnsMonitoringInterval”: 5000

},

“threads”: 0,

“nettyThreads”: 0,

“codec”: null,

“useLinuxNativeEpoll”: false

}

3.1.3、读取配置

新建读取配置类

@Configuration

public class RedissonConfig {

@Bean

public RedissonClient redisson() throws IOException {

// 两种读取方式,Config.fromYAML 和 Config.fromJSON

//        Config config = Config.fromJSON(RedissonConfig.class.getClassLoader().getResource(“redisson-config.json”));

Config config = Config.fromYAML(RedissonConfig.class.getClassLoader().getResource(“redisson-config.yml”));

return Redisson.create(config);

}

}

或者,在 application.yml中配置如下

spring:

redis:

redisson:

config: classpath:redisson-config.yaml

3.2 使用示例

@RestController

@RequestMapping(“/”)

public class TeController {

@Autowired

private RedissonClient redissonClient;

static long i = 20;

static long sum = 300;

//    ========================== String =======================

@GetMapping(“/set/{key}”)

public String s1(@PathVariable String key) {

// 设置字符串

RBucket keyObj = redissonClient.getBucket(key);

keyObj.set(key + “1-v1”);

return key;

}

@GetMapping(“/get/{key}”)

public String g1(@PathVariable String key) {

// 设置字符串

RBucket keyObj = redissonClient.getBucket(key);

String s = keyObj.get();

return s;

}

//    ========================== hash =======================-=

@GetMapping(“/hset/{key}”)

public String h1(@PathVariable String key) {

Ur ur = new Ur();

ur.setId(MathUtil.randomLong(1,20));

ur.setName(key);

// 存放 Hash

RMap<String, Ur> ss = redissonClient.getMap(“UR”);

ss.put(ur.getId().toString(), ur);

return ur.toString();

}

@GetMapping(“/hget/{id}”)

public String h2(@PathVariable String id) {

// hash 查询

RMap<String, Ur> ss = redissonClient.getMap(“UR”);

Ur ur = ss.get(id);

return ur.toString();

}

// 查询所有的 keys

@GetMapping(“/all”)

public String all(){

RKeys keys = redissonClient.getKeys();

Iterable keys1 = keys.getKeys();

keys1.forEach(System.out::println);

return keys.toString();

}

// ================== ==============读写锁测试 =============================

@GetMapping(“/rw/set/{key}”)

public void rw_set(){

//        RedissonLock.

RBucket ls_count = redissonClient.getBucket(“LS_COUNT”);

ls_count.set(“300”,360000000l, TimeUnit.SECONDS);

}

// 减法运算

@GetMapping(“/jf”)

public void jf(){

String key = “S_COUNT”;

//        RAtomicLong atomicLong = redissonClient.getAtomicLong(key);

//        atomicLong.set(sum);

//        long l = atomicLong.decrementAndGet();

//        System.out.println(l);

RAtomicLong atomicLong = redissonClient.getAtomicLong(key);

if (!atomicLong.isExists()) {

atomicLong.set(300l);

}

while (i == 0) {

if (atomicLong.get() > 0) {

long l = atomicLong.getAndDecrement();

try {

Thread.sleep(1000l);

} catch (InterruptedException e) {

e.printStackTrace();

}

i --;

System.out.println(Thread.currentThread().getName() + “->” + i + “->” + l);

}

}

}

@GetMapping(“/rw/get”)

public String rw_get(){

String key = “S_COUNT”;

Runnable r = new Runnable() {

@Override

public void run() {

RAtomicLong atomicLong = redissonClient.getAtomicLong(key);

if (!atomicLong.isExists()) {

atomicLong.set(300l);

}

if (atomicLong.get() > 0) {

long l = atomicLong.getAndDecrement();

i --;

System.out.println(Thread.currentThread().getName() + “->” + i + “->” + l);

}

}

};

while (i != 0) {

new Thread®.start();

//            new Thread®.run();

//            new Thread®.run();

//            new Thread®.run();

//            new Thread®.run();

}

RBucket bucket = redissonClient.getBucket(key);

String s = bucket.get();

System.out.println(“线程已结束================” + s);

return s;

}

}

4.3 扩展

4.3.1 丰富的jar支持,尤其是对 Netty NIO框架

4.3.2 丰富的配置机制选择,这里是详细的配置说明

https://github.com/redisson/redisson/wiki/2.-Configuration

关于序列化机制中,就有很多

4.3.3 API支持(部分展示),具体的 Redis --> RedissonClient ,可查看这里

https://github.com/redisson/redisson/wiki/11.-Redis-commands-mapping

4.3.4 轻便的丰富的锁机制的实现

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

总结

一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。

这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。

最后再说几句关于招聘平台的,总之,简历投递给公司之前,请确认下这家公司到底咋样,先去百度了解下,别被坑了,每个平台都有一些居心不良的广告党等着你上钩,千万别上当!!!

Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
在这里插入图片描述

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!
ttps://img-community.csdnimg.cn/images/e5c14a7895254671a72faed303032d36.jpg" alt=“img” style=“zoom: 33%;” />

总结

一般像这样的大企业都有好几轮面试,所以自己一定要花点时间去收集整理一下公司的背景,公司的企业文化,俗话说「知己知彼百战不殆」,不要盲目的去面试,还有很多人关心怎么去跟HR谈薪资。

这边给大家一个建议,如果你的理想薪资是30K,你完全可以跟HR谈33~35K,而不是一下子就把自己的底牌暴露了出来,不过肯定不能说的这么直接,比如原来你的公司是25K,你可以跟HR讲原来的薪资是多少,你们这边能给到我的是多少?你说我这边希望可以有一个20%涨薪。

最后再说几句关于招聘平台的,总之,简历投递给公司之前,请确认下这家公司到底咋样,先去百度了解下,别被坑了,每个平台都有一些居心不良的广告党等着你上钩,千万别上当!!!

Java架构学习资料,学习技术内容包含有:Spring,Dubbo,MyBatis, RPC, 源码分析,高并发、高性能、分布式,性能优化,微服务 高级架构开发等等。

还有Java核心知识点+全套架构师学习资料和视频+一线大厂面试宝典+面试简历模板可以领取+阿里美团网易腾讯小米爱奇艺快手哔哩哔哩面试题+Spring源码合集+Java架构实战电子书。
[外链图片转存中…(img-Whdx55fl-1712070156537)]

《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值