Spring 集成 Reids(Spring-data-redis)

本文介绍如何在Spring框架中集成Redis,并通过示例展示基于Spring Data Redis的缓存操作实现,包括配置、CRUD操作及测试。

Redis

Redis(1)安装 & 配置

Redis(2)基本键值操作

Redis(3)常用维护操作

Redis(4)客户端连接:Java

Spring 集成 Reids(Spring-data-redis)


Spring 集成 Reids(Spring-data-redis)


如果要在 Spring 中集成 Redis,可以直接装载 Jedis 的 JedisPoolFactory ,需要自己封装 RedisRemplate,Spring 子项目 spring-data-reids 对 Redis 客户端提供高度的封装,可以很方便地调用 RedisTemplate;

Spring Data Redis 项目主页: http://projects.spring.io/spring-data-redis/


以下以一个简单的 Web 程序中经典的 CRUD 作为示例,完整示例代码地址:  https://gitee.com/assad/spring-data-redis_sample

构建依赖脚本 build.gradle
 
...
// 依赖部分
dependencies {
    //redis-jedis 依赖
    compile 'redis.clients:jedis:2.9.0'
    //spring-data-redis 依赖
    compile 'org.springframework.data:spring-data-redis:2.0.3.RELEASE'
    //spring core 依赖
    compile "org.springframework:spring-beans:4.3.14.RELEASE"
    compile "org.springframework:spring-core:4.3.14.RELEASE"
    compile "org.springframework:spring-context:4.3.14.RELEASE"
    //spring test 依赖
    compile "org.springframework:spring-test:4.3.14.RELEASE"
    testCompile "junit:junit:4.12"
    //log4j 依赖
    compile 'org.slf4j:slf4j-nop:1.7.25'
    compile "org.apache.logging.log4j:log4j-core:2.9.0"
    compile "org.apache.logging.log4j:log4j-api:2.9.0"
}
...

spring 上下文配置文件 applicationContext.xml
 
<?xml version="1.0" encoding="UTF-8"?>
<beans ...>
    <!--扫描bean-->
    <context:component-scan base-package="site.assad.service" />
    <context:component-scan base-package="site.assad.dao" />
    <!--配置 JedisPoolConfig -->
    <bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig"
          p:maxIdle="300"
          p:maxTotal="1000"
          p:maxWaitMillis="1000"
          p:testOnBorrow="true"
          p:testOnReturn="true"/>
    <!--配置 Jedis 连接对象-->
    <bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
          destroy-method="destroy"
          p:host-name="127.0.0.1"
          p:port="6379"
          p:password="assad"
          p:usePool="true"
          p:poolConfig-ref="jedisPoolConfig"/>
    <!--装配 RedisTemplate -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate"
          p:connectionFactory-ref="jedisConnectionFactory" />
</beans>

大概的业务流程如下:service 层的 UserService 通过 dao 层的 UserDao 层对 User 对象进行 CRUD 操作,在这个 CRUD 操作的基上进行 User 对象的缓存操作;

User 对象, site.assad.domian.User
 
package site.assad.domain;
public class User implements Serializable{
    private static final long serialVersionUID = 23333L;
    private int id;
    private String name;
    private String password;
    private String icon;
    // getter,setter,toString,constructor
}

缓存操作主要是在 service 层上面的,service 对象, site.assad.service.UserService
 
package site.assad.service;
@Service
public class UserService {
    
    @Autowired
    private UserDao userDao;
    //自动注入 RedisTemplate 对象
    @Autowired
    private RedisTemplate<String,Object> redisTemplate;
    private final static Logger log = LogManager.getLogger();
    //获取 user
    public User getUser(int userId) {
        //当 redis 缓存中存在 user,返回该 user
        User userCache = (User) redisTemplate.opsForValue().get(userId+"");
        if (userCache != null)
            return userCache;
        //当 redis 缓存中不存在 user,从数据库中获取 redis ,同时将 user 写入缓存
        log.info("real query user from DB");
        User user = userDao.getUserById(userId);
        if(user != null )
            redisTemplate.opsForValue().set(user.getId()+"",user);
        return user;
    }
    //将 userId 对应的 User 从缓存中删除
    public void removeUserFromCache(int userId){
        //缓存中删除 user
        redisTemplate.delete(userId+"");
        log.info("remove user "+ userId + " from cache");
    }
    //删除 user
    public void removeUser(int userId){
        removeUserFromCache(userId);
        userDao.deleteUserById(userId);
        log.info("remove user "+ userId + " from database");
    }
    //添加 user
    public void addUser(User user){
        if(userDao.addUser(user))
            redisTemplate.opsForValue().set(user.getId()+"",user);
    }
    //更新 user
    public void updateUser(User user){
        if(userDao.update(user))
            redisTemplate.opsForValue().set(user.getId()+"",user);
    }
}

以下是针对 UserService 的测试代码, site.assad.servcie.UserServiceTest
 
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class UserServcieTest {
    @Autowired
    private UserService userService;
    @Autowired
    private RedisTemplate redisTemplate;
    private final static Logger log = LogManager.getLogger();
    .....
    //测试删除缓存队列
    @Test
    public void testRemoveUserFromCache(){
        for(int i=1;i<5;i++){
            log.info("query get User(userId=1)"+i+" ...");
            log.info(userService.getUser(1));
        }
        userService.removeUserFromCache(1);
        log.info("query get User(userId=1)"+6+" ...");
        log.info(userService.getUser(1));
    }
   .....
}

testRemoveUserFromCache 模块的输出如下:
 
02:01:13.642 [main] INFO  site.assad.service.UserServcieTest - query get User(userId=1)1 ...
02:01:13.676 [main] INFO  site.assad.service.UserService - real query user from DB
02:01:13.678 [main] INFO  site.assad.service.UserServcieTest - User{id=1, name='vancy', password='44455', icon='icon-002'}
02:01:13.678 [main] INFO  site.assad.service.UserServcieTest - query get User(userId=1)2 ...
02:01:13.680 [main] INFO  site.assad.service.UserServcieTest - User{id=1, name='vancy', password='44455', icon='icon-002'}
02:01:13.681 [main] INFO  site.assad.service.UserServcieTest - query get User(userId=1)3 ...
02:01:13.681 [main] INFO  site.assad.service.UserServcieTest - User{id=1, name='vancy', password='44455', icon='icon-002'}
02:01:13.681 [main] INFO  site.assad.service.UserServcieTest - query get User(userId=1)4 ...
02:01:13.684 [main] INFO  site.assad.service.UserServcieTest - User{id=1, name='vancy', password='44455', icon='icon-002'}
02:01:13.686 [main] INFO  site.assad.service.UserService - remove user 1 from cache
02:01:13.686 [main] INFO  site.assad.service.UserServcieTest - query get User(userId=1)6 ...
02:01:13.686 [main] INFO  site.assad.service.UserService - real query user from DB
02:01:13.686 [main] INFO  site.assad.service.UserServcieTest - User{id=1, name='vancy', password='44455', icon='icon-002'}







### Spring Boot 中 `spring-boot-data-redis` 和 `spring-boot-starter-data-redis` 的区别 #### 定义与用途 `sprng-boot-starter-data-redis` 是一个启动器(Starter),它包含了构建基于 Redis 数据存储的应用程序所需的所有依赖项。这个 Starter 自动引入了核心库,例如 `spring-data-redis` 和底层的 Redis 驱动程序(如 Jedis 或 Lettuce)。通过这种方式简化了项目的配置过程[^1]。 另一方面,`spring-boot-data-redis` 并不是一个独立的模块名称,而是通常指代由 `spring-boot-starter-data-redis` 提供的核心功能之一——即对 Redis 数据访问的支持能力。换句话说,它是 `spring-boot-starter-data-redis` 所封装的功能的一部分[^2]。 #### 主要差异总结 以下是两者的主要区别: 1. **命名含义** - `spring-boot-starter-data-redis`: 这是一个完整的 Starter 模块,用于快速集成 Redis 功能到 Spring Boot 应用中。 - `spring-boot-data-redis`: 更像是描述性的术语,表示 Spring Boot 对数据层 Redis 支持的整体概念,而不是具体的 Maven/Gradle 依赖项[^3]。 2. **依赖关系** - 当你在项目中添加 `spring-boot-starter-data-redis` 时,会自动拉取多个必要的子依赖项,其中包括但不限于: - `spring-data-redis`: 实现 Redis 数据操作的核心抽象接口。 - `lettuce-core` 或 `jedis`: Redis Java 客户端驱动程序的选择,默认情况下可能会优先选用其中之一作为默认实现。 3. **自动化配置** - 使用 `spring-boot-starter-data-redis` 后,Spring Boot 将提供一系列开箱即用的自动化配置选项来管理 Redis 连接池以及序列化策略等高级特性。这些都无需开发者额外编写繁琐的手动代码即可完成初始化工作[^2]。 4. **实际应用中的体现** 下面展示了一个简单的测试案例片段,其中展示了如何利用 `RedisTemplate` 来保存键值对并设置过期时间: ```java @SpringBootTest class CodeApplicationTests { @Autowired private RedisTemplate<String, Object> redisTemplate; @Test public void testRedisOperations(){ // 设置 key-value 到缓存里,并指定存活时间为60秒 redisTemplate.opsForValue().set("testKey","value"); redisTemplate.expire("testKey",60L, TimeUnit.SECONDS); String result = (String) redisTemplate.opsForValue().get("testKey"); Assertions.assertEquals(result,"value"); } } ``` 此代码段表明,在成功注入 `RedisTemplate` 后可以非常方便地执行各种针对 Redis 缓存的操作命令[^3]。 #### 结论 综上所述,“`spring-boot-data-redis`”更多是指向于一种逻辑上的表述形式,而 “`spring-boot-starter-data-redis`”才是具体可被加入工程文件里的组件包名。如果希望在自己的应用程序里面轻松接入 Redis,则应该直接引用后者。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值