redis的使用

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介: 使用redis首先需要配置redis@Configuration@EnableAutoConfiguration@EnableCachingpublic class RedisCacheConfig { @Value("${redis.

使用redis首先需要配置redis

@Configuration
@EnableAutoConfiguration
@EnableCaching
public class RedisCacheConfig {

    @Value("${redis.host}")
    private String host;

    @Value("${redis.port}")
    private int port;

    @Value("${redis.password}")
    private String password;

    @Value("${redis.pool.maxTotal}")
    private int maxTotal;

    @Autowired
    @Qualifier("redisTemplate")
    private RedisTemplate<Object, Object> redisTemplate;

    // redis缓存失效时间, 24小时
    private Integer cacheExpirationTime = 60 * 60;

    @Bean
    public JedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
        JedisConnectionFactory factory = new JedisConnectionFactory();
        factory.setHostName(host);
        factory.setPort(port);
        if(StringUtils.isNotEmpty(password)){
            factory.setPassword(password);
        }
        factory.setPoolConfig(jedisPoolConfig);
        return factory;
    }

    @Bean
    public JedisPoolConfig jedisPoolConfig() {
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
        jedisPoolConfig.setBlockWhenExhausted(true);
        jedisPoolConfig.setTestOnBorrow(true);
        jedisPoolConfig.setMaxTotal(maxTotal);
        return jedisPoolConfig;
    }

    @Bean
    public CacheClient redisClientFactory() {
        CacheClient cc = new BaseRedisCacheImpl();
        return cc;
    }

    @Bean(name = "redisTemplate")
    public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory factory) {
        GenericJackson2JsonRedisSerializer serializer = new GenericJackson2JsonRedisSerializer();

        RedisTemplate<Object, Object> template = new RedisTemplate<Object, Object>();
        template.setKeySerializer(new StringRedisSerializer()); // 对于普通K-V操作时,key采取的序列化策略
        template.setValueSerializer(serializer); // value采取的序列化策略
        template.setHashKeySerializer(serializer); // 在hash数据结构中,hash-key的序列化策略
        template.setHashValueSerializer(serializer); // 在hash数据结构中,hash-key的序列化策略
        template.setConnectionFactory(factory);
        template.afterPropertiesSet();
        return template;
    }

    @Bean
    public CacheManagerCustomizer<RedisCacheManager> cacheManagerCustomizer() {
        return new CacheManagerCustomizer<RedisCacheManager>() {
            @Override
            public void customize(RedisCacheManager cacheManager) {
                cacheManager.setDefaultExpiration(cacheExpirationTime);
                Map<String, Long> expires = Maps.newHashMap();
                expires.put(CacheModule.GAME, 2*3600l);
                expires.put(CacheModule.APP, 24*3600l);
                expires.put(CacheModule.MIN5, 5*60l);
                expires.put(CacheModule.HOUR1, 3600l);
                expires.put(CacheModule.CERT, 24*3600l);
                cacheManager.setExpires(expires);

                cacheManager.setCacheNames(
                        Arrays.asList(CacheModule.COMMENT,
                                CacheModule.GAME,
                                CacheModule.USER,
                                CacheModule.WEB,
                                CacheModule.APP,
                                CacheModule.SHARE,
                                CacheModule.CERT,                               CacheModule.HOUR1,
                                CacheModule.MIN5));
            }

        };
    }
}

Spring缓存注解@Cacheable、@CacheEvict、@CachePut使用

从3.1开始,Spring引入了对Cache的支持。其使用方法和原理都类似于Spring对事务管理的支持。Spring Cache是作用在方法上的,其核心思想是这样的:当我们在调用一个缓存方法时会把该方法参数和返回结果作为一个键值对存放在缓存中,等到下次利用同样的参数来调用该方法时将不再执行该方法,而是直接从缓存中获取结果进行返回。所以在使用Spring Cache的时候我们要保证我们缓存的方法对于相同的方法参数要有相同的返回结果。

   使用Spring Cache需要我们做两方面的事:

n 声明某些方法使用缓存

n 配置Spring对Cache的支持

   和Spring对事务管理的支持一样,Spring对Cache的支持也有基于注解和基于XML配置两种方式。下面我们先来看看基于注解的方式。

1 基于注解的支持
Spring为我们提供了几个注解来支持Spring Cache。其核心主要是@Cacheable和@CacheEvict。使用@Cacheable标记的方法在执行后Spring Cache将缓存其返回结果,而使用@CacheEvict标记的方法会在方法执行前或者执行后移除Spring Cache中的某些元素。下面我们将来详细介绍一下Spring基于注解对Cache的支持所提供的几个注解。

1.1 @Cacheable

   @Cacheable可以标记在一个方法上,也可以标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类所有的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用同样的参数来执行该方法时可以直接从缓存中获取结果,而不需要再次执行该方法。Spring在缓存方法的返回值时是以键值对进行缓存的,值就是方法的返回结果,至于键的话,Spring又支持两种策略,默认策略和自定义策略,这个稍后会进行说明。需要注意的是当一个支持缓存的方法在对象内部被调用时是不会触发缓存功能的。@Cacheable可以指定三个属性,value、key和condition。

1.2 @CachePut

   在支持Spring Cache的环境下,对于使用@Cacheable标注的方法,Spring在每次执行前都会检查Cache中是否存在相同key的缓存元素,如果存在就不再执行该方法,而是直接从缓存中获取结果进行返回,否则才会执行并将返回结果存入指定的缓存中。@CachePut也可以声明一个方法支持缓存功能。与@Cacheable不同的是使用@CachePut标注的方法在执行前不会去检查缓存中是否存在之前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。

   @CachePut也可以标注在类上和方法上。使用@CachePut时我们可以指定的属性跟@Cacheable是一样的。

@CachePut(“users”)//每次都会执行方法,并将结果存入指定的缓存中

public User find(Integer id) {

  returnnull;

}

1.3 @CacheEvict

   @CacheEvict是用来标注在需要清除缓存元素的方法或类上的。当标记在一个类上时表示其中所有的方法的执行都会触发缓存的清除操作。@CacheEvict可以指定的属性有value、key、condition、allEntries和beforeInvocation。其中value、key和condition的语义与@Cacheable对应的属性类似。即value表示清除操作是发生在哪些Cache上的(对应Cache的名称);key表示需要清除的是哪个key,如未指定则会使用默认策略生成的key;condition表示清除操作发生的条件。下面我们来介绍一下新出现的两个属性allEntries和beforeInvocation。

1.4 @Caching

   @Caching注解可以让我们在一个方法或者类上同时指定多个Spring Cache相关的注解。其拥有三个属性:cacheable、put和evict,分别用于指定@Cacheable、@CachePut和@CacheEvict。

@Caching(cacheable = @Cacheable(“users”), evict = { @CacheEvict(“cache2”),

     @CacheEvict(value = "cache3", allEntries = true) })

public User find(Integer id) {

  returnnull;

}

重点(例子)

@CacheEvict 应该和 @Cacheable 搭配使用

@CacheEvict(cacheNames = CacheModule.APP,
            key = "T(com.gws.base.CachePrefix).APP.concat(T(String).valueOf(#app.getAppId()))")

@Override
 public App updateApp(App app) {
        if (null == app){
            return null;
        }

        appMaster.updateById(app,app.getAppId(),"appId","appName","appVersion","osType","icon1","icon2","pkgPath","appAbstract");

        return app;
    }
@Cacheable(cacheNames = CacheModule.APP,
            key = "T(com.gws.base.CachePrefix).APP.concat(T(String).valueOf(#appId))")
    @Override
    public App getApp(Long appId) {
        if (null == appId) {
            return null;
        }
        return appSlave.findOne(appId);
    }

执行流程:
1.当执行获取的方法的时候,会将缓存放到数据库

这里写图片描述

2.当执行更改的时候,会清理掉数据库的缓存

这里写图片描述

结合业务学技术。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
NoSQL 数据库 Redis
使用Redis的五个注意事项
下面内容来源于Quora上的一个提问,问题是使用Redis需要避免的五个问题。而回答中超出了五个问题的范畴,描述了五个使用Redis的注意事项。如果你在使用或者考虑使用Redis,可能你可以学习一下下面的一些建议,避免一下提到的问题。
804 0
|
存储 缓存 监控
如何正确地使用Redis(附性能测试实验结果)
1. 概述简单来说,Redis就是一个数据结构存储器,可以用作数据库、缓存和消息中间件,它和传统数据库主要有两点不同:它是Key-Value型数据库,不是关系型数据库,所有数据以Key-Value的形式存在服务器的内存中,其中Value可以是多种数据结构:字符串(String), 哈希(hashes), 列表(list), 集合(sets) 和有序集合(sorted sets)等类型;它所有运行时
8110 0
如何正确地使用Redis(附性能测试实验结果)
|
存储 缓存 NoSQL
Redis介绍使用及进阶
Redis介绍使用及进阶目录: 一、介绍 二、缓存问题 三、Redis内存滥用 四、键命名规范 五、Redis使用场景 六、持久化操作 七、.Net Core 使用redis 简单介绍 一、介绍 1、 高性能-- Redis能读的速度是110000次/s,写的速度是81000次/s 、c语言实现距...
1274 0
|
NoSQL Redis 运维
Redis使用规范
Redis使用规范
3615 0
|
NoSQL 数据库 Redis
|
NoSQL 测试技术 数据库
|
存储 缓存 NoSQL
redis 简单使用总结
最近一段时间与redis接触比较频繁。发现有些东西还是工作中经常会用到的,自己也花了点时间巩固下。本篇文章主要是以总结性的方式梳理,因为redis的主题很大,任何一个技术点展开都是几篇文章的量。也可以说这篇文章是个概览。
1531 0
|
NoSQL 安全 Redis
最近使用redis的总结
  线上的redis出现了两次,数据被清空的情况,所以一些安全上的措施是必须要做的。 1、修改redis的默认端口,添加密码 默认的6379端口改成其他的 requirepass 新的密码 2、重命名redis命令,类似于FLUSHALL 的命令...
946 0