IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> java整合redis -> 正文阅读

[Java知识库]java整合redis

Jedis

官方客户端,类似于 JDBC,可以看做是对 redis 命令的包装。

基于 BIO,线程不安全,需要配置连接池管理连接。

Lettuce

目前主流推荐的驱动,基于 Netty NIO,API 线程安全 (springboot 默认推荐使用)

Redission

基于 Netty NIO,API 线程安全。 亮点:大量丰富的分布式功能特性,比如 JUC 的线程安全集合和工具的分布式版本,分布式的基 本数据类型和锁等。

redis于spring的整合

Spring Data Redis

核心是 RedisTemplate(可以配置基于 Jedis,Lettuce,Redisson)) 使用方式类似于 MongoDBTemplate,JDBCTemplate 或 JPA

?

spring Boot 与 Redis 集成

引入 spring-boot-starter-data-redis 配置 spring redis

Spring Cache 与 Redis 集成

默认使用全局的 CacheManager 自动集成 使用 ConcurrentHashMap 或 ehcache 时,不需要考虑序列化问题 (因为本身就是在jvm)。

redis 的话,需要:

1、默认使用 java 的对象序列化,对象需要实现 Serializable

2、自定义配置,可以修改为其他序列化方式

MyBatis 项目集成 cache 示例

1、集成 spring boot 与 mybatis,实现简单单表操作,配置成 rest 接口

2、配置 ehcache+mybatis 集成,实现 mybatis 二级缓存 (命中二级缓存 就不需要访问数据库了 直接就是在mybatis ORM层就返回了)

开启二级缓存代码

<!-- ?  开启mybatis cache  -->
<!-- ?  <cache type="org.mybatis.caches.ehcache.LoggingEhcache">-->
<!-- ? ? ?  <property name="memoryStoreEvictionPolicy" value="LRU"/>-->
<!-- ?  </cache>-->

配置ehcache文件

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 ? ? ? ? xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
 ? ?<diskStore path="java.io.tmpdir" />
 ? ?<defaultCache eternal="false" maxElementsInMemory="1000"
 ? ? ? ? ? ? ? ? ?overflowToDisk="false" diskPersistent="false" timeToIdleSeconds="0"
 ? ? ? ? ? ? ? ? ?timeToLiveSeconds="600" memoryStoreEvictionPolicy="LRU" />
 ? ?<cache
 ? ? ? ? ? ?name="userCache"
 ? ? ? ? ? ?maxElementsInMemory="1000"
 ? ? ? ? ? ?eternal="false"
 ? ? ? ? ? ?timeToIdleSeconds="300"
 ? ? ? ? ? ?timeToLiveSeconds="300"
 ? ? ? ? ? ?overflowToDisk="false"
 ? ? ? ? ? ?memoryStoreEvictionPolicy="LRU">
 ? ? ? ?<!-- 配置缓存事件监听器 replicateAsynchronously 操作是否异步,默认值为true. replicatePuts 添加操作是否同步到集群内的其他缓存,默认为true.
 ? ? ? ? ? ?replicateUpdates 更新操作是否同步到集群内的其他缓存,默认为true. replicateUpdatesViaCopy 更新之后的对象是否复制到集群中的其他缓存(true);
 ? ? ? ? ? ?replicateRemovals 删除操作是否同步到集群内的其他缓存,默认为true. -->
 ? ? ? ?<cacheEventListenerFactory
 ? ? ? ? ? ? ? ?class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
 ? ? ? ? ? ? ? ?properties="
 ? ? ? ? ? ? ? ? ? ?replicateAsynchronously=true,
 ? ? ? ? ? ? ? ? ? ?replicatePuts=true,
 ? ? ? ? ? ? ? ? ? ?replicateUpdates=true,
 ? ? ? ? ? ? ? ? ? ?replicateUpdatesViaCopy=true,
 ? ? ? ? ? ? ? ? ? ?replicateRemovals=true " />
?
 ? ? ? ?<!-- 初始化缓存,以及自动设置 -->
 ? ? ? ?<bootstrapCacheLoaderFactory
 ? ? ? ? ? ? ? ?class="net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory"
 ? ? ? ? ? ? ? ?properties="bootstrapAsynchronously=true" />
 ? ?</cache>
?
</ehcache>

3、配置 spring cache+ehcache 缓存,实现方法级别缓存 (在service层放上加上缓存数据,当我们Controller 调用service 当service 没有被修改过 已经被spring cache 缓存了 就不会到 更下面 orm层! 实现更高效的缓存 )

@CacheConfig(cacheNames = "users")
public interface UserService {
?
 ? ?User find(int id);
?
 ? ?List<User> list();
?
}
spring:
  datasource:
 ?  username: root
 ?  password:
 ?  url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
 ?  driver-class-name: com.mysql.jdbc.Driver
  cache:
 ?  type: redis
  redis:
 ?  host: localhost
 ?  lettuce:
 ? ?  pool:
 ? ? ?  max-active: 16
 ? ? ?  max-wait: 10ms
@SpringBootApplication(scanBasePackages = "io.kimmking.cache")
@MapperScan("io.kimmking.cache.mapper")
@EnableCaching
public class CacheApplication {
?
 ? public static void main(String[] args) {
 ? ? ?SpringApplication.run(CacheApplication.class, args);
 ? }
?
}
@Service
public class UserServiceImpl implements UserService {
?
 ? ?@Autowired
 ? ?UserMapper userMapper; //DAO  // Repository
?
 ? ?// 开启spring cache
 ? ?@Cacheable(key="#id",value="userCache")
 ? ?public User find(int id) {
 ? ? ? ?System.out.println(" ==> find " + id);
 ? ? ? ?return userMapper.find(id);
 ?  }
?
 ? ?// 开启spring cache
 ? ?@Cacheable //(key="methodName",value="userCache")
 ? ?public List<User> list(){
 ? ? ? ?return userMapper.list();
 ?  }
?
}

4、修改 spring cache 使用 redis 远程缓存代替 ehcache 本地缓存

package io.kimmking.cache;
?
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.interceptor.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
?
import javax.annotation.Resource;
?
import static org.springframework.data.redis.cache.RedisCacheConfiguration.defaultCacheConfig;
?
@Configuration
public class CacheConfig extends CachingConfigurerSupport {
?
 ? ?@Resource
 ? ?private RedisConnectionFactory factory;
?
 ? ?/**
 ? ? * 自定义生成redis-key
 ? ? *
 ? ? * @return
 ? ? */
 ? ?@Override
 ? ?@Bean
 ? ?public KeyGenerator keyGenerator() {
 ? ? ? ?return (o, method, objects) -> {
 ? ? ? ? ? ?StringBuilder sb = new StringBuilder();
 ? ? ? ? ? ?sb.append(o.getClass().getName()).append(".");
 ? ? ? ? ? ?sb.append(method.getName()).append(".");
 ? ? ? ? ? ?for (Object obj : objects) {
 ? ? ? ? ? ? ? ?sb.append(obj.toString()).append(".");
 ? ? ? ? ?  }
 ? ? ? ? ? ?//System.out.println("keyGenerator=" + sb.toString());
 ? ? ? ? ? ?return sb.toString();
 ? ? ?  };
 ?  }
?
 ? ?@Bean
 ? ?public RedisTemplate<Object, Object> redisTemplate() {
 ? ? ? ?RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
 ? ? ? ?redisTemplate.setConnectionFactory(factory);
?
 ? ? ? ?GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
?
 ? ? ? ?redisTemplate.setKeySerializer(genericJackson2JsonRedisSerializer);
 ? ? ? ?redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
?
 ? ? ? ?redisTemplate.setHashKeySerializer(new StringRedisSerializer());
 ? ? ? ?redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
 ? ? ? ?return redisTemplate;
 ?  }
?
 ? ?@Bean
 ? ?@Override
 ? ?public CacheResolver cacheResolver() {
 ? ? ? ?return new SimpleCacheResolver(cacheManager());
 ?  }
?
 ? ?@Bean
 ? ?@Override
 ? ?public CacheErrorHandler errorHandler() {
 ? ? ? ?// 用于捕获从Cache中进行CRUD时的异常的回调处理器。
 ? ? ? ?return new SimpleCacheErrorHandler();
 ?  }
?
 ? ?@Bean
 ? ?@Override
 ? ?public CacheManager cacheManager() {
 ? ? ? ?RedisCacheConfiguration cacheConfiguration =
 ? ? ? ? ? ? ? ?defaultCacheConfig()
 ? ? ? ? ? ? ? ? ? ? ?  .disableCachingNullValues()
 ? ? ? ? ? ? ? ? ? ? ?  .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericJackson2JsonRedisSerializer()));
 ? ? ? ?return RedisCacheManager.builder(factory).cacheDefaults(cacheConfiguration).build();
 ?  }
}

5、修改 spring cache 使用 jackson json 序列化代替 java 序列化

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-18 17:28:59  更:2022-05-18 17:31:09 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 21:45:57-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码