欢迎关注方志朋的博客,回复”666“获面试宝典

一、Jedis,Redisson,Lettuce三者的区别

共同点:都提供了基于Redis操作的Java API,只是封装程度,具体实现稍有不同。

不同点:

1.1、Jedis

是Redis的Java实现的客户端。支持基本的数据类型如:String、Hash、List、Set、Sorted Set。

特点:使用阻塞的I/O,方法调用同步,程序流需要等到socket处理完I/O才能执行,不支持异步操作。Jedis客户端实例不是线程安全的,需要通过连接池来使用Jedis。

1.2、Redisson

优点点:分布式锁,分布式集合,可通过Redis支持延迟队列。

1.3、 Lettuce

用于线程安全同步,异步和响应使用,支持集群,Sentinel,管道和编码器。

基于Netty框架的事件驱动的通信层,其方法调用是异步的。Lettuce的API是线程安全的,所以可以操作单个Lettuce连接来完成各种操作。

二、RedisTemplate

2.1、使用配置

maven配置引入,(要加上版本号,我这里是因为Parent已声明)

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

application-dev.yml

spring:redis:host: 192.168.1.140port: 6379password:database: 15 # 指定redis的分库(共16个0到15)

2.2、使用示例

 @Resourceprivate StringRedisTemplate stringRedisTemplate;@Overridepublic 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();}// 缓存为空的时候,先查,然后缓存redisOptional<CustomersEntity> 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 <code>StringRedisTemplate</code> instance. {@link #setConnectionFactory(RedisConnectionFactory)}* and {@link #afterPropertiesSet()} still need to be called.*/public StringRedisTemplate() {RedisSerializer<String> stringSerializer = new StringRedisSerializer();setKeySerializer(stringSerializer);setValueSerializer(stringSerializer);setHashKeySerializer(stringSerializer);setHashValueSerializer(stringSerializer);}}

三、RedissonClient 操作示例

3.1 基本配置

3.1.1、Maven pom 引入
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency><groupId>org.redisson</groupId><artifactId>redisson</artifactId><version>3.8.2</version><optional>true</optional>
</dependency>
<dependency><groupId>org.redisson</groupId><artifactId>redisson-spring-boot-starter</artifactId><version>LATEST</version>
</dependency>
3.1.2、添加配置文件Yaml或者json格式

redisson-config.yml

# Redisson 配置
singleServerConfig:address: "redis://192.168.1.140:6379"password: nullclientName: nulldatabase: 15 #选择使用哪个数据库0~15idleConnectionTimeout: 10000pingTimeout: 1000connectTimeout: 10000timeout: 3000retryAttempts: 3retryInterval: 1500reconnectionTimeout: 3000failedAttempts: 3subscriptionsPerConnection: 5subscriptionConnectionMinimumIdleSize: 1subscriptionConnectionPoolSize: 50connectionMinimumIdleSize: 32connectionPoolSize: 64dnsMonitoringInterval: 5000#dnsMonitoring: falsethreads: 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 {@Beanpublic 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 {@Autowiredprivate RedissonClient redissonClient;static long i = 20;static long sum = 300;//    ========================== String =======================@GetMapping("/set/{key}")public String s1(@PathVariable String key) {// 设置字符串RBucket<String> keyObj = redissonClient.getBucket(key);keyObj.set(key + "1-v1");return key;}@GetMapping("/get/{key}")public String g1(@PathVariable String key) {// 设置字符串RBucket<String> 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);// 存放 HashRMap<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<String> keys1 = keys.getKeys();keys1.forEach(System.out::println);return keys.toString();}// ================== ==============读写锁测试 =============================@GetMapping("/rw/set/{key}")public void rw_set(){
//        RedissonLock.RBucket<String> 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() {@Overridepublic 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(r).start();
//            new Thread(r).run();
//            new Thread(r).run();
//            new Thread(r).run();
//            new Thread(r).run();}RBucket<String> 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

  • Fair Lock

  • MultiLock

  • RedLock

  • ReadWriteLock

  • Semaphore

  • PermitExpirableSemaphore

  • CountDownLatch

四、基于注解实现的Redis缓存

4.1 Maven 和 YML配置

参考 RedisTemplate 配置。另外,还需要额外的配置类

// todo 定义序列化,解决乱码问题
@EnableCaching
@Configuration
@ConfigurationProperties(prefix = "spring.cache.redis")
public class RedisCacheConfig {private Duration timeToLive = Duration.ZERO;public void setTimeToLive(Duration timeToLive) {this.timeToLive = timeToLive;}@Beanpublic CacheManager cacheManager(RedisConnectionFactory factory) {RedisSerializer<String> redisSerializer = new StringRedisSerializer();Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);// 解决查询缓存转换异常的问题ObjectMapper om = new ObjectMapper();om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);jackson2JsonRedisSerializer.setObjectMapper(om);// 配置序列化(解决乱码的问题)RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig().entryTtl(timeToLive).serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)).serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(jackson2JsonRedisSerializer)).disableCachingNullValues();RedisCacheManager cacheManager = RedisCacheManager.builder(factory).cacheDefaults(config).build();return cacheManager;}}

4.2 使用示例

@Transactional
@Service
public class ReImpl implements RedisService {@Resourceprivate CustomerRepo customerRepo;@Resourceprivate StringRedisTemplate stringRedisTemplate;public static final String REDIS_CUSTOMERS_ONE = "Customers";public static final String REDIS_CUSTOMERS_ALL = "allList";// =====================================================================使用Spring cahce 注解方式实现缓存// ==================================单个操作@Override@Cacheable(value = "cache:customer", unless = "null == #result",key = "#id")public CustomersEntity cacheOne(Integer id) {final Optional<CustomersEntity> byId = customerRepo.findById(id);return byId.isPresent() ? byId.get() : null;}@Override@Cacheable(value = "cache:customer", unless = "null == #result", key = "#id")public CustomersEntity cacheOne2(Integer id) {final Optional<CustomersEntity> byId = customerRepo.findById(id);return byId.isPresent() ? byId.get() : null;}// todo 自定义redis缓存的key,@Override@Cacheable(value = "cache:customer", unless = "null == #result", key = "#root.methodName + '.' + #id")public CustomersEntity cacheOne3(Integer id) {final Optional<CustomersEntity> byId = customerRepo.findById(id);return byId.isPresent() ? byId.get() : null;}// todo 这里缓存到redis,还有响应页面是String(加了很多转义符\,),不是Json格式@Override@Cacheable(value = "cache:customer", unless = "null == #result", key = "#root.methodName + '.' + #id")public String cacheOne4(Integer id) {final Optional<CustomersEntity> byId = customerRepo.findById(id);return byId.map(JSONUtil::toJsonStr).orElse(null);}// todo 缓存json,不乱码已处理好,调整序列化和反序列化@Override@Cacheable(value = "cache:customer", unless = "null == #result", key = "#root.methodName + '.' + #id")public CustomersEntity cacheOne5(Integer id) {Optional<CustomersEntity> byId = customerRepo.findById(id);return byId.filter(obj -> !StrUtil.isBlankIfStr(obj)).orElse(null);}// ==================================删除缓存@Override@CacheEvict(value = "cache:customer", key = "'cacheOne5' + '.' + #id")public Object del(Integer id) {// 删除缓存后的逻辑return null;}@Override@CacheEvict(value = "cache:customer",allEntries = true)public void del() {}@CacheEvict(value = "cache:all",allEntries = true)public void delall() {}// ==================List操作@Override@Cacheable(value = "cache:all")public List<CustomersEntity> cacheList() {List<CustomersEntity> all = customerRepo.findAll();return all;}// todo 先查询缓存,再校验是否一致,然后更新操作,比较实用,要清楚缓存的数据格式(明确业务和缓存模型数据)@Override@CachePut(value = "cache:all",unless = "null == #result",key = "#root.methodName")public List<CustomersEntity> cacheList2() {List<CustomersEntity> all = customerRepo.findAll();return all;}}

4.3 扩展

基于spring缓存实现

来源:blog.csdn.net/qq_42105629/article/details/102589319
热门内容:抖音的服务器究竟有多大?重磅消息:Spring 6 和Spring Boot 3
有个程序员老公有多爽???最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

Spring Boot 操作 Redis 的各种实现相关推荐

  1. Redis进阶-Jedis以及Spring Boot操作 Redis 5.x Cluster

    文章目录 Pre Jedis操作Redis Cluster 添加依赖 Code Spring Boot 操作Redis Cluster 引入 依赖 application.yml Code Pre R ...

  2. Spring Boot 操作 Redis教程

    Spring Boot 操作 Redis教程 在 Redis 出现之前,我们的缓存框架各种各样,有了 Redis ,缓存方案基本上都统一了 使用 Java 操作 Redis 的方案很多,Jedis 是 ...

  3. Spring Boot 整合Redis 包含Java操作Redis哨兵 作者:哇塞大嘴好帥(哇塞大嘴好帅)

    Spring Boot 整合Redis 包含Java操作Redis哨兵 作者:哇塞大嘴好帥(哇塞大嘴好帅) 1. 配置环境 在SpringBoot2.0版本以后,原来使用的jedis被替换成为了let ...

  4. Spring Boot与Redis的集成

    1.在Linux中安装Redis. 1.1.在线下载软件 1.2.安装软件 1.3.修改配置文件 1.4.启动Redis: 2.添加Redis起步缓存,在pom.xml中添加Spring Boot支持 ...

  5. Spring Boot集成Redis缓存之RedisTemplate的方式

    前言 Spring Boot 集成Redis,将自动配置 RedisTemplate,在需要使用的类中注入RedisTemplate的bean即可使用 @Autowired private Redis ...

  6. Spring boot - 整合 Redis缓存(上)

    一.配置Pom文件 在使用spring boot 2.0整合redis时遇到了好多问题,网上很多例子都是1.x版本的.故2.0没有折腾好所以将2.0降到了1.5.降级后由于thymeleaf版本也会从 ...

  7. Spring Boot基础学习笔记08:Spring Boot整合Redis

    文章目录 零.学习目标 1.熟悉Redis相关概念 2.掌握使用Spring Boot整合Redis 一.Redis概述 1.Redis简介 2.Redis优点 (1)存取速度快 (2)数据类型丰富 ...

  8. Spring boot整合Redis(入门教程)

    目录 源码分析 jedis VS lettuce 整合测试 导入依赖 配置连接 测试 存入字符串 存入对象 五大数据类型操作 自定义RedisConfig 存入对象 Redis工具类(常用API) 以 ...

  9. Linux 安装Redis-6.2.5,配置及使用(RDB与AOF持久化、sentinel机制、主从复制、Spring Boot 集成 Redis)

    CentOS 7 安装Redis-6.2.5版本 Redis采用的是基于内存的单进程 单线程模型 的KV数据库,由C语言编写.官方提供的数据是可以达到100000+的qps 应用场景: 令牌(Toke ...

最新文章

  1. 那些永不消逝的进程 (转)
  2. 安装部署OpenStack(添加资源)
  3. 一张有趣的图--《teach yourself c++ in 21 days》
  4. python shell运行当前程序、可以按下_Python下调用Linux的Shell命令的方法
  5. shell 批量生成随机文件
  6. Akka的类库和模块《six》译
  7. MySQL vs. MongoDB: Choosing a Data Management Solution
  8. Shiro 的 HelloWorld
  9. 计算机控制系统功能,计算机控制系统功能之操作指导-电脑自学网
  10. USB的SIE串行接口引擎
  11. java面向对象数组实现家庭收支记账软件_C项目-家庭收支记账软件
  12. 智能实验室管理系统的现状怎么样
  13. 文本主题模型之LDA
  14. should be described in NUMA config 和 CPU feature cmt not found
  15. 极速下载!利用插件破解百度云限速
  16. 1、【易混淆概念集】-前三章 1 工作绩效数据、信息、报告
  17. 【进阶技术】一篇文章搞掂:RibbitMQ
  18. java 消息队列_JAVA-消息队列
  19. 84个常用的数据源网站分享!(保持更新,建议收藏)
  20. 怎么做表情包微信gif?好用的制作方法介绍

热门文章

  1. 2018-3-22论文一种新型的智能算法--狼群算法(笔记三)算法的步骤+收敛性分析
  2. PAT (Advanced Level) 1132~1135:1132 模拟 1133模拟(易超时!) 1134图 1135红黑树
  3. 使用Python命令创建jenkins的job
  4. 转:YUV RGB 常见视频格式解析
  5. 数据库分享一: MySQL的Innodb缓存相关优化
  6. 数论(Lucas定理) HDOJ 4349 Xiao Ming's Hope
  7. 为python安装numpy和scipy(federo)
  8. 【组队学习】【32期】统计学习方法习题实战
  9. 【怎样写代码】实现对象的复用 -- 享元模式(一):问题案例
  10. 探索“小数”在计算机中的存储