| |
|
开发:
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图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 21:45:57- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |