前面一节总结了SpringBoot实现Mybatis的缓存机制,但是实际项目中很少用到Mybatis的二级缓存机制,反而用到比较多的是第三方缓存Redis。
Redis是一个使用ANSI C编写的开源、支持网络、基于内存、可选持久性的键值对存储数据库。
安装启动Redis安装Redis的就不讲太多了,直接去官方下载redis,下载Redis-x64-3.2.100.zip,cmd,在redis目录下输入:redis-server.exe redis.windows.conf启动即可
另外可以通过Redis桌面客户端可视化连接工具操作:redisdesktop
代码部署 添加redis依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> application.yml配置 spring: redis: host: 127.0.0.1 database: 0 password: port: 6379 jedis: pool: max-active: 1000 # 连接池最大连接数(使用负值表示没有限制) max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制) max-idle: 10 # 连接池中的最大空闲连接 min-idle: 5 # 连接池中的最小空闲连接 RedisConfig配置类 @Autowired private RedisConnectionFactory factory; /** * * @return */ @Bean public RedisTemplate<String, Object> redisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); //更改在redis里面查看key编码问题 redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.setConnectionFactory(factory); return redisTemplate; } RedisUtils工具类 @Autowired private RedisTemplate redisTemplate; // 简单的K-V操作 @Resource(name="redisTemplate") private ValueOperations<String, String> valueOperations; // 针对Map类型的数据操作 @Resource(name="redisTemplate") private HashOperations<String, String, Object> hashOperations; // 针对List类型的数据操作 @Resource(name="redisTemplate") private ListOperations<String, Object> listOperations; // set类型数据操作 @Resource(name="redisTemplate") private SetOperations<String, Object> setOperations; // zset类型数据操作 @Resource(name="redisTemplate") private ZSetOperations<String, Object> zSetOperations; 实体类SysCodeEntity @Data public class SysCodeEntity implements Serializable { private static final long serialVersionUID = 1L; private int id; // 分类编码 private String kindCode; // 分类名称 private String kindName; // CODE编码 private String code; ...... } ServiceImpl实现类 /** * 查询所有数字字典 * @return */ @Override public List<SysCodeEntity> queryCodeAll() { logger.info("先从缓存中查找,如果没有则去数据进行查询"); List<SysCodeEntity> codeList = (List<SysCodeEntity>)redisTemplate.opsForList().leftPop("codeList"); if (codeList == null) { logger.info("说明缓存中没有数据,则到数据库中查询"); codeList = sysCodeDao.queryCodeAll(); logger.info("将数据库获取的数据存入缓存"); redisTemplate.opsForList().leftPush("codeList", codeList); } else { logger.info("则说明缓存中存在,直接从缓存中获取数据"); } logger.info("codeList=" + codeList); return codeList; }上面例子具体解释已经在注释中体现,通过opsForList的leftPop和leftPush存入和获取Redis缓存的数据。
Controller层实现 /** * 查询所有数字字典 * @return */ @RequestMapping("/getAll") private List<SysCodeEntity> getUser() { Long startTime = System.currentTimeMillis(); //开始时间 List<SysCodeEntity> codeList = sysCodeService.queryCodeAll(); Long endTime = System.currentTimeMillis(); //结束时间 System.out.println("查询数据库--共耗时:" + (endTime - startTime) + "毫秒"); //1007毫秒 return codeList; } Postman进行测试 :8080/getAll 日志信息 总结和扩展1、Redis支持:字符串String、哈希Hash、列表List、集合Set、有序集合Sorted Set、发布订阅Pub/Sub、事务Transactions,7种数据类型
2、Redis实用场景:缓存系统、计数器、消息列队系统、排行版及相关问题、社交网络、按照用户投票和时间排序、过期项目处理、实时系统
3、Redis的高级功能:慢查询(内部执行时间超过某个指定的时限查询)、PipeLine管道(降低客户端与redis通信次数,适用于批处理)、BitMap位图(针对大数据量设计)、HyperLogLog(极小空间完成独立数据统计)、发布订阅、消息队列、GEO地理位置存储
4、Redis持久化:
快照RDB(使用快照,一种半持久耐用模式。不时的将数据集以异步方式从内存以RDB格式写入硬盘)