潘瑞峰的个人博客

Spring中使用Redis缓存

潘瑞峰 rediscache

Redis安装

安装步骤一般都是下载源码、编译、执行脚本。我为了图方便,在Ubuntu上用apt-get一建安装sudo apt-get install redis-server

可以通过查看Redis是否监听了它的默认端口,来检查Redis服务是否正常启动

Redis配置

不同的框架的Redis配置不同,网上有很多详细的配置过程,这里就不再复述了。我用的是SpringBoot框架。

Redis使用

SpringBoot是通过注解的方式使用Redis的。在SpringBoot Doc里有详细的描述。

我做了一个实验,通过用户Id(String 类型)来查找mysql中的记录,第一次查询时,会将该记录存入Redis中,第二次及之后的查询,则是从Redis中取缓存。

@Controller
@RequestMapping("/api/user")
public class UserController {
    
    @Autowired
    UserRepository userRepository;
    
    @RequestMapping(value = "/{userId}", method=RequestMethod.GET)
    @ResponseBody
    @Cacheable(value="user-key", key="#userId")
    public User getUser(
            @PathVariable String userId
            ) {
        User user = userRepository.findOne(userId);
        System.out.println("当前执行了");  
        return user;
    }

}

在这里我们使用参数userId,作为Redis缓存的key,因为userId是主键,具有唯一性。

我调用了http://localhost:8080/api/user/1,并且返回了

{"id":"1","name":"1"}

在Redis服务器中,我们可以找到对应的key-value值,如下

除了指定key以外,我们可以在配置中配置keygenerate的规则,如下

@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
    
    @Bean
    @Override
    public KeyGenerator keyGenerator() {
        return new KeyGenerator() {
            @Override
            public Object generate(Object target, Method method, Object... params) {
                StringBuilder sb = new StringBuilder();
                sb.append(target.getClass().getName());
                sb.append(method.getName());
                for (Object obj : params) {
                    sb.append(obj.toString());
                }
                return sb.toString();
            }
        };
    }
}

如果需要使用默认的规则只要去掉key就好了。如@Cacheable(value="user-key")

在这里,我们用类名方法名参数作为其默认的key值。

再次执行之后,我们可以看到Redis服务器的数据,如下

备注

Redis还有许多其他的应用,如分布式服务器中用于session共享的存储空间等等。

潘瑞峰
五花马,千金裘,呼儿将出换美酒,与尔同销万古愁。