spring boot 整合redis

1.简介

spring boot提供了spring-data-redis库来整合redis的操作,并通过简单的配置信息实现与redis的整合。

2.准备工作

安装redis缓存数据库,安装可视化工具,推荐使用:rdm。

3.redis简介

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API

3.1 redis优点

Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。
  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
    丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

3.2 redis缺点

缺点:

  1. redis不具备自动容错和恢复功能,主机从机的宕机都会导致前端部分读写请求失败,需要等待机器重启或者手动切换前端的IP才能恢复。
  2. 主机宕机,宕机前有部分数据未能及时同步到从机,切换IP后还会引入数据不一致的问题,降低了系统的可用性。
  3. redis的主从复制采用全量复制,复制过程中主机会fork出一个子进程对内存做一份快照,并将子进程的内存快照保存为文件发送给从机,这一过程需要确保主机有足够多的空余内存。若快照文件较大,对集群的服务能力会产生较大的影响,而且复制过程是在从机新加入集群或者从机和主机网络断开重连时都会进行,也就是网络波动都会造成主机和从机间的一次全量的数据复制,这对实际的系统运营造成了不小的麻烦。
  4. redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。为避免这一问题,运维人员在系统上线时必须确保有足够的空间,这对资源造成了很大的浪费。

4.代码实例

4.1 maven依赖

版本号会依赖spring-boot-parent版本号

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-data-redisartifactId>
        dependency>

4.2 yml配置文件

spring:  
  redis:
    database: 0 #redis数据库索引,默认为0,如果选择1,则数据存放在select 1中
    host: localhost #redis服务器IP地址,默认为localhost
    port: 6379 #redis进程使用端口号,默认为6379
    password: #密码默认为空
    pool:
      max-active: 8 #连接池最大连接数
      max-wait: -1 #连接池最大阻塞等待时间 -1表示没有限制,单位毫秒
      max-idle: 8 #连接池最大空闲连接数
      min-idle: 0 #连接池最小空闲连接数
    timeout: 0 #访问超时时间
    ssl: false #不开启ssl认证
    url:
    #集群配置#
#    cluster:
#      nodes:
#        - 10.1.1.1
#        - 10.1.1.2
#      max-redirects: 6 #执行失败之后的重试次数
    #哨兵#
#    sentinel:
#      master: master #哨兵监听的Redis server的名称
#      nodes: 127.0.0.1:26378,127.0.0.1:26479 #哨兵的配置列表

4.3 代码测试

配置完以上信息之后,与redis的单机配置算是粗略完成了,让我们简单写一个接口测试一下试试:

package com.god.redis;

import com.god.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;

/**
 * Created by wujiaqi on 18/2/11.
 */
@Path(value = "redis")
public class RedisController {

    @Autowired
    StringRedisTemplate stringRedisTemplate;

    @Autowired
    private RedisTemplate redisTemplate;

    @Path("save")
    @PUT
    @Consumes
    public void save() {
        stringRedisTemplate.opsForValue().set("用户", "小明");
        // 保存对象
        User user = new User("钢铁侠", "钢铁侠");
        redisTemplate.opsForValue().set(user.getUsername(), user);

        user = new User("美国队长", "美国队长");
        redisTemplate.opsForValue().set(user.getUsername(), user);

        user = new User("斯嘉丽", "斯嘉丽");
        redisTemplate.opsForValue().set(user.getUsername(), user);
    }

    @Path("delete")
    @DELETE
    @Consumes
    public void delete() {
        stringRedisTemplate.delete("用户");
        // 保存对象
        User user = new User("钢铁侠", "超人");
        redisTemplate.delete(user.getUsername());

        user = new User("美国队长", "美国队长");
        redisTemplate.delete(user.getUsername());

        user = new User("斯嘉丽", "斯嘉丽");
        redisTemplate.delete(user.getUsername());
    }
}

代码如上,运行一下代码看一下结果。
spring boot 整合redis_第1张图片
我们可以看到生成了4跳结果,对于string存储类型的能够正常显示,而对于对象类型的则保存为hex数据类型,那么怎么改变我们保存的数据类型呢?
这里需要设置redisTemplate的序列化方式,来看一下代码:

@Component
public class RedisConfig {

    /**
     * redisTemplate 默认使用jdkSerializeable进行序列化,存储二进制字节码
     * @param jedisConnectionFactory
     * @return
     */
    @Bean
    public  RedisTemplate redisTemplate(JedisConnectionFactory jedisConnectionFactory) {
        RedisTemplate redisTemplate = new RedisTemplate<>();
        redisTemplate.setConnectionFactory(jedisConnectionFactory);
        //这里使用Jackson2JsonRedisSerializer 替代默认的序列化
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        //xml序列化,速度慢,占用空间大
//        OxmSerializer oxmSerializer = new OxmSerializer();
        //jdk序列化,速度快,但是暂用空间大,并且序列化对象必须实现java.io.Serializable接口,redis默认采用jdk序列化
//        JdkSerializationRedisSerializer jdkSerializationRedisSerializer = new JdkSerializationRedisSerializer();


        redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//设置value的序列化类型为json类型
        redisTemplate.setKeySerializer(new StringRedisSerializer());//设置key的序列化类型为String类型,key类型只能为String类型
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }


}

上面使用了jackson的序列化方式,运行一下看一下结果:
spring boot 整合redis_第2张图片
我们可以看到存储的数据已经是json类型了。
以上就是一个spring boot与redis单节点的简单集成了。更多的redis操作就不在这里展示了,后续在redis的学习篇中详细讲解。

你可能感兴趣的:(spring-boot,java,spring,boot,教程)