基于Spring-Boot和Redis缓存Mysql数据库数据
来源:互联网 发布:linux新建脚本命令 编辑:程序博客网 时间:2024/05/21 09:11
1.开发技术和工具
Spring-Boot、Mybatis、Redis | IDEA、Mysql、Navicat、Redis Desktop Manager、Postman
2.Redis
在目前企业开发过程中,对于热数据都是用NoSql的模式进行相应的缓存,而其中用的最多的就是Redis(ps:鹿晗事件你们可能见识到sina redis崩掉导致热门话题5个小时都没无法访问)。 Redis确实做缓存和session共享是利器,其优良的性能(读-11万次/s,写-8万次/s),加上Redis-Cluster 性能卓群的集群模式,更加肯定了redis缓存在分布式软件开发过程的地位。所以作为入门级缓存开发人员,接下来为大家介绍一下redis作为springboot工程缓存初体验。
3.前期准备
1.安装好idea、配置好jdk、下载安装redis(包括redis配置)
2.安装Redis Desktop Manager (用于缓存查看)
4.入手代码
1.使用idea快速生成springboot工程
2.配置文件application.properties的编写(spring boot 让我们远离复杂的xml配置)
3.mapper、service、model、controller、config等包和类的完成
4.mybatis文件夹里**Mapper.xml文件的完成
文件结构如下图:
5.重点介绍CacheConfig类和如何在UserService类上使用redis缓存
CacheConfig.java内容:
其中wiselyKeyGenerator方法用来产生键名,存入Redis中,这样的方式适合于分布式系统开发,保证键的唯一性和数据的正确性!
@Configuration@EnableCachingpublic class CacheConfig extends CachingConfigurerSupport { @Value("${spring.redis.host}") private String host; @Value("${spring.redis.port}") private int port; @Value("${spring.redis.timeout}") private int timeout; @Value("${spring.redis.database}") private int database; /** * 键的生成策略 * @return * 规则:目标类名称+方法名+参数名 */ @Bean public KeyGenerator wiselyKeyGenerator() { return new KeyGenerator() { @Override public Object generate(Object target, Method method, Object... params) { StringBuilder sb = new StringBuilder(); sb.append(target.getClass().getName()); sb.append(method.getName()); for (Object obj : params) { sb.append(obj.toString()); } return sb.toString(); } }; } @Bean public JedisConnectionFactory redisConnectionFactory() { JedisConnectionFactory factory = new JedisConnectionFactory(); factory.setHostName(host); factory.setPort(port); factory.setTimeout(timeout); factory.setDatabase(database); return factory; } /** * 配置CacheManager 管理cache * @param redisTemplate * @return */ @Bean public CacheManager cacheManager(RedisTemplate redisTemplate) { RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate); cacheManager.setDefaultExpiration(60*60); // 设置key-value超时时间 return cacheManager; } @Bean public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) { RedisTemplate<Object, Object> template = new RedisTemplate<>(); template.setConnectionFactory(connectionFactory); //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值 Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper mapper = new ObjectMapper(); mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); serializer.setObjectMapper(mapper); template.setValueSerializer(serializer); //使用StringRedisSerializer来序列化和反序列化redis的key值 template.setKeySerializer(new StringRedisSerializer()); template.afterPropertiesSet(); return template; }}6.UserService中如何设置redis的缓存
@Servicepublic class UserService {@Autowiredprivate UserMapper userMapper;@Cacheable(value = "user", keyGenerator = "wiselyKeyGenerator")public User selectUserById(String id) {System.out.println("无缓存的时候调用这里!");User u = userMapper.selectUserById(id);return u;}@Cacheable(value= "user", keyGenerator = "wiselyKeyGenerator")public void insertUser(User user){long startTime = System.currentTimeMillis();BigDecimal bs = BigDecimal.valueOf(startTime);userMapper.insertUser(user);long endTime = System.currentTimeMillis();BigDecimal es = BigDecimal.valueOf(endTime);System.out.println("耗时:="+es.subtract(bs));}
其中@Cacheable中value是保存缓存结果集名称,keyGenerator用来产生键名
7.Cacheable的详解和说明:
@Cacheable:配置了findByName函数的返回值将被加入缓存。同时在查询时,会先从缓存中获取,若不存在才再发起对数据库的访问。该注解主要有下面几个参数: - value、cacheNames:两个等同的参数(cacheNames为Spring 4新增,作为value的别名),用于指定缓存存储的集合名。由于Spring 4中新增了@CacheConfig,因此在Spring 3中原本必须有的value属性,也成为非必需项了 - key:缓存对象存储在Map集合中的key值,非必需,缺省按照函数的所有参数组合作为key值,若自己配置需使用SpEL表达式,比如:@Cacheable(key = "#p0"):使用函数第一个参数作为缓存的key值,更多关于SpEL表达式的详细内容可参考官方文档 - condition:缓存对象的条件,非必需,也需使用SpEL表达式,只有满足表达式条件的内容才会被缓存,比如:@Cacheable(key = "#p0", condition = "#p0.length() < 3"),表示只有当第一个参数的长度小于3的时候才会被缓存,若做此配置上面的AAA用户就不会被缓存,读者可自行实验尝试。 - unless:另外一个缓存条件参数,非必需,需使用SpEL表达式。它不同于condition参数的地方在于它的判断时机,该条件是在函数被调用之后才做判断的,所以它可以通过对result进行判断。 - keyGenerator:用于指定key生成器,非必需。若需要指定一个自定义的key生成器,我们需要去实现org.springframework.cache.interceptor.KeyGenerator接口,并使用该参数来指定。需要注意的是:该参数与key是互斥的 - cacheManager:用于指定使用哪个缓存管理器,非必需。只有当有多个时才需要使用 - cacheResolver:用于指定使用那个缓存解析器,非必需。需通过org.springframework.cache.interceptor.CacheResolver接口来实现自己的缓存解析器,并用该参数指定。除了这里用到的两个注解之外,还有下面几个核心注解:- @CachePut:配置于函数上,能够根据参数定义条件来进行缓存,它与@Cacheable不同的是,它每次都会真是调用函数,所以主要用于数据新增和修改操作上。它的参数与@Cacheable类似,具体功能可参考上面对@Cacheable参数的解析- @CacheEvict:配置于函数上,通常用在删除方法上,用来从缓存中移除相应数据。除了同@Cacheable一样的参数之外,它还有下面两个参数: - allEntries:非必需,默认为false。当为true时,会移除所有数据 - beforeInvocation:非必需,默认为false,会在调用方法之后移除数据。当为true时,会在调用方法之前移除数据。
8.介绍spring-boot 工程使用https(配置ssl证书)
ssl证书可以通过bendi jdk生成和跟第三方证书网站申请,这里只介绍本地生成
WIN+R打开cmd,运行命令:keytool -genkey -alias tomcat -storetype PKCS12
填写完信息就会在C盘用户默认目录下生成.keystore文件,我们将这个文件复制到工程的根目录下即可。
然后在spplication.properties中配置ssl相关:
#ssl
server.ssl.key-store=.keystore
server.ssl.key-password=123456
server.ssl.key-alias=tomcat
server.ssl.key-store=.keystore
server.ssl.key-password=123456
server.ssl.key-alias=tomcat
5.运行测试
1.启动springboot 的main函数:发现端口是8080:https
2.使用postman进行接口调试输入https://localhost:8080/springboot/star?id=1
调用service中的selectUserById,第一次访问,在console会发现显示了:"无缓存的时候调用这里",这是因为一开始redis缓存中没有该数据,只能去查库。
3.在调一下刚才那个接口
发现console已经没有“无缓存的时候调用这里”,这是因为上次查询完数据库之后会将查处数据保存在redis缓存中。键名是com.star.service.UserServiceselectUserById2 --规则(包名+方法名+参数名)如图所示:
6.传送门(资源):
资源下载链接:传送门--资源
阅读全文
0 0
- 基于Spring-Boot和Redis缓存Mysql数据库数据
- Spring Boot Redis 数据缓存
- Spring Boot使用redis做数据缓存
- Spring Boot使用redis做数据缓存
- Spring Boot使用redis做数据缓存
- Spring Boot使用redis实现数据缓存
- Spring Boot使用redis做数据缓存
- Spring Boot集成redis做数据缓存
- Spring Boot使用redis做数据缓存
- Spring Boot使用redis做数据缓存
- spring boot使用redis做数据缓存
- spring-boot | 整合Redis缓存数据
- Spring Boot使用redis做数据缓存
- Spring Boot 基于注解的 Redis 缓存使用
- 3. Spring Boot 1.2.5使用redis做数据缓存
- Spring Boot 1.2.5使用redis做数据缓存
- spring boot之缓存Redis
- Spring Boot缓存实战 Redis
- web前端开发基础环境配置
- <html lang="zh-cn">和<meta chartset="utf-8">
- TensorFlow实现经典深度学习网络(6):TensorFlow实现基于LSTM的语言模型
- RecyclerView万能分割线
- KindEditor示例
- 基于Spring-Boot和Redis缓存Mysql数据库数据
- page与pageContext的区别
- 解决centos7 中 使用mariadb 安装mysql不成功的问题
- 前端开发之前的准备工作
- 关于hibernate中报错:Encountered a duplicated sql alias [created_by_login] during auto-discovery of a nati
- 倒计时 js
- iOS拨打电话
- 数据结构基础——指针及动态内存分配(malloc)
- JVM源码分析之FinalReference完全解读