写点什么

立即可用的实战源码 (springboot+redis+mybatis,java 自学教程免费视频

用户头像
极客good
关注
发布于: 刚刚
  1. 整个应用的启动类,增加了 MapperScan 注解:


package com.bolingcavalry.servicea;


import org.mybatis.spring.annotation.MapperScan;


import org.springframework.boot.SpringApplication;


import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication


@MapperScan("com.bolingcavalry.servicea.mapper")


public class ServiceAApplication {


public static void main(String[] args) {


SpringApplication.run(ServiceAApplication.class, args);


}


}


以上就是 service-a 的全部源码了,包括 mybatis 和 restTmeplate 操作;

[](

)service-b 源码


  1. 创建名为 service-b 的子工程,pom.xml 如下,要注意的是依赖了 spring-boot-starter-data-redis 和 commons-pool2:


<?xml version="1.0" encoding="UTF-8"?>


<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"


xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">


<modelVersion>4.0.0</modelVersion>


<parent>


<groupId>com.bolingcavalry</groupId>


<artifactId>pinpoint185demo</artifactId>


<version>1.0-SNAPSHOT</version>


</parent>


<artifactId>service-b</artifactId>


<name>service-b</name>


<description>服务 b</description>


<dependencies>


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-data-redis</artifactId>


</dependency>


<dependency>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-starter-web</artifactId>


</dependency>


<dependency>


<groupId>com.alibaba</groupId>


<artifactId>fastjson</artifactId>


<version>1.2.28</version>


</dependency>


<dependency>


<groupId>org.apache.commons</groupId>


<artifactId>commons-pool2</artifactId>


<version>2.0</version>


</dependency>


</dependencies>


<build>


<plugins>


<plugin>


<groupId>org.springframework.boot</groupId>


<artifactId>spring-boot-maven-plugin</artifactId>


</plugin>


</plugins>


</build>


</project>


  1. 应用的配置文件 application.properties 内容如下:


server.port=8081


#redis


spring.redis.host=192.168.121.144


spring.redis.port=6379

数据库连接超时时间,2.0 中该参数的类型为 Duration,这里在配置的时候需要指明单位

spring.redis.timeout=60s

连接池配置,2.0 中直接使用 jedis 或者 lettuce 配置连接池

最大活跃连接数,负数为不限制

spring.redis.lettuce.pool.max-active=50

等待可用连接的最大时间,负数为不限制

spring.redis.lettuce.pool.max-wait=-1ms

最大空闲连接数

spring.redis.lettuce.pool.max-idle=10

最小空闲连接数

spring.redis.lettuce.pool.min-idle=2


  1. redis 的配置类:


package com.example.serviceb.config;


import com.fasterxml.jackson.annotation.JsonAutoDetect;


import com.fasterxml.jackson.annotation.PropertyAccessor;


import com.fasterxml.jackson.databind.ObjectMapper;


import org.springframework.cache.annotation.CachingConfigurerSupport;


import org.springframework.cache.annotation.EnableCaching;


import org.springframework.context.annotation.Bean;


import org.springframework.context.annotation.Configuration;


import org.springframework.data.redis.connection.RedisConnectionFactory;


import org.springframework.data.redis.core.*;


import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;


import org.springframework.data.redis.serializer.StringRedisSerializer;


/**


  • @Description: (这里用一句话描述这个类的作用)

  • @author: willzhao E-mail: zq2599@gmail.com

  • @date: 2019/10/3 11:06


*/


@Configuration


@EnableCaching


public class RedisConfig extends CachingConfigurerSupport {


/**


  • retemplate 相关配置

  • @param factory

  • @return


*/


@Bean


public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {


RedisTemplate<String, Object> template = new RedisTemplate<>();


// 配置连接工厂


template.setConnectionFactory(factory);


//使用 Jackson2JsonRedisSerializer 来序列化和反序列化 redis 的 value 值(默认使用 JDK 的序列化方式)


Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);


ObjectMapper om = new ObjectMapper();


// 指定要序列化的域,field,get 和 set,以及修饰符范围,ANY 是都有包括 private 和 public


om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);


// 指定序列化输入的类型,类必须是非 final 修饰的,final 修饰的类,比如 String,Integer 等会跑出异常


om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);


jacksonSeial.setObjectMapper(om);


// 值采用 json 序列化


template.setValueSerializer(jacksonSeial);


//使用 StringRedisSerializer 来序列化和反序列化 redis 的 key 值


template.setKeySerializer(new StringRedisSerializer());


// 设置 hash key 和 value 序列化模式


template.setHashKeySerializer(new StringRedisSerializer());


template.setHashValueSerializer(jacksonSeial);


template.afterPropertiesSet();


return template;


}


/**


  • 对 hash 类型的数据操作

  • @param redisTemplate

  • @return


*/


@Bean


public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {


return redisTemplate.opsForHash();


}


/**


  • 对 redis 字符串类型数据操作

  • @param redisTemplate

  • @return


*/


@Bean


public ValueOperations<String, Object> valueOperations(RedisTemplate<String, Object> redisTemplate) {


return redisTemplate.opsForValue();


}


/**


  • 对链表类型的数据操作

  • @param redisTemplate

  • @return


*/


@Bean


public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {


return redisTemplate.opsForList();


}


/**


  • 对无序集合类型的数据操作

  • @param redisTemplate

  • @return


*/


@Bean


public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {


return redisTemplate.opsForSet();


}


/**


  • 对有序集合类型的数据操作

  • @param redisTemplate

  • @return


*/


@Bean


public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {


return redisTemplate.opsForZSet();


}


}


  1. redis 的工具类:


package com.example.serviceb.util;


/**


  • @Description: (这里用一句话描述这个类的作用)

  • @author: willzhao E-mail: zq2599@gmail.com

  • @date: 2019/10/3 11:09


*/


import org.springframework.beans.factory.annotation.Autowired;


import org.springframework.data.redis.core.RedisTemplate;


import org.springframework.stereotype.Component;


import org.springframework.util.CollectionUtils;


import java.util.List;


import java.util.Map;


import java.util.Set;


import java.util.concurrent.TimeUnit;


/**


  • redisTemplate 封装


*/


@Component


public class RedisUtil {


@Autowired


private RedisTemplate<String, Object> redisTemplate;


public RedisUtil(RedisTemplate<String, Object> redisTemplate) {


this.redisTemplate = redisTemplate;


}


/**


  • 指定缓存失效时间

  • @param key 键

  • @param time 时间(秒)

  • @return


*/


public boolean expire(String key,long time){


try {


if(time>0){


redisTemplate.expire(key, time, TimeUnit.SECONDS);


}


return true;


} catch (Exception e) {


e.printStackTrace();


return false;


}


}


/**


  • 根据 key 获取过期时间

  • @param key 键 不能为 null

  • @return 时间(秒) 返回 0 代表为永久有效


*/


public long getExpire(String key){


return redisTemplate.getExpire(key,TimeUnit.SECONDS);


}


/**


  • 判断 key 是否存在

  • @param key 键

  • @return true 存在 false 不存在


*/


public boolean hasKey(String key){


try {


return redisTemplate.hasKey(key);


} catch (Exception e) {


e.printStackTrace();


return false;


}


}


/**


  • 删除缓存

  • @param key 可以传一个值 或多个


*/


@SuppressWarnings("unchecked")


public void del(String ... key){


if(key!=null&&key.length>0){


if(key.length==1){


redisTemplate.delete(key[0]);


}else{


redisTemplate.delete(CollectionUtils.arrayToList(key));


}


}


}


//============================String=============================


/**


  • 普通缓存获取

  • @param key 键

  • @return 值


*/


public Object get(String key){


return key==null?null:redisTemplate.opsForValue().get(key);


}


/**


  • 普通缓存放入

  • @param key 键

  • @param value 值

  • @return true 成功 false 失败


*/


public boolean set(String key,Object value) {


try {


redisTemplate.opsForValue().set(key, value);


return true;


} catch (Exception e) {


e.printStackTrace();


return false;


}


}


/**


  • 普通缓存放入并设置时间

  • @param key 键

  • @param value 值

  • @param time 时间(秒) time 要大于 0 如果 time 小于等于 0 将设置无限期

  • @return true 成功 false 失败


*/


public boolean set(String key,Object value,long time){


try {


if(time>0){


redisTemplate.opsForValue().set(key, value, time, TimeUnit.SECONDS);


}else{


set(key, value);


}


return true;


} catch (Exception e) {


e.printStackTrace();


return false;


}


}


/**


  • 递增

  • @param key 键

  • @param delta 要增加几(大于 0)

  • @return


*/


public long incr(String key, long delta){


if(delta<0){


throw new RuntimeException("递增因子必须大于 0");


}


return redisTemplate.opsForValue().increment(key, delta);


}


/**


  • 递减

  • @param key 键

  • @param delta 要减少几(小于 0)

  • @return


*/


public long decr(String key, long delta){


if(delta<0){


throw new RuntimeException("递减因子必须大于 0");


}


return redisTemplate.opsForValue().increment(key, -delta);


}


//================================Map=================================


/**


  • HashGet

  • @param key 键 不能为 null

  • @param item 项 不能为 null

  • @return 值


*/


public Object hget(String key,String item){


return redisTemplate.opsForHash().get(key, item);


}


/**


  • 获取 hashKey 对应的所有键值

  • @param key 键

  • @return 对应的多个键值


*/


public Map<Object,Object> hmget(String key){


return redisTemplate.opsForHash().entries(key);


}


/**


  • HashSet

  • @param key 键

  • @param map 对应多个键值

  • @return true 成功 false 失败


*/


public boolean hmset(String key, Map<String,Object> map){


try {


redisTemplate.opsForHash().putAll(key, map);


return true;


} catch (Exception e) {


e.printStackTrace();


return false;


}


}


/**


  • HashSet 并设置时间

  • @param key 键

  • @param map 对应多个键值

  • @param time 时间(秒)

  • @return true 成功 false 失败


*/


public boolean hmset(String key, Map<String,Object> map, long time){


try {


redisTemplate.opsForHash().putAll(key, map);


if(time>0){


expire(key, time);


}


return true;


} catch (Exception e) {


e.printStackTrace();


return false;


}


}


/**


  • 向一张 hash 表中放入数据,如果不存在将创建

  • @param key 键

  • @param item 项

  • @param value 值

  • @return true 成功 false 失败


*/


public boolean hset(String key,String item,Object value) {


try {


redisTemplate.opsForHash().put(key, item, value);


return true;


} catch (Exception e) {


e.printStackTrace();


return false;


}


}


/**


  • 向一张 hash 表中放入数据,如果不存在将创建

  • @param key 键

  • @param item 项

  • @param value 值

  • @param time 时间(秒) 注意:如果已存在的 hash 表有时间,这里将会替换原有的时间

  • @return true 成功 false 失败


*/


public boolean hset(String key,String item,Object value,long time) {


try {


redisTemplate.opsForHash().put(key, item, value);


if(time>0){


expire(key, time);


}


return true;


} catch (Exception e) {


e.printStackTrace();


return false;


}


}


/**


  • 删除 hash 表中的值

  • @param key 键 不能为 null

  • @param item 项 可以使多个 不能为 null


*/


public void hdel(String key, Object... item){


redisTemplate.opsForHash().delete(key,item);


}


/**


  • 判断 hash 表中是否有该项的值

  • @param key 键 不能为 null

  • @param item 项 不能为 null

  • @return true 存在 false 不存在


*/


public boolean hHasKey(String key, String item){


return redisTemplate.opsForHash().hasKey(key, item);


}


/**


  • hash 递增 如果不存在,就会创建一个 并把新增后的值返回

  • @param key 键


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


@param item 项


  • @param by 要增加几(大于 0)

  • @return


*/


public double hincr(String key, String item,double by){


return redisTemplate.opsForHash().increment(key, item, by);


}


/**


  • hash 递减

  • @param key 键

  • @param item 项

  • @param by 要减少记(小于 0)

  • @return


*/


public double hdecr(String key, String item,double by){


return redisTemplate.opsForHash().increment(key, item,-by);


}


//============================set=============================


/**


  • 根据 key 获取 Set 中的所有值

  • @param key 键

  • @return


*/


public Set<Object> sGet(String key){


try {


return redisTemplate.opsForSet().members(key);


} catch (Exception e) {


e.printStackTrace();


return null;


}


}


/**


  • 根据 value 从一个 set 中查询,是否存在

  • @param key 键

  • @param value 值

  • @return true 存在 false 不存在


*/


public boolean sHasKey(String key,Object value){


try {


return redisTemplate.opsForSet().isMember(key, value);


} catch (Exception e) {


e.printStackTrace();


return false;


}


}


/**


  • 将数据放入 set 缓存

  • @param key 键

  • @param values 值 可以是多个

  • @return 成功个数


*/


public long sSet(String key, Object...values) {


try {


return redisTemplate.opsForSet().add(key, values);


} catch (Exception e) {


e.printStackTrace();


return 0;


}


}


/**


  • 将 set 数据放入缓存

  • @param key 键

  • @param time 时间(秒)

  • @param values 值 可以是多个

  • @return 成功个数


*/


public long sSetAndTime(String key,long time,Object...values) {


try {


Long count = redisTemplate.opsForSet().add(key, values);


if(time>0) {


expire(key, time);


}


return count;


} catch (Exception e) {


e.printStackTrace();


return 0;


}


}


/**


  • 获取 set 缓存的长度

  • @param key 键

  • @return


*/


public long sGetSetSize(String key){


try {


return redisTemplate.opsForSet().size(key);


} catch (Exception e) {


e.printStackTrace();


return 0;


}


}


/**


  • 移除值为 value 的

  • @param key 键

  • @param values 值 可以是多个

  • @return 移除的个数


*/


public long setRemove(String key, Object ...values) {


try {


Long count = redisTemplate.opsForSet().remove(key, values);


return count;


} catch (Exception e) {


e.printStackTrace();


return 0;


}


}


//===============================list=================================


/**


  • 获取 list 缓存的内容

  • @param key 键

  • @param start 开始

  • @param end 结束 0 到 -1 代表所有值

  • @return


*/


public List<Object> lGet(String key, long start, long end){


try {


return redisTemplate.opsForList().range(key, start, end);


} catch (Exception e) {


e.printStackTrace();


return null;


}


}


/**


  • 获取 list 缓存的长度

  • @param key 键

  • @return


*/


public long lGetListSize(String key){


try {


return redisTemplate.opsForList().size(key);


} catch (Exception e) {


e.printStackTrace();


return 0;


}


}


/**


  • 通过索引 获取 list 中的值

  • @param key 键

  • @param index 索引 index>=0 时, 0 表头,1 第二个元素,依次类推;index<0 时,-1,表尾,-2 倒数第二个元素,依次类推

  • @return


*/


public Object lGetIndex(String key,long index){


try {


return redisTemplate.opsForList().index(key, index);


} catch (Exception e) {


e.printStackTrace();


return null;


}


}


/**


  • 将 list 放入缓存

  • @param key 键

  • @param value 值

  • @return


*/


public boolean lSet(String key, Object value) {


try {


redisTemplate.opsForList().rightPush(key, value);


return true;


} catch (Exception e) {


e.printStackTrace();


return false;


}


}


/**


  • 将 list 放入缓存

  • @param key 键

  • @param value 值

  • @param time 时间(秒)

  • @return


*/


public boolean lSet(String key, Object value, long time) {


try {


redisTemplate.opsForList().rightPush(key, value);


if (time > 0) {


expire(key, time);


}


return true;


} catch (Exception e) {


e.printStackTrace();


return false;


}


}


/**


  • 将 list 放入缓存

  • @param key 键

  • @param value 值

  • @return


*/


public boolean lSet(String key, List<Object> value) {


try {


redisTemplate.opsForList().rightPushAll(key, value);


return true;


} catch (Exception e) {


e.printStackTrace();


return false;


}


}


/**


  • 将 list 放入缓存

  • @param key 键

  • @param value 值

  • @param time 时间(秒)

  • @return


*/


public boolean lSet(String key, List<Object> value, long time) {


try {


redisTemplate.opsForList().rightPushAll(key, value);


if (time > 0) {


expire(key, time);


}


return true;


} catch (Exception e) {


e.printStackTrace();


return false;


}


}


/**


  • 根据索引修改 list 中的某条数据

  • @param key 键

  • @param index 索引

  • @param value 值

  • @return


*/


public boolean lUpdateIndex(String key, long index,Object value) {


try {


redisTemplate.opsForList().set(key, index, value);


return true;


} catch (Exception e) {


e.printStackTrace();


return false;


}


}


/**


  • 移除 N 个值为 value

  • @param key 键

  • @param count 移除多少个

  • @param value 值

  • @return 移除的个数


*/


public long lRemove(String key,long count,Object value) {


try {


Long remove = redisTemplate.opsForList().remove(key, count, value);


return remove;


} catch (Exception e) {


e.printStackTrace();


return 0;


}


}


}


  1. 保存 student 数据的实体类:


package com.example.serviceb.entity;


import java.io.Serializable;


/**


  • @Description: (这里用一句话描述这个类的作用)

  • @author: willzhao E-mail: zq2599@gmail.com

  • @date: 2019/10/3 11:11


*/


public class Student implements Serializable {

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
立即可用的实战源码(springboot+redis+mybatis,java自学教程免费视频