Spring Boot + Redis 实现各种操作,写得太好了吧!,大牛手把手带你

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 轻便的丰富的锁机制的实现

  • Lock

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

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

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

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

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

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
img

最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

《Java高级面试》

《Java高级架构知识》

《算法知识》

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

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

如果你觉得这些内容对你有帮助,可以添加V获取:vip1024b (备注Java)
[外链图片转存中…(img-wtSVuMeu-1712182317040)]

最后

分享一些资料给大家,我觉得这些都是很有用的东西,大家也可以跟着来学习,查漏补缺。

《Java高级面试》

[外链图片转存中…(img-avcSIVgm-1712182317040)]

《Java高级架构知识》

[外链图片转存中…(img-7tHC6DoX-1712182317040)]

《算法知识》

[外链图片转存中…(img-6cSjUhZS-1712182317041)]

一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!

AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算

  • 8
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值