最近项目须要处理一项数据量比较大的业务,考虑之下,高频访问/读取决定使用Redis.本身的Springboot框架下研究了Redis两天,把成果总结一下redis
<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>1.3.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
省略部份内容的application.yml, 都是默认配置,能够没有. 同时也能够在这里配置超时时间 最大链接 等属性,能够考虑参照其余网络博客spring
server: redis: host: localhost # 162上面的Redis port: 6379 password:
建立RedisConfig,用来配置一些自定义内容.我配置的比较简略,只注册了一个按JDK序列化数据的RedisTemplate数据库
@Configuration public class RedisConfig extends CachingConfigurerSupport{ /** * 注入 RedisConnectionFactory */ @Autowired RedisConnectionFactory redisConnectionFactory; /** * 实例化 RedisTemplate 对象 * Primary 在autoware时优先选用我注册的bean. * 由于在redis框架中有注册一个StringRedisTemplate,避免注入冲突 * @return */ @Bean @Primary public RedisTemplate<String, Object> functionDomainRedisTemplate() { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); initDomainRedisTemplate(redisTemplate, redisConnectionFactory); return redisTemplate; } /** * 设置数据存入 redis 的序列化方式 * * @param redisTemplate * @param factory */ private void initDomainRedisTemplate(RedisTemplate<String, Object> redisTemplate, RedisConnectionFactory factory) { redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setHashKeySerializer(new StringRedisSerializer()); redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.setConnectionFactory(factory); } }
Springboot倡导开箱即用,这个Redis依赖很符合这个理念,事实上,即便你不作任何配置,依旧能够正常链接.数组
最后,在springboot主类上添加@EnableCaching,启用缓存管理,这个不能省略缓存
@EnableCaching class Application { static void main(String[] args) { SpringApplication.run (Application.class , args) } }
根据分层思想,对Redis数据库的操做属于Dao层,不该该直接在Service操做数据, 而Redis是否有ORM框架我也不太清楚,因此为方便操做Redis数据库,封装了RedisDBHelper方便操做,先上接口springboot
/** * K 指以hash结构操做时 键类型 * T 为数据实体 应实现序列化接口,并定义serialVersionUID * RedisTemplate 提供了五种数据结构操做类型 hash / list / set / zset / value * 方法命名格式为 数据操做类型 + 操做 如 hashPut 指以hash结构(也就是map)想key添加键值对 * Created by hp on 2018/3/1. */ public interface RedisDBHelper<HK, T> { /** * Hash结构 添加元素 * @param key key * @param hashKey hashKey * @param domain 元素 */ void hashPut(String key, HK hashKey,T domain); /** * Hash结构 获取指定key全部键值对 * @param key * @return */ Map< HK, T> hashFindAll(String key); /** * Hash结构 获取单个元素 * @param key * @param hashKey * @return */ T hashGet(String key,HK hashKey); void hashRemove(String key, HK hashKey); /** * List结构 向尾部(Right)添加元素 * @param key * @param domain * @return */ Long listPush(String key, T domain); /** * List结构 向头部(Left)添加元素 * @param key * @param domain * @return */ Long listUnshift(String key, T domain); /** * List结构 获取全部元素 * @param key * @return */ List<T> listFindAll(String key); /** * List结构 移除并获取数组第一个元素 * @param key * @return */ T listLPop(String key); void remove(String key); /** * 设置过时时间 * @param key 键 * @param timeout 时间 * @param timeUnit 时间单位 */ boolean expirse(String key, long timeout, TimeUnit timeUnit); }
这里我只根据我目前的业务须要添加了几个接口, 若有其它须要能够自行添加并实现.对这个接口我提供了简单的实现服务器
/** * 接口的简单实现 * Created by hp on 2018/3/1. */ @Service("RedisDBHelper") public class RedisDBHelperImpl<HK, T> implements RedisDBHelper<HK, T>{ // 在构造器中获取redisTemplate实例, key(not hashKey) 默认使用String类型 private RedisTemplate<String, T> redisTemplate; // 在构造器中经过redisTemplate的工厂方法实例化操做对象 private HashOperations<String, HK, T> hashOperations; private ListOperations<String, T> listOperations; private ZSetOperations<String, T> zSetOperations; private SetOperations<String, T> setOperations; private ValueOperations<String, T> valueOperations; // IDEA虽然报错,可是依然能够注入成功, 实例化操做对象后就能够直接调用方法操做Redis数据库 @Autowired public RedisDBHelperImpl (RedisTemplate<String, T> redisTemplate) { this.redisTemplate = redisTemplate; this.hashOperations = redisTemplate.opsForHash(); this.listOperations = redisTemplate.opsForList(); this.zSetOperations = redisTemplate.opsForZSet(); this.setOperations = redisTemplate.opsForSet(); this.valueOperations = redisTemplate.opsForValue(); } @Override public void hashPut(String key, HK hashKey, T domain) { hashOperations.put(key, hashKey, domain); } @Override public Map<HK, T> hashFindAll(String key) { return hashOperations.entries(key); } @Override public T hashGet(String key, HK hashKey) { return hashOperations.get(key, hashKey); } @Override public void hashRemove(String key, HK hashKey) { hashOperations.delete(key, hashKey); } @Override public Long listPush(String key, T domain) { return listOperations.rightPush(key, domain); } @Override public Long listUnshift(String key, T domain) { return listOperations.leftPush(key, domain); } @Override public List<T> listFindAll(String key) { if (! redisTemplate.hasKey(key)){ return null; } return listOperations.range(key,0, listOperations.size(key)); } @Override public T listLPop(String key) { return listOperations.leftPop(key); } @Override public void remove(String key) { redisTemplate.delete(key); } @Override public boolean expire(String key, long timeout, TimeUnit timeUnit) { return redisTemplate.expire(key, timeout, timeUnit); } }
总体而言就是对Operations的简单封装,让本身可使用的更驾轻就熟一点.那么RedisDBHelper应该怎么使用呢?首先定义一个简单实体网络
public class Person implements Serializable { // 为了可以正确得序列化和反序列化,这个属性必不可少 private static final long serialVersionUID = - 1L; private String id; private String name; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } }
PersonServiceImpl超简易示例数据结构
使用方式就是直接autoware注入RedisDBHelper的实例,按需求定义泛型便可mybatis
@Service public class PersonServiceImpl implements PersonService{ @Autowired RedisDBHelper<String, Person> redisDBHelper; // 你能够理解为这个是表名 private static final String KEY= "PERSON_KEY"; /** * 储存一个Person到一个Map结构中 * @param person */ public void putPerson(Person person) { redisDBHelper.hashPut(KEY, person.getId(), person); } }
由于以上代码都是从项目代码中摘录出来的,因此没有作严格测试,本身在项目上,数据存删 50条/秒 基本没有什么问题,由于是远程其余redis服务器因此偶有Read time out.若是发现有什么问题欢迎反馈交流,谢谢!