springboot集成redis

来源:互联网 发布:tf卡测速软件 编辑:程序博客网 时间:2024/06/08 11:29

springboot集成redis,解决了手动实现从缓存获取,如果缓存不存在则从数据库获取这样的麻烦逻辑。,springboot通过注解以切面的方式实现从缓存中获取数据。 Springboot集成了多种缓存。他是根据下面的顺序进行判断缓存的提供者
Generic
JCache (JSR-107)
EhCache 2.x
Hazelcast
Infinispan
Redis
Guava
Simple
由于我这里只配置了redis,所以会以redis作为缓存的提供者。

pom中增加spring-boot-starter-cache.
在application.properties中增加redis 的配置

#redis  spring.redis.host=192.168.1.105spring.redis.port=6379spring.redis.password=spring.redis.pool.maxActive=8spring.redis.pool.maxWait=5000spring.redis.pool.maxIdle=8spring.redis.pool.minIdle=0spring.redis.timeout=0

下面编写RedisConfig类。其中RedisConfig类和RedisService类是从网上找的。。。。 功能还是比较通用的。。。。非常感谢提供者

public class RedisConfig extends CachingConfigurerSupport {    /**     * 生成key的策略     * @return     */    @Bean    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());                }//                System.out.println(sb.toString());                return sb.toString();            }        };    }    /**     * 管理缓存     */    @Bean    public CacheManager cacheManager(RedisTemplate redisTemplate) {        RedisCacheManager rcm = new RedisCacheManager(redisTemplate);        return rcm;    }    /**     * RedisTemplate配置     */    @Bean    public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {        StringRedisTemplate template = new StringRedisTemplate(factory);        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);        ObjectMapper om = new ObjectMapper();        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);        jackson2JsonRedisSerializer.setObjectMapper(om);        template.setValueSerializer(jackson2JsonRedisSerializer);        template.afterPropertiesSet();        return template;    }}
@Servicepublic class RedisService {    @Autowired    private RedisTemplate redisTemplate;    /**     * 写入缓存     * @param key     * @param value     * @return     */    public boolean set(final String key, Object value) {        boolean result = false;        try {            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();            operations.set(key, value);            result = true;        } catch (Exception e) {            e.printStackTrace();        }        return result;    }    /**     * 写入缓存设置时效时间     * @param key     * @param value     * @return     */    public boolean set(final String key, Object value, Long expireTime) {        boolean result = false;        try {            ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();            operations.set(key, value);            redisTemplate.expire(key, expireTime, TimeUnit.SECONDS);            result = true;        } catch (Exception e) {            e.printStackTrace();        }        return result;    }    /**     * 批量删除对应的value     * @param keys     */    public void remove(final String... keys) {        for (String key : keys) {            remove(key);        }    }    /**     * 批量删除key     * @param pattern     */    public void removePattern(final String pattern) {        Set<Serializable> keys = redisTemplate.keys(pattern);        if (keys.size() > 0)            redisTemplate.delete(keys);    }    /**     * 删除对应的value     * @param key     */    public void remove(final String key) {        if (exists(key)) {            redisTemplate.delete(key);        }    }    /**     * 判断缓存中是否有对应的value     * @param key     * @return     */    public boolean exists(final String key) {        return redisTemplate.hasKey(key);    }    /**     * 读取缓存     * @param key     * @return     */    public Object get(final String key) {        Object result = null;        ValueOperations<Serializable, Object> operations = redisTemplate.opsForValue();        result = operations.get(key);        return result;    }    /**     * 哈希 添加     * @param key     * @param hashKey     * @param value     */    public void hmSet(String key, Object hashKey, Object value){        HashOperations<String, Object, Object>  hash = redisTemplate.opsForHash();        hash.put(key,hashKey,value);    }    /**     * 哈希获取数据     * @param key     * @param hashKey     * @return     */    public Object hmGet(String key, Object hashKey){        HashOperations<String, Object, Object>  hash = redisTemplate.opsForHash();        return hash.get(key,hashKey);    }    /**     * 列表添加     * @param k     * @param v     */    public void lPush(String k,Object v){        ListOperations<String, Object> list = redisTemplate.opsForList();        list.rightPush(k,v);    }    /**     * 列表获取     * @param k     * @param l     * @param l1     * @return     */    public List<Object> lRange(String k, long l, long l1){        ListOperations<String, Object> list = redisTemplate.opsForList();        return list.range(k,l,l1);    }    /**     * 集合添加     * @param key     * @param value     */    public void add(String key,Object value){        SetOperations<String, Object> set = redisTemplate.opsForSet();        set.add(key,value);    }    /**     * 集合获取     * @param key     * @return     */    public Set<Object> setMembers(String key){        SetOperations<String, Object> set = redisTemplate.opsForSet();        return set.members(key);    }    /**     * 有序集合添加     * @param key     * @param value     * @param scoure     */    public void zAdd(String key,Object value,double scoure){        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();        zset.add(key,value,scoure);    }    /**     * 有序集合获取     * @param key     * @param scoure     * @param scoure1     * @return     */    public Set<Object> rangeByScore(String key,double scoure,double scoure1){        ZSetOperations<String, Object> zset = redisTemplate.opsForZSet();        return zset.rangeByScore(key, scoure, scoure1);    }}

下面在TestDaoImpl的findByCondition方法上加上@Cacheable(value=”test_cache”)
在执行findByCondition之前会到相应的key中取值,如果能取到直接返回,否则执行方法体获取数据。避免了我们写很多业务逻辑。

在Application类上方加上@EnableCaching
启动。。 运行http://localhost:8089/spbt/getCondition?state=1

怎么验证数据写入到redis里呢。。。
通过RedisConfig类中的keyGenerator方法我们知道缓存中key 的生成方式。 可以通过System.out.println(sb.toString())得到。
编写测试类

//测试数据是否进入到redis中。。。。。。。。。。。。        List list = new ArrayList() ;        Collection list1 = (Collection)redisService.get("com.cy.spbt.dao.impl.TestDaoImplfindByCondition1") ;        System.out.println(list1.size());

打印:968
说明com.cy.spbt.dao.impl.TestDaoImplfindByCondition1这个key里有值。

原创粉丝点击