Spring整合redis(较新版)

本文介绍如何使用 Spring Data Redis 进行 Redis 数据库的操作,包括配置、使用 StringRedisTemplate 进行 CRUD 操作,并提供了示例代码。

前奏

Redis是一种特殊类型的数据库,称之为key-value存储。和HashMap有很大相似度。可以不夸张的说,它们就是持久化的哈希Map。
在大部分情况下,我们开发java项目通常会结合Spring进行整合操作。我们可以利用Spring Data面向模板的数据访问来使用Redis数据库。
Spring Data Redis 提供四个Redis客户端实现的连接工厂

  1. JedisConnectionFactory
  2. JredisConnectionFactory
  3. LettuceConnectionFactory
  4. SrpConnectionFactory

具体使用哪一个,取决于你自己。从Spring Data Redis的角度来看,这些工厂在适用性上基本相同。

通过连接工厂可以创建模板对Redis进行操作
Spring Data Redis 提供了两个模板,分别为:

  1. RedisTemplate
  2. StringRedisTemplate

示例

具体操作
我们以用户名为Key与密码为Value为例,进行简单整合

首先导入Spring及Redis的相关Jar包,Maven导入如下

<!-- http://projects.spring.io/spring-framework/ -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.5.RELEASE</version>
        </dependency>
        <!-- redis start -->
        <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis -->
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-redis</artifactId>
            <version>1.8.3.RELEASE</version>
        </dependency>
        <!-- redis end -->

封装一个User实例

public class User {
    private String username;
    private String password;
        ...
        get/set
}

在根目录下Spring的配置文件application-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:p="http://www.springframework.org/schema/p"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd">
    <context:component-scan base-package="priv.hgs"/>
    <context:property-placeholder location="classpath:redis.properties"/> 
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <property name="maxIdle" value="${redis.maxIdle}"/>
        <property name="maxWaitMillis" value="${redis.maxWait}"/>
        <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
    </bean>

    <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"
        p:host-name="${redis.host}" p:port="${redis.port}" p:password="${redis.pass}"  p:pool-config-ref="poolConfig"/>
    <bean id="redisTemplete" class="org.springframework.data.redis.core.StringRedisTemplate">
        <property name="connectionFactory" ref="connectionFactory"></property>
    </bean>
    <bean id="userDaoImp" class="priv.redis.redisspring.dao.imp.UserDaoImp"/>
</beans>

在配置中使用到了占位符。因此需要创建一个redis相关配置文件redis.properties。配置文件中包含了连接redis的相关信息,可根据实际需求进行相应更改。

#Redis settings
redis.host=127.0.0.1
redis.port=6379
redis.pass=
redis.maxIdle=300
redis.maxWait=1000
redis.testOnBorrow=true

接在还是老套了,创建相应的*Dao与*DaoImp

IUserDao

public interface IUserDao {
    boolean add(User user);
    boolean delete(String key);
    boolean update(User user);
}

UserDaoImp

@Component
public class UserDaoImp implements IUserDao {
    @Autowired
    StringRedisTemplate redisTemplate;
    @Override
    public boolean add(User user) {
        //使用最基本的方式
        /*redisTemplate.execute(new RedisCallback<Object>() {
            @Override
            public Object doInRedis(RedisConnection connection) throws DataAccessException {
                connection.set(redisTemplate.getStringSerializer().serialize(user.getUsername()),
                        redisTemplate.getStringSerializer().serialize(user.getPassword()));
                return null;
            }
        });*/
        //利用了StringRdisTemplate的特性
        //redisTemplate.opsForValue().set(user.getUsername(), user.getPassword());

        //利用了StringRdisTemplate的特性 通过绑定的方式
        BoundValueOperations<String, String> bound = redisTemplate.boundValueOps(user.getUsername());
        bound.set(user.getPassword());
        //bound.append(user.getPassword());//追加,和StringBuilder的append一样功能
        return true;
    }
    @Override
    public boolean delete(String key) {
        try {
            redisTemplate.delete(key);
            System.out.println(key+" 删除成功。");
        } catch (Exception e) {
            return false;
        }
        return true;
    }
    @Override
    public boolean update(User user) {
        ValueOperations<String, String> ops = redisTemplate.opsForValue();
        if(ops.get(user.getUsername()) != null){
            ops.set(user.getUsername(), user.getUsername());
            return true;
        }
        System.out.println("没有此用户!" + user.getUsername());
        return false;
    }
}

add方法中提供三种操作Redis的方法。具体详情见代码。

需要注意的是,如果你使用的不是StringRedisTemplate,而是RedisTemplate那么你不得不适用序列化器用于实现String与byte数组之间的相互转换。

Spring Data Redis包含多种序列化器:

GenericToStringSerializer:使用Spring转换服务进行序列化

JacksonJsonRedisSerializer:使用Jackson1,将对象序列号为JSON

JacksonJson2RedisSerializer:使用Jackson2,将对象序列号为JSON

JdkSerializationRedisSerializer:使用Java序列化

OxmSerializer:使用Spring O/X映射的编排器和解排器(marshaler和unmarshaler)实现序列化,用于XML序列化。

StringRedisSerializer:序列化String类型的key 和 value

测试

最后一步对Spring进行测试。

导入测试相关Jar包

<dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.12</version>
    <scope>test</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/org.springframework/spring-webmvc -->
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-test</artifactId>
    <version>4.3.5.RELEASE</version>
</dependency>

继续测试,其测试代码如下
以添加删除为例

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations="classpath:application-context.xml")
public class RedisTest {
    @Autowired
    UserDaoImp userDao;
    @Test
    public void redis(){
        //添加
        userDao.add(new User("hgs","123456"));
        //更新
        //userDao.update(new User("hgs","qwe"));
        //查询
        System.out.println(userDao.get("hgs"));
        //删除
        //userDao.delete("hgs");
    }
}

测试通过,控制台中可以正常显示如下

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
User [username=hgs, password=123456]

我们 再来看看redis是否有数据。我们可以借助RedisDesktopManager可视化工具进行查看其正常结果如下:
这里写图片描述

如出现问题,请仔细检查。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值