基于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

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.传送门(资源):

资源下载链接:传送门--资源







原创粉丝点击