| |
|
|
开发:
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 序列化 |
|
|
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年11日历 | -2025/11/30 1:46:01- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |