Spring连接Redis,并使用Redis作为缓存工具

本文介绍了如何在Spring中连接Redis并使用Redis作为缓存工具。详细步骤包括启动Redis、配置Spring的Redis连接工厂,如JedisConnectionFactory,以及使用RedisTemplate和StringRedisTemplate进行数据操作。同时,文章讲解了启用注解式Redis缓存的方法,包括添加@EnableCaching注解,配置RedisCacheManager,以及在方法上添加缓存注解以简化缓存操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,Spring连接Redis:

1.1,前提:启动redis并登录,将这段代码放入.bat中,双击就会启动Redis(D:\dev\redis是Redis安装路径),之后另开一个CMD,简单登录,输入:redis-cli -h 127.0.0.1 -p 6379

pushd D:\dev\redis 
redis-server.exe redis.windows.conf
pause

1.2,Spring提供了四种为Redis客户端提供连接的Redis连接工厂:

        。JedisConnectionFactory

        。JredisConnectionFactory

        。LettuceConnectionFactory

        。SrpConnectionFactory

使用其中一种,这样Redis连接工厂的bean就被注入到Spring容器中:

    @Bean
    public RedisConnectionFactory hadRedisCF(){
        JedisConnectionFactory cf=new JedisConnectionFactory();
        cf.setHostName("127.0.0.1");
        cf.setPort(6379);
        return  cf;
    }

其实到了这一步,就能使用连接工厂进行Redis数据的访问了,为了不受数据结构的限制,Spring提供了两种模板来操作Redis的Key-Value:

        。RedisTemplate(操作key-value是更丰富的数据结构,比如对象,集合等)

        。StringRedisTemplate(扩展自RedisTemplate,只适用于key,value都是String类型的)

定义RedisTemplate的bean:

    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory cf){
        RedisTemplate<String,Object> redis=new RedisTemplate<String,Object>();
        redis.setConnectionFactory(cf);

        //适用序列化器自定义key-value的序列化方式
        StringRedisSerializer srs=new StringRedisSerializer();
        redis.setKeySerializer(srs);
        redis.setHashKeySerializer(srs);
        redis.setValueSerializer(srs);
        redis.setHashValueSerializer(srs);
        
        return redis;
    }

到这里就能访问进行key-value的操作了:

//从javaconfig启动Spring容器
AnnotationConfigApplicationContext aa=
                new AnnotationConfigApplicationContext(RedisConfig.class);
//获取Redistemplate对象
        RedisTemplate RT=(RedisTemplate)aa.getBean("redisTemplate");
设置key-value:
        RT.opsForValue().set("go","走了");  //设置key=go,value="走了"
获取value:
        RT.opsForValue().get("go");  //返回值就是"走了"

提醒:

1,一定要先了解Redis的每种数据结构:String,List,Set,zSet,Hash;每种数据结构都有对应的方法来操作,不能混用。

2,1中的方法会对应着RedisTemplate的方法,比如opsForValue对应String,opsForList对应List。

3,关于序列化器,RedisTemplate默认使用JdkSerializationRedisSerializer序列化器对key和value进行序列化,Spring提供了如下序列化器:(都实现了RedisSerializer接口):

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

        。JacksonJsonRedisSerializer,使用Jackson 1将对象序列化为JSON

        。Jackson2JsonRedisSerializer,使用Jackson 2将对象序列化为JSON

        。JdkSerializationRedisSerializer,使用java序列化

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

        。StringRedisSerializer,用于序列化String类型的Key和value

4,如果value代表对象,那么对象一定要支持序列化,简单的就是实现接口:Serializer

2,使用注解式的Redis缓存:

2.1,如果不想用注解,那么就用上述的设置方法来将数据存入Redis。只不过设置的过程比较繁琐,而用注解,就会利用到AOP的切面来使用缓存,不想使用XML的原因是配置繁琐,javaconfig会更nice.

2.2,缓存注解不是默认启动的,需要注解驱动缓存,给配置类加上:@EnableCaching就可以了;

2.3,Spring3.2提供了多种缓存管理器,缓存管理器是注解式缓存的基础:

SimpleCacheManager

NoOpCacheManager

ConcurrentMapCacheManager

CompositeCacheManager

EhCacheCacheManager

RedisCacheManager

GemfireCacheManager

由于使用过Redis作为缓存,那么就用RedisCacheManager,

2.4,配置javaconfig:

    @Bean  //配置一个缓存管理器
    public CacheManager cacheManager(RedisTemplate redisTemplate){
        return  new RedisCacheManager(redisTemplate); //声明缓存管理器,
    }
@Bean  //RedisTemplate bean
    public RedisTemplate<String,String> redisTemplate(RedisConnectionFactory redisCF){
        RedisTemplate<String,String> redisTemplate =new RedisTemplate<String,String>();
        StringRedisSerializer srs=new StringRedisSerializer();
        //序列化器
        redisTemplate.setValueSerializer(srs);
        redisTemplate.setKeySerializer(srs);
        redisTemplate.setHashKeySerializer(srs);
        redisTemplate.setHashValueSerializer(srs);
        redisTemplate.setConnectionFactory(redisCF);
        redisTemplate.afterPropertiesSet();
        return redisTemplate;
    }

注意这段代码相较于1中的,多了redisTemplate.afterPropertiesSet();这个方法必须要有,书上也没介绍,但是一定要settter设置完参数后在执行这个,(似乎是调用这个方法了才能初始化注解的缓存)

2.5,为方法添加注解以支持缓存:

Spring提供了了四个注解:

@Cacheable,在调用方法之前,首先在缓存中查找方法的返回值,如果能够找到,就会返回缓存的值(不调用方法了),否则方法会被调用,且返回值会放入缓存(适用于返回值不会发生变化的方法)。

@CachePut,将方法的返回值放入到缓存中,调用前不检查缓存

@CacheEvict,应该在缓存中清除一个或多个缓存条目

@Caching,分组注解,能够同时应用多个其他缓存注解

2.6,示例

@Cacheable(value = "RedisTemplate",key="#name+#age")
    public String sayHello(String name,int age){
        String name1=name;
        int age1=age;
        name1=name.toLowerCase(); 
        return name1+age ;
    }

这个示例设置自定义的key:name+age,value就是函数的返回值(切记别用默认的生成key策略),

假设是无参数方法:则用{#result},关于这几个注解的其余属性我就不多谈了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值