SpringBoot开发详解(十一) -- Redis在SpringBoot中的整合

各位小伙伴,好久不见。最近一直都没有更新,因为公司的项目一直在抓进度,又是表结构更替,又是重构,还要迭代需求。感觉项目都快做烂了……所以一个公司的好坏真的和领导者有极大的关系,许多程序员真的只是三年程序员,谢三年代码就去转岗管理了,最后导致技术水平有限,管理水平又跟不上。好,我废话少说,开始这次的内容,这次我们聊一下NoSql数据库Redis在SpringBoot中的使用。

Redis在Spring Boot中的集成

Maven依赖引入:

Redis是一个基于内存的日志型可持久化的缓存数据库,保存形式为key-value格式。还不清楚的小伙伴可以先学习一下,Redis在现在的开发中可是很常用的哦。

首先,我们先在maven中引入相关依赖:

<!--redis依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

之后我们把Redis的相关配置写入yml,这里建议根据之前不同的环境写入不同的配置,Redis默认使用的端口是6379,通常Redis默认使用0号数据库,默认共有16个数据库:

#redis配置
  redis:
#  数据库索引
    database: 0
#    服务器地址
    host: 127.0.0.1
#    服务器连接端口
    port: 6379
#    链接密码
    password:
#    链接池
    pool:
#    最大连接数(负值表示没有限制)
      max-active: 8
#      最大阻塞等待时间(负值表示没有限制)
      max-wait: 1
#      最大空闲链接
      max-idle: 8
#      最小空闲链接
      min-idle: 0
#    链接超时时间(毫秒)
    timeout: 0

此时,我们已经完成了Redis的所有配置,可以直接来使用了,我们写一个测试用例来测试一下:

@SpringBootTest
@RunWith(SpringJUnit4ClassRunner.class)
public class RedisAutoTest {

    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    public void save(){

        stringRedisTemplate.opsForValue().set("zzp","big z");
        Assert.assertEquals("big z",stringRedisTemplate.opsForValue().get("zzp"));
    }
}

这里写图片描述
OK,没有问题,同样的我们使用rdm打开看下是否成功存入了。

这里写图片描述

OK,也没有任何问题。
在这个测试用例中我们使用的StringRedisTemplate,因为我们之前说过redis使用key-value格式保存数据,这里其实保存的就是

public class UserInfo implements Serializable{

    private static final long serialVersionUID = 1L;

    private String tel;

    private String nickName;

    @Max(value = 999999,message = "超过最大数值")
    @Min(value = 000000,message = "密码设定不正确")
    private String passWord;

    public UserInfo() {
    }

    @Override
    public String toString() {
        return "UserInfo{" +
                "tel='" + tel + '\'' +
                ", nickName='" + nickName + '\'' +
                ", passWord='" + passWord + '\'' +
                '}';
    }

    public UserInfo(String tel, String nickName, String passWord) {
        this.tel = tel;
        this.nickName = nickName;
        this.passWord = passWord;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public String getNickName() {
        return nickName;
    }

    public void setNickName(String nickName) {
        this.nickName = nickName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }
}

然后我们驶向下序列化接口:

public class RedisObjectSerializer implements RedisSerializer<Object> {

    private Converter<Object,byte[]> serializer = new SerializingConverter();
    private Converter<byte[],Object> deserializer = new DeserializingConverter();

    static final byte[] EMPTY_ARRAY = new byte[0];


    @Override
    public byte[] serialize(Object o) throws SerializationException {

        if(o == null){
            return EMPTY_ARRAY;
        }

        try {
            return serializer.convert(o);
        }catch (Exception e){
            return EMPTY_ARRAY;
        }
    }

    @Override
    public Object deserialize(byte[] bytes) throws SerializationException {
        if(isEmpty(bytes)){
            return null;
        }
        try {
            return deserializer.convert(bytes);
        }catch (Exception e){
            throw new SerializationException("Can not deserializer",e);
        }

    }

    private boolean isEmpty(byte[] data){

        return (data == null || data.length == 0);
    }
}

之后我们在将RedisTemplate重新配置下,使用我们自己的序列化对象:

@Configuration
public class RedisConfig {

    @Bean
    JedisConnectionFactory jedisConnectionFactory(){
        return  new JedisConnectionFactory();
    }

    /**
     * 存入对象序列化信息
     * @return
     */
    @Bean
    public RedisTemplate<String,UserInfo> redisSerizlizerObj(){
        RedisTemplate<String,UserInfo> redisTemplate = new RedisTemplate<String,UserInfo>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory());
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.setValueSerializer(new RedisObjectSerializer());
        return redisTemplate;
    }
}

完成该工作后,我们可以继续写测试用例来验证我们的相关配置了

 @Autowired
 private RedisTemplate<String,UserInfo> Template;

 @Test
 public void testobjSerializer() throws InterruptedException {
        UserInfo user = new UserInfo("111111","snow","112358");
        Template.opsForValue().set("User:snow",user);
        Assert.assertEquals(true,redisTemplate.hasKey("User:snow"));
    }

测试结果一切正常,我们同样通过rdm可以看到我们所存入的序列化对象:

这里写图片描述

这里写图片描述

但是,将每一个对象都写一个RedisTemplate未免太过麻烦,其实我们开发中,会存入对象的toString方法。所以我将存入对象ToString方法的代码页给到大家,大家可以根据自己的需要来使用:

    /**
     * 存入对象tostring后的信息
     * @return
     */
    @Bean
   public RedisTemplate<String,String> redisTemplate(){
        RedisTemplate<String,String> redisTemplate = new StringRedisTemplate();
        redisTemplate.setConnectionFactory(jedisConnectionFactory());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);
        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

同样通过测试用例来验证可以发现,可以使用:

    @Test
    public void testobj() throws InterruptedException {
        UserInfo user = new UserInfo("15201803745","snow","112358");
        ValueOperations<String,UserInfo> operations = redisTemplate.opsForValue();
        operations.set("User:zzp",user);
        Thread.sleep(1000);
        operations.set("User:zzq",user);
        Thread.sleep(1000);
        Assert.assertEquals(true,redisTemplate.hasKey("User:zzp"));
        Assert.assertEquals(true,redisTemplate.hasKey("User:zzq"));
    }

这里写图片描述

这里写图片描述

Redis的使用其实远远不止这些,包括事物等都是可以通过Redis处理的。一般开发中我们会使用Jedis对Redis进行操作,可是由于这时介绍Redis在SpringBoot中集成的,所以就不再多言了,如果有想知道的小伙伴可以告诉我,我在来说说如何使用Jedis操作。

以上所有的代码我已经上传到GitHub

round1-springboot

如果心急的小伙伴也可以去clone我已经完成的项目,这个项目中把一些常用功能都写了,并且都写注释啦!!!也希望大家能帮我点个赞哦~~~

MySpringBoot

  • 12
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值