分布式缓存redis,看这一篇就够了

Redisson快速入门,工厂模式结合AOP、SPEL动态切换锁类型与锁失败策略。 前面说到为了解决分布式环境下锁失效问题,我们最常用的一个第三方开源框架就是Redisson。 阅读详情

redis是什么?

简单来说redis是一个开源的使用ANSI C语言编写的内存数据库,使用key-value的数据结构。支持数据持久化到硬盘,支持多种api语言的连接。通常当做缓存处理。

安装redis

  1. redis官网:https://redis.io 英语好的看官网,下载linux版本redis
  2. redis for windows: https://github.com/MicrosoftArchive/redis/releases ,windows版下载到本地直接安装即可使用。

windows版本下载安装完成之后,在services.msc里面能看到redis服务。

springboot集成redis

我们使用redisson框架集成,新建工程,pom中添加如下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>
<!-- https://mvnrepository.com/artifact/org.redisson/redisson -->
<dependency>
    <groupId>org.redisson</groupId>
    <artifactId>redisson</artifactId>
    <version>3.15.0</version>
</dependency>

修改application.yml文件,添加redis的配置

spring:
  redisson:
    address: redis://127.0.0.1:6379 #redis的地址和端口,默认端口是6379
    password: #默认没有买卖
    database: 0 #Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0
    timeout: 10000 #连接超时时间(毫秒)

添加配置类,映射yml文件中的属性

@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "spring.redisson")//获取yml文件中以spring.redisson开头的所有数据
public class RedissonProperties {
    //映射yml文件里面的数据
    private String address;
    private String password = null;
    private int database = 0;
    private int timeout = 3000;
}

增加RedissonClient初始化类:

@Configuration
@ConditionalOnClass(RedissonClient.class)//存在RedissonClient才创建该类
@ConditionalOnProperty({"spring.redisson.address"})//存在spring.redisson.address配置才创建该类
public class RedissonConfig {

    @Resource
    private RedissonProperties properties;

    @Bean(destroyMethod = "shutdown")
    RedissonClient redissonClient(RedissonProperties properties) throws Exception {
        Config config = new Config();
        SingleServerConfig singleServerConfig = config.useSingleServer();
        singleServerConfig
                .setAddress(properties.getAddress())
                .setDatabase(properties.getDatabase())
                .setTimeout(properties.getTimeout());
        //密码不为空才设置,否则默认yml注入的空串会导致创建redisson不成功
        if(!StringUtils.isEmpty(properties.getPassword())){
            singleServerConfig.setPassword(properties.getPassword());
        }

        return Redisson.create(config);
    }
}

好了,自此,准备工作都做好了,下面就可以编码操作redis的数据了。

@RestController
@RequestMapping("demo")
public class DemoController {
    @Resource
    private RedissonClient redissonClient;

    public static String MAP_KEY = "MAP";
    public static String SET_KEY = "SET";
    public static String LIST_KEY = "LIST";

    @GetMapping("put")
    public String put(){
        RMap<String, String> map = redissonClient.getMap(MAP_KEY);
        map.put("a","hello redis");
        return "ok";
    }

    @GetMapping("get")
    public String get(){
        RMap<String, String> map = redissonClient.getMap(MAP_KEY);
        return map.get("a");
    }
}

先用postman请求http://localhost:8080/demo/put 将数据放进去,然后找一个redis的ide工具(本文用的是redis studio)查看redis中的数据

数据是放进去了,而且使用http://localhost:8080/demo/get 也能将数据拿出来,不过用redis的ide工具怎么那么不形象呢,不好看。。。那是因为你在使用redissonClient的时候没有指定序列化方式。修改代码如下:

RMap<String, String> map = redissonClient.getMap(MAP_KEY, JsonJacksonCodec.INSTANCE);

再试下看看redis studio怎么显示的:

怎么样,清晰了吧。那RMap只能放基本数据对象吗》能不能放自定义对象?建一个dto:

@Data
public class UserDto implements Serializable {
    private String username;
    private Integer age;
    private Date birthday;
    private List<String> fav;
}

新增rest方法:

@GetMapping("put2")
public String put2(){
    RMap<String, UserDto> map = redissonClient.getMap(MAP_KEY, JsonJacksonCodec.INSTANCE);
    UserDto userDto = new UserDto();
    userDto.setUsername("张三6");
    userDto.setAge(18);
    userDto.setBirthday(new Date());
    userDto.setFav(Arrays.asList("apple","pear"));
    map.put("userDto",userDto);
    return "ok";
}

@GetMapping("get2")
public UserDto get2() throws InterruptedException {
    RMap<String, UserDto> map = redissonClient.getMap(MAP_KEY, JsonJacksonCodec.INSTANCE);
    UserDto userDto = map.get("userDto");
    return userDto;
}

按套路出牌,自己postman请求,然后看redis studio的数据:

怎么样,舒服了吧,对象都被你存进去了,而且还能从redis里面拿出来自己转换成UserDto对象!!!

好了,以上是RMap对象,下面的list和set我就不细解说了,直接上代码。

@GetMapping("put3")
public String put3(){
    RSet<Long> set = redissonClient.getSet(SET_KEY, JsonJacksonCodec.INSTANCE);
    set.add(System.currentTimeMillis());
    return "ok";
}

@GetMapping("get3")
public String get3() throws InterruptedException {
    RSet<Long> set = redissonClient.getSet(SET_KEY, JsonJacksonCodec.INSTANCE);
    Iterator<Long> iterator = set.iterator();
    String result = "";
    while (iterator.hasNext()){
        result +=","+iterator.next();
    }
    return result;
}

@GetMapping("put4")
public String put4(){
    RList<Long> list = redissonClient.getList(LIST_KEY, JsonJacksonCodec.INSTANCE);
    list.add(1L);
    return "ok";
}

@GetMapping("get4")
public String get4() throws InterruptedException {
    RList<Long> list = redissonClient.getList(LIST_KEY, JsonJacksonCodec.INSTANCE);
    String result="";
    for (Long aLong : list) {
        result+=aLong;
    }
    return result;
}

每次都要写JsonJacksonCodec.INSTANCE这个玩意很烦,算了,默认了吧。默认使用JsonJacksonCodec.INSTANCE序列化。那我们修改下config好了。

@Bean(destroyMethod = "shutdown")
RedissonClient redissonClient(RedissonProperties properties) throws Exception {
    Config config = new Config();
    SingleServerConfig singleServerConfig = config.useSingleServer();
    singleServerConfig
            .setAddress(properties.getAddress())
            .setDatabase(properties.getDatabase())
            .setTimeout(properties.getTimeout());
    //密码不为空才设置,否则默认yml注入的空串会导致创建redisson不成功
    if(!StringUtils.isEmpty(properties.getPassword())){
        singleServerConfig.setPassword(properties.getPassword());
    }
    //指定默认序列化
    Codec codec=(Codec) ClassUtils.forName("org.redisson.codec.JsonJacksonCodec", ClassUtils.getDefaultClassLoader()).newInstance();
    config.setCodec(codec);
    return Redisson.create(config);
}

下面来一个不指定序列化的调用redis试试:


@GetMapping("test")
public String test(){
    RMap<String, UserDto> map = redissonClient.getMap("MAP_KEY");
    UserDto userDto = new UserDto();
    userDto.setUsername("张三6d");
    userDto.setAge(18);
    userDto.setBirthday(new Date());
    userDto.setFav(Arrays.asList("apple","pear"));
    map.put("userDto",userDto);
    return "ok";
}

还乱码吗?不乱码了吧。

redis的用处远不至于此,还可以设置缓存的数据有效期,多长时间内有效,并且可以监听创建、修改、销毁数据事件,另外还有队列、发布订阅等等待大伙探索。

总结一句,redis当缓存很好用,但是持久化数据库就算了,他天生不是干那个的!

更多java原创阅读:https://javawu.com

【redis高级-分布式缓存-一篇就够】 本文介绍了Redis的两种持久化方案RDB和AOF,以及主从架构。RDB通过快照机制定期保存数据,恢复效率高但可能丢失数据;AOF记录所有写命令,数据更安全但文件较大。两者可以结合使用提高数据可靠性。此外,单机Redis存在性能瓶颈和数据丢失风险,通过搭建主从集群可以实现读写分离和数据备份,提升Redis的可用性和扩展性。文章详细讲解了RDB和AOF的执行时机、配置参数及实现原理,并对比了两种方案的优缺点,为Redis在生产环境中的部署提供了技术指导。 阅读详情

相关推荐

基于redis分布式缓存实现

简单说明下,写此文章算是对自己近一段工作的总结,希望能对你有点帮助,同时也是自己的一点小积累。 一.为什么选择redis 在项目中使用redis做为缓存,还没有使用memcache,考虑因素主要有两点: 1.redis丰富的数据结构,其hash,list,set以及功能丰富的String的支持,对于实际项目中的使用有很大的帮忙。(可参考官网redis.io) 2.redis单点

haier_jiang的专栏 4万+

Redisson锁功能、使用场景、注意事项

举例:方法a加锁用的是trylock,即可能加锁失败,方法b的业务也就可能失败,但如果方法c的业务一定要成功,那方法c就可以提前加锁用 lock方法,再调用方法a时加锁肯定成功,这样保证了方法c和a一定能成功。3.谨慎使用leaseTime参数,设置后watchdog不生效,到了leaseTime后、即使业务没执行结束,锁也会释放,如果此时其他线程加锁,可能造成线程不安全。举例场景:封装了方法a,其中加锁了,方法b通过调用a完成业务,方法c也调用a,但方法c在调用a前已经加锁。如果为0,则是不等待。

u014203449的博客 3791

利用MyBatis自身本地缓存结合Redis实现分布式缓存

一、Redis分布式缓存的实现 1、什么是缓存? 计算机内存中的一段数据。 2、内存中数据特点 读写快 断电立即丢失 3、缓存解决了什么问题? 提高网站吞吐量(请求响应)提高, 网站运行效率快 缓存的存在是用来解决数据库访问压力 4、既然缓存能提高效率, 所有项目中都加缓存吗? 使用缓存时一定是数据库中数据极少发生修改, 更多用于查询情况, 比如地址, 省, 市, 等 5、本地缓存和分布式缓存的区别? 本地缓存 : 存在应用服务器内存中数据称之为本地缓存(Local Cache) 分布式缓

Guizy 3460

如何使用自定义注解实现redisson分布式锁

自定义分布式锁注解

PassionAnytime的博客 586

Redis实战之 分布式缓存

基于解决单机Redis存在的问题。

2302_80742310的博客 1172

分布式数据之缓存技术,看这一篇就够了

不知不觉,分布式数据存储这一站已经到了最后一讲。在前面几讲,我与你分享了 CAP 理论(想要设计一个好的分布式系统,必须搞定这个理论)、(分布式存储系统三要素,掌握这些就离成功不远了)、数据分布式分片方法和数据复制技术(分布式数据复制技术,今天就教你真正分身术),其中数据分片方法和数据复制技术均是导购中的关键技术。 在这一讲,我将为你讲解分布式存储中“货架”的关键技术——缓存技术。 在计算机领...

csdn681的博客 2598

JSON二次序列化问题分析

json"text": "人为干预, 降低生产成本...",text"{"id":"d471c19c-70eb-4f29-8604-b8284e8a9400","text":"人为干预..."}"

2301_76541209的博客 466

springboot整合redis、mybatis以及redis和mybatis的联合使用

springboot集成redis、mybatis 1、集成redis 2、集成mybatis 3、自定义redis KEY生成器/CacheManager来管理redis缓存 4、分布式redis-session共享 5、springboot实现初始化加载配置(实现缓存预热)的两种方式 6、二级缓存联合使用 方式一:redis原生方法工具类(RedisService)+redis+mybatis 方式二:CacheManager+redis+mybatis

初始分布式系统和Redis特点(

Redis是一个开源(BSD许可),内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持等数据类型。内置复制、、LRU收回、以及不同级别磁盘持久化功能,同时通过Redis Sentinel提供高可用,通过Redis Cluster提供自动。起初redis是用来作为一个“消息队列”的,简单理解就是在分布式系统下的生产者消费者模型,但是随着计算机的发展,我们很少会直接使用redis作为消息队列,反而用redis来做一些其他的事情,比如数据库。

huapiaoy的博客 1292

人形机器人骨骼材料选型实战:从铝合金到碳纤维的5种方案对比

本文深入探讨人形机器人骨骼材料的选型策略,对比铝合金、镁合金、钛合金、碳纤维复合材料及3D打印材料等5种方案的性能优劣。通过建立强度-重量比、疲劳寿命等核心评价维度,结合具体应用场景,提供科学的材料决策方法论,助力开发者优化机器人结构设计,实现性能与成本的平衡。

weixin_29199873的博客 441

PL端:HDMI 输出实验

开发板没有HDMI编码芯片,是将FPGA的3.3差分IO直接连接到HDMI连接器,FPGA 完成 24 位 RGB 编码输出TMDS 差分信号。1、学会使用第三点IP核,首先是添加,后面的使用和自带IP核操作一致。2、主要还是在梳理vivado使用流程。

qq_43441284的博客 4287

【分布式】Redis分布式缓存

本文介绍了什么是Redis分布式缓存,它的特点,多种实现方式区别,主从复制模式详解,cluster模式详解,具体使用等

qq_44845473的博客 3088

告别社区5级:一个脚本搞定小米/红米BL解锁的账号绑定限制(附资源下载与避坑指南)

本文提供了一种绕过小米/红米设备Bootloader解锁社区等级限制的技术方案,适用于MIUI 12.5-14和HyperOS 1.0系统。通过自动化脚本临时修改系统组件,用户可快速完成账号绑定和设备解锁流程,附详细操作指南和常见问题解决方案。

weixin_27330481的博客 734

一篇搞定多级缓存:Redis分布式缓存+Caffeine本地缓存

看看官方介绍:Redis的重要特性总结存储在内存更高效的数据结构(用c语言编写,足够底层O(∩_∩)O)支持复制,集群;高可用!面试题:Redis为什么这么快?可以从官方给出的这几个方面回答。

m0_73904503的博客 3244

中国ETF基金行情数据API接口

上交所:https://tsanghi.com/api/fin/etf/XSHG/daily?token={token}&ticker={ticker} 深交所:https://tsanghi.com/api/fin/etf/XSHE/daily?token={token}&ticker={ticker}

2401_83242712的博客 4036

Cursor生成JAVA相关的关键词提示规则

你是 Java 编程、Spring Boot、Spring Framework、Maven、JUnit 及相关 Java 技术的专家。在项目根目录创建一个.curstorrules文件(注意有个小数点),之后在该文件内填入下面内容。始终遵循 SOLID 原则,保持高内聚低耦合的 Spring Boot 应用设计。Java 和 Spring Boot 使用规范。Spring Boot 具体规范。

kitonGao的博客 2117

SpringBoot使用Redis实现分布式缓存

springboot使用Redis实现分布式缓存 Redis实现主从复制 Redis集群的构建

不迁怒,不贰过。小知识,大智慧。 4586

TC3XX - MCAL知识点(二十四):UART MCAL配置及代码实战

UART驱动程序负责按照UART协议提供通信服务。ASCLIN模块为异步通信提供硬件支持,实现UART协议。UART驱动程序提供了配置、初始化、数据传输、接收等功能,还提供了中止传输和中止接收 abort等可选特性。软硬件匹配关系如下:UART驱动程序使用ASCLIN进行数据的传输和接收。驱动程序使用的关键硬件功能特性是:1、全双工异步工作模式2、支持半双工工作模式3、16字节的TXFIFO4、16字节的RXFIFO5、2 ~ 16位数据帧6、校验位生成/检查7、一个或两个停止位。

梦想技术家 1832

【Redis】什么是Redis缓存 雪崩、穿透、击穿?(一篇文章就够了)

Redis缓存 雪崩、穿透、击穿,一文带你全理解。

m0_64210833的博客 4037

040、全志V853低功耗AI视觉平台的ISP调优——电池供电场景下的画质与功耗平衡

本文分享了全志V853 AI视觉平台在电池供电场景下的ISP调优经验。作者通过实际项目踩坑案例,揭示了V853 ISP的特殊性:不同于主流平台,其ISP与CPU共享时钟域,降噪能力有限,需特别注意功耗控制。关键优化策略包括:关闭无效ISP模块、优化Sensor联动时钟、采用场景自适应配置、开发快速启动模式等。特别指出V853个体差异大,量产需考虑高低温影响。文章强调V853的ISP功耗优化需从寄存器级别精打细算,不能简单套用其他平台经验,建议选型时单独评估ISP功耗,避免续航缩水。

zzfmlxs的博客 26

InVEST模型 | HAbitat quality模块计算生境质量

 本文详细介绍使用InVEST模型中HAbitat quality模块计算生境质量,包含各个参数的含义、所需数据、数据处理以及需要各个参数注意的地方等过程。

地理空间科学的博客 1万+

【Redis缓存】

相比于数据库而言,缓存的操作性能更高,缓存性能高的主要原因有以下几点:1、缓存一般都是key-value查询数据的,因为不像数据库一样还有查询的条件等因素,所以查询的性能一般会比数据库高;2、缓存的数据是存储在内存当中的,而数据库的数据是存储在磁盘当中的,因为内存的操作性能远远大于磁盘,因此缓存的查询效率会高很多;3、缓存更容易做分布式部署(当一台服务器变成多台相连的服务器集群),而数据库一般比较难实现分布式部署,因此缓存的负载和性能更容易平行扩展和增加。缓存大致分为两大类:本地缓存、分布式缓存本地缓存:也

weixin_54161577的博客 9828

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

缓存方案对比:本地缓存、Redis 与分布式缓存的多层策略

对于小型刷题系统,一个本地缓存(Python 的 functools.lru_cache 或自定义的 TTL 字典)可能已经足够。随着系统规模的增长,逐步升级到 Redis,再到分布式缓存。缓存架构应该随业务规模"生长"出来,而不是一开始就设计成重型的三级架构。记住一个数字:一次 Redis 查询约 0.5ms,一次 MySQL 查询约 5ms。差距只有 10 倍。如果你的系统还没有到"10 倍差距让你感受到疼痛"的阶段,缓存不是你的第一优先级。

cannonjinx的博客 2486

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

如何使用Redis实现分布式缓存

核心流程:分布式缓存的核心是 “查缓存→查库→回写缓存”,所有服务共用同一个 Redis 实例,实现缓存共享;关键配置:Redis 连接要配置地址 / 密码 / 连接池,缓存必须设过期时间;避坑要点:必须处理缓存穿透、击穿、雪崩问题,修改数据时遵循 “先更库,再删缓存”(而非直接更缓存)。

weixin_53050448的博客 1215

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Redis主从复制、缓存雪崩、缓存击穿、缓存穿透及分布式缓存(三)

✍、Redis主从复制、缓存雪崩、缓存击穿、缓存穿透及分布式缓存(三)

Augenstern_QXL的博客 2023

Redis 实现分布式缓存

Redis 作为一种高性能的内存数据库,在分布式缓存领域具有广泛的应用前景。通过合理的架构设计、数据存储策略、性能优化和安全可靠性措施,可以充分发挥 Redis 的优势,提高系统的性能和可扩展性。

果酱 の 博客 2013
上一篇: 异常这样处理,对用户更友好
下一篇: 哪些代码破坏了LSP?
大盛玩java
博客等级 码龄5年 0粉丝 22原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值