Spring 集成 Reids(Spring-data-redis)

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'}







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值