1.引入redis依赖
在common下的pom文件中引入Redis依赖
<!--redis依赖-start--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency><!--redis依赖-end-->
2.配置文件配置Redis
在我的项目配置文件中配置Redis
spring.redis.database=15spring.redis.host=10.196.1.62spring.redis.port=7019spring.redis.password=gpSPcwzKspring.redis.lettuce.pool.max-active=8spring.redis.lettuce.pool.max-wait=5sspring.redis.lettuce.pool.max-idle=8spring.redis.lettuce.pool.min-idle=0
3.设置Redis
3.1定义Redis的key
在common文件夹下创立cache文件夹,定义KeyConstans.java文件
public class KeyConstans { /** * 存储预警类型编码与名称的对应关系 * 初始化时执行0 */ public static String DISTKEY = "SSCVHB:DISTLIST:ALARM"; /** * 存储预警类型编码与父类名称的对应关系 * 初始化时执行0 */ public static String DISTPARENTKEY = "SSCVHB:DISTLIST:PARENT:ALARM"; }
3.2设置RedisConfig
在cache文件夹下定义RedisConfig.java文件
package com.hikvision.isc.common.cache;import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.ObjectMapper;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.RedisTemplate;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;@Configurationpublic class RedisConfig {/* @Bean public JedisConnectionFactory redisConnectionFactory() { RedisStandaloneConfiguration config = new RedisStandaloneConfiguration(host, port); config.setPassword(password); return new JedisConnectionFactory(config); }*/ @Bean @SuppressWarnings("all") public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) { RedisTemplate<String, Object> template = new RedisTemplate<String, Object>(); template.setConnectionFactory(factory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // key采纳String的序列化形式 template.setKeySerializer(stringRedisSerializer); // hash的key也采纳String的序列化形式 template.setHashKeySerializer(stringRedisSerializer); // value序列化形式采纳jackson template.setValueSerializer(jackson2JsonRedisSerializer); // hash的value序列化形式采纳jackson template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; }}
3.3 定义Redis的set、get等办法
在cache文件夹下定义RedisUtils.java文件
package com.hikvision.isc.common.cache;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.redis.core.*;import org.springframework.stereotype.Service;import java.io.Serializable;import java.util.List;import java.util.Map;import java.util.Set;import java.util.concurrent.TimeUnit;@Servicepublic class RedisUtils { private static final Logger logger = LoggerFactory.getLogger(RedisUtils.class); @Autowired private RedisTemplate redisTemplate; /** * 获取所有key */ public Set<String> getKeyAll() { Set<String> keySet = redisTemplate.keys("*"); return keySet; } /** * 含糊搜寻key */ public Set<String> getKey(String key) { String s = "*" + key + "*"; Set<String> keySet = redisTemplate.keys(s); return keySet; } /** * 写入缓存 * * @param key * @param value * @return */ public boolean set(final String key, Object value) { boolean result = false; try { ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); operations.set(key, value); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * 写入缓存设置时效工夫 * key过期后,再获取key就是null * * @param key * @param value * @return */ public boolean set(final String key, Object value, Long expireTime, TimeUnit timeUnit) { boolean result = false; try { ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); operations.set(key, value); redisTemplate.expire(key, expireTime, timeUnit); result = true; } catch (Exception e) { e.printStackTrace(); } return result; } /** * 设置key的过期工夫 */ public void expireKey(String key, Long l, TimeUnit timeUnit) { redisTemplate.expire(key, l, timeUnit); } /** * 批量删除对应的value * * @param keys */ public void remove(final String... keys) { for (String key : keys) { remove(key); } } /** * 批量删除key * * @param pattern */ public void removePattern(final String pattern) { Set<Serializable> keys = redisTemplate.keys(pattern); if (keys.size() > 0) { redisTemplate.delete(keys); } } /** * 删除对应的value * * @param key */ public void remove(final String key) { logger.info("redis删除key:{}", key); if (exists(key)) { redisTemplate.delete(key); } } /** * 判断缓存中是否有对应的value * * @param key * @return */ public boolean exists(final String key) { return redisTemplate.hasKey(key); } /** * 断缓存中是否有对应的filed */ public boolean hexists(final String key, String field) { return redisTemplate.opsForHash().hasKey(key, field); } /** * 读取缓存 * * @param key * @return */ public Object get(final String key) { Object result = null; ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue(); result = operations.get(key); return result; } /** * 哈希 增加 * * @param key * @param hashKey * @param value */ public void hmSet(String key, Object hashKey, Object value) { HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); hash.put(key, hashKey, value); } public void hmSet(String key, Object hashKey, Object value, Long expireTime, TimeUnit timeUnit) { HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); hash.put(key, hashKey, value); redisTemplate.expire(key, expireTime, timeUnit); } /** * 哈希获取数据 * * @param key * @param hashKey * @return */ public Object hmGet(String key, Object hashKey) { HashOperations<String, Object, Object> hash = redisTemplate.opsForHash(); return hash.get(key, hashKey); } /** * 获取hashKey对应的所有键值 */ public Map<String, String> hmGetMap(String key) { Map<String, String> map = redisTemplate.opsForHash().entries(key); return map; } /** * 列表增加,单个元素增加 * * @param k * @param v */ public void lPush(String k, Object v) { ListOperations<String, Object> list = redisTemplate.opsForList(); list.rightPush(k, v); } /** * 列表取出,单个元素取出 * 应用办法时,redis会同步删除汇合中的数据 * @param k * */ public Object lPop(String k) { ListOperations<String, Object> list = redisTemplate.opsForList(); return list.leftPop(k); } /** * 列表获取 * * @param k * @param l * @param l1 * @return */ public List<Object> lRange(String k, long l, long l1) { ListOperations<String, Object> list = redisTemplate.opsForList(); return list.range(k, l, l1); } /** * 汇合增加 * * @param key * @param value */ public void add(String key, Object value) { SetOperations<String, Object> set = redisTemplate.opsForSet(); set.add(key, value); } /** * 汇合获取 * * @param key * @return */ public Set<Object> setMembers(String key) { SetOperations<String, Object> set = redisTemplate.opsForSet(); return set.members(key); } /** * 有序汇合增加 * * @param key * @param value * @param scoure */ public void zAdd(String key, Object value, double scoure) { ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); zset.add(key, value, scoure); } /** * 有序汇合获取 * * @param key * @param scoure * @param scoure1 * @return */ public Set<Object> rangeByScore(String key, double scoure, double scoure1) { ZSetOperations<String, Object> zset = redisTemplate.opsForZSet(); return zset.rangeByScore(key, scoure, scoure1); }}
4.将数据存入Redis缓存中
在service.impl下创立RedisDictInfoImpl.java
实现将数据库获取到的数据存入Redis缓存中
(数据库获取数据通过实体类和mapper即可)
package com.hikvision.isc.module.business.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;import com.hikvision.isc.common.cache.KeyConstans;import com.hikvision.isc.common.cache.RedisUtils;import com.hikvision.isc.module.business.entity.ibuilding.DictInfo;import com.hikvision.isc.module.business.mapper.DictInfoMapper;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import org.springframework.util.StringUtils;import java.util.List;/** * 存储预警类型编码与名称的对应关系 * 存储预警类型编码与父类名称的对应关系 */@Servicepublic class RedisDictInfoImpl { @Autowired private RedisUtils redisUtils; @Autowired private DictInfoMapper dictInfoMapper; /**增加到redis中*/ public void cacheDict(){ //从数据库获取须要存入Redis缓存的数据 QueryWrapper wrapper = new QueryWrapper(); List<DictInfo> list = dictInfoMapper.selectList(wrapper); //遍历list,存入缓存——存储预警类型编码与名称的对应关系 list.forEach(l->{ if ("业余施工人员".equals(l.getDictName())){ l.setDictName("施工人员"); } //调用hmSet办法将每一条对象存入存入KeyConstans.DISTKEY中 redisUtils.hmSet(KeyConstans.DISTKEY, l.getDictCode(), l.getDictName()); }); redisUtils.hmSet(KeyConstans.DISTKEY, "0", "失常"); /** * 存储预警类型编码与父类名称的对应关系 */ list.forEach(l1->{ if (StringUtils.isEmpty(l1.getParentCode())){ //如果父级编码为null,就将编码和编码名称存入KeyConstans.DISTPARENTKEY中 redisUtils.hmSet(KeyConstans.DISTPARENTKEY, l1.getDictCode(), l1.getDictName()); }else { //如果父级不为空,将父级编码名称与编码名称拼接存入KeyConstans.DISTPARENTKEY中 String name = "-" + l1.getDictName(); String parentName = (String) redisUtils.hmGet(KeyConstans.DISTKEY, l1.getParentCode()); redisUtils.hmSet(KeyConstans.DISTPARENTKEY, l1.getDictCode(), parentName + name); } }); }}
5.创立定时工作
在business文件夹下创立init文件夹
5.1 创立定时工作治理类
在init文件夹下创立:TaskManager.java文件
应用注解:
@Component
@EnableScheduling
package com.hikvision.isc.module.business.init;import com.hikvision.isc.module.business.service.impl.RedisDictInfoImpl;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.scheduling.annotation.EnableScheduling;import org.springframework.scheduling.annotation.Scheduled;import org.springframework.stereotype.Component;import java.util.Date;@Component@EnableSchedulingpublic class TaskManager { private static Logger logger = LoggerFactory.getLogger(TaskManager.class); //注入具体实现缓存的实现类 @Autowired private RedisDictInfoImpl redisDictInfo; @Scheduled(cron = "自定义执行工夫") public void syncAlarmCodeAndName(){ try { //调用具体方法将数据写入缓存 redisDictInfo.cacheDict(); }catch (Exception e){ logger.error("定时工作执行异样"+new Date(),e); } }}
5.2 定义定时工作启动类
在init文件夹下创立:InitTask.java,实现CommandLineRunner,重写run办法
package com.hikvision.isc.module.business.init;import com.hikvision.isc.module.business.service.impl.RedisDictInfoImpl;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.CommandLineRunner;import org.springframework.stereotype.Component;@Componentpublic class InitTask implements CommandLineRunner { @Autowired private TaskManager taskManager; @Override public void run(String... args) throws Exception { //我的项目启动时进行缓存 taskManager.syncAlarmCodeAndName(); }}
6.设置启动类
在启动类上增加注解:
@EnableScheduling
7.编写测试Controller进行测试
在business下创立controller文件夹,创立TestController.java文件
调用RedisUtils类的hmGet办法传入指定key,获取缓存中的value
package com.hikvision.isc.module.business.controller;import com.hikvision.isc.common.cache.KeyConstans;import com.hikvision.isc.common.cache.RedisUtils;import io.swagger.annotations.Api;import io.swagger.annotations.ApiOperation;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestMethod;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;@RestController@Api(tags = {"测试接口"})public class TestController { @Autowired private RedisUtils redisUtils; @ApiOperation("依据预警编码获取redis缓存中的预警名称") @RequestMapping(value = "/getDictName", method = RequestMethod.GET) public Object getDictName(@RequestParam String dictCode) { return redisUtils.hmGet(KeyConstans.DISTKEY, dictCode); }}
8. 运行我的项目
运行我的项目测试: