Springboot 与 Redis 集成 简易Redis工具类实现

最近项目需要处理一项数据量比较大的业务,考虑之下,高频访问/读取决定使用Redis.自己的Springboot框架下研究了Redis两天,把成果总结一下

开发环境介绍
JDK1.7
Redis
基础依赖

org.mybatis.spring.boot
mybatis-spring-boot-starter
1.3.1


org.springframework.boot
spring-boot-starter-data-redis

Redis配置
省略部分内容的application.yml, 都是默认配置,可以没有. 同时也可以在这里配置超时时间 最大连接 等属性,可以考虑参照其他网络博客

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辅助类
根据分层思想,对Redis数据库的操作属于Dao层,不应该直接在Service操作数据, 而Redis是否有ORM框架我也不太清楚,所以为方便操作Redis数据库,封装了RedisDBHelper方便操作,先上接口

/**

  • 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 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 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的实例,按需求定义泛型即可

@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);
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值