《深入实践Spring Boot》一2.2 使用Redis

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

本节书摘来自华章出版社《深入实践Spring Boot》一书中的第2章,第2.2节,作者陈韶健,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

2.2 使用Redis

关系型数据库在性能上总是存在一些这样那样的缺陷,所以大家有时候在使用传统关系型数据库时,会与具有高效存取功能的缓存系统结合使用,以提高系统的访问性能。在很多流行的缓存系统中,Redis是一个不错的选择。Redis是一种可以持久存储的缓存系统,是一个高性能的key-value数据库,它使用键-值对的方式来存储数据。

2.2.1 Redis依赖配置

需要使用Redis,可在工程的Maven配置中加入spring-boot-starter-redis依赖,如代码清单2-9所示。其中gson是用来转换Json数据格式的工具,mysql是引用了上一节的模块,这里使用2.1节定义的实体对象来存取数据,演示在Redis中的存取操作。
代码清单2-9 Redis模块的Maven依赖配置

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-redis</artifactId>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.2.4</version>
    </dependency>
    <dependency>
        <groupId>springboot.db</groupId>
        <artifactId>mysql</artifactId>
        <version>${project.version}</version>
    </dependency>
</dependencies>

2.2.2 创建Redis服务类

Redis提供了下列几种数据类型可供存取:
string;
hash;
list;
set及zset。

在实例中,将使用string即字符串的类型来演示数据的存取操作。对于Redis,Spring Boot没有提供像JPA那样相应的资源库接口,所以只能仿照上一节中Repository的定义编写一个实体User的服务类,如代码清单2-10所示。这个服务类可以存取对象User以及由User组成的列表List,同时还提供了一个删除的方法。所有这些方法都是使用RedisTemplate来实现的。
代码清单2-10 用户实体的Redis服务类
@Repository
public class UserRedis {

@Autowired
private RedisTemplate<String, String> redisTemplate;

public void add(String key, Long time,User user) {
    Gson gson = new Gson();
    redisTemplate.opsForValue().set(key, gson.toJson(user), time, TimeUnit.

MINUTES);

}

public void add(String key, Long time, List<User> users) {
    Gson gson = new Gson();
    redisTemplate.opsForValue().set(key, gson.toJson(users), time, TimeUnit.

MINUTES);

}

public User get(String key) {
    Gson gson = new Gson();
    User user = null;
    String userJson = redisTemplate.opsForValue().get(key);
    if(!StringUtils.isEmpty(userJson))
        user = gson.fromJson(userJson, User.class);
    return user;
}

public List<User> getList(String key) {
    Gson gson = new Gson();
    List<User> ts = null;
    String listJson = redisTemplate.opsForValue().get(key);
    if(!StringUtils.isEmpty(listJson))
        ts = gson.fromJson(listJson, new TypeToken<List<User>>(){}.getType());
    return ts;
}

public void delete(String key){
    redisTemplate.opsForValue().getOperations().delete(key);
}

}
Redis没有表结构的概念,所以要实现MySQL数据库中表的数据(即普通Java对象映射的实体数据)在Redis中存取,必须做一些转换,使用JSON格式的文本作为Redis与Java普通对象互相交换数据的存储格式。这里使用Gson工具将类对象转换为JSON格式的文本进行存储,要取出数据时,再将JSON文本数据转化为Java对象。
因为Redis使用了key-value的方式存储数据,所以存入时要生成一个唯一的key,而要查询或者删除数据时,就可以使用这个唯一的key进行相应的操作。
保存在Redis数据库中的数据默认是永久存储的,可以指定一个时限来确定数据的生命周期,超过指定时限的数据将被Redis自动清除。在代码清单2-10中我们以分钟为单位设定了数据的存储期限。
另外,为了能正确调用RedisTemplate,必须对其进行一些初始化工作,即主要对它存取的字符串进行一个JSON格式的系列化初始配置,如代码清单2-11所示。
代码清单2-11 RedisTemplate初始化
@Configuration
public class RedisConfig {

@Bean
public RedisTemplate<String, String> redisTemplate(
        RedisConnectionFactory factory) {
    StringRedisTemplate template = new StringRedisTemplate(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);
    template.setValueSerializer(jackson2JsonRedisSerializer);
    template.afterPropertiesSet();
    return template;
}

}

2.2.3 Redis测试

如果还没有安装Redis服务器,可以参照本书附录C提供的方法安装,然后在工程的配置文件application.yml中配置连接Redis服务器等参数,如代码清单2-12所示。其中host和port分别表示Redis数据库服务器的IP地址和开放端口,database可以不用指定,由Redis根据存储情况自动选定(注:测试时这些配置是集成在一个配置类中实现的)。
代码清单2-12 Redis配置
spring:

redis:
# database: 1
    host: 192.168.1.214
    port: 6379
    pool:
        max-idle: 8
        min-idle: 0
        max-active: 8
        max-wait: -1

现在编写一个JUint测试程序,来演示如何在Redis服务器中存取数据,如代码清单2-13所示。测试程序创建一个部门对象并将其命名为“开发部”,创建一个角色对象并把它命名为admin,创建一个用户对象并把它命名为user,同时设定这个用户属于“开发部”,并把admin这个角色分配给这个用户。接着测试程序使用类名等参数生成一个key,并使用这个key清空原来的数据,然后用这个key存储现在这个用户的数据,最后使用这个key查询用户,并将查到的信息打印出来。
代码清单2-13 Redis测试程序

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = {RedisConfig.class, UserRedis.class})
public class RedisTest {
    private static Logger logger = LoggerFactory.getLogger(RedisTest.class);

    @Autowired
    UserRedis userRedis;
@Before
public void setup(){
    Deparment deparment = new Deparment();
    deparment.setName("开发部");

    Role role = new Role();
    role.setName("admin");

    User user = new User();
    user.setName("user");
    user.setCreatedate(new Date());
    user.setDeparment(deparment);

    List<Role> roles = new ArrayList<>();
    roles.add(role);

    user.setRoles(roles);

    userRedis.delete(this.getClass().getName()+":userByname:"+user.getName());
    userRedis.add(this.getClass().getName()+":userByname:"+user.getName(), 10L, user);

}

@Test
public void get(){
    User user = userRedis.get(this.getClass().getName()+":userByname:
user");
        Assert.notNull(user);
        logger.info("======user====== name:{}, deparment:{}, role:{}",
            user.getName(), user.getDeparment().getName(), user.getRoles().get(0).
getName());
    }
}

要运行这个测试程序,可以在IDEA的Run/Debug Conf?iguration配置中增加一个JUint配置项目,模块选择redis,工作目录选择模块所在的根目录,类选择这个测试程序即dbdemo.redis.test.RedisTest,并将配置保存为redistest。
使用Debug方式运行测试项目redistest。如果测试通过,会输出一个用户的用户名、所属部门和拥有角色等简要信息,如下所示:
dbdemo.redis.test.RedisTest - ======user====== name:user, deparment:开发部, role:admin
对于Redis的使用,还可以将注解方式与调用数据库的方法相结合,那样就不用再编写像上面那样的服务类,并且使用起来更加简单,这将在后面的章节中介绍。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
23天前
|
NoSQL Java Redis
SpringBoot集成Redis解决表单重复提交接口幂等(亲测可用)
SpringBoot集成Redis解决表单重复提交接口幂等(亲测可用)
215 0
|
27天前
|
Java 应用服务中间件 Maven
SpringBoot 项目瘦身指南
SpringBoot 项目瘦身指南
41 0
|
1月前
|
消息中间件 NoSQL Java
springboot redis 实现消息队列
springboot redis 实现消息队列
39 1
|
28天前
|
NoSQL Java Redis
SpringBoot集成Redis
SpringBoot集成Redis
356 0
|
6天前
|
NoSQL 数据可视化 Java
Springboot整合redis
Springboot整合redis
|
6天前
|
安全 Java 应用服务中间件
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
24 0
江帅帅:Spring Boot 底层级探索系列 03 - 简单配置
|
7天前
|
人工智能 前端开发 Java
Java语言开发的AI智慧导诊系统源码springboot+redis 3D互联网智导诊系统源码
智慧导诊解决盲目就诊问题,减轻分诊工作压力。降低挂错号比例,优化就诊流程,有效提高线上线下医疗机构接诊效率。可通过人体画像选择症状部位,了解对应病症信息和推荐就医科室。
129 10
|
9天前
|
XML Java C++
【Spring系列】Sping VS Sping Boot区别与联系
【4月更文挑战第2天】Spring系列第一课:Spring Boot 能力介绍及简单实践
【Spring系列】Sping VS Sping Boot区别与联系
|
11天前
|
监控 Java 数据库连接
Spring高手之路17——动态代理的艺术与实践
本文深入分析了JDK和CGLIB两种动态代理技术在Spring框架中的应用。讨论了动态代理的基础概念,通过实例展示了如何实现和应用这两种方法,并比较了它们的性能差异及适用场景。进一步,探讨了在动态代理中实现熔断限流和日志监控的策略,以及如何利用动态代理优化Spring应用的设计和功能。
27 6
Spring高手之路17——动态代理的艺术与实践
|
16天前
|
NoSQL Java Redis
Springboot整合redis
Springboot整合redis