文档章节

SpringBoot之redis

王念博客
 王念博客
发布于 2016/04/17 14:53
字数 775
阅读 13175
收藏 18

        redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。    

 

1.导入jar包依赖

<dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-redis</artifactId>
</dependency>

2.相应的配置

# REDIS (RedisProperties)
#spring.redis.database=
spring.redis.host=
spring.redis.password=
spring.redis.port=6379 
spring.redis.pool.max-idle=100 
spring.redis.pool.min-idle=1
spring.redis.pool.max-active=1000
spring.redis.pool.max-wait=-1
server.port=8081

3.编写cache管理类

package com.example;
import java.lang.reflect.Method;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.ObjectMapper;
    /**
     * 缓存管理(注解用)
     * @author Administrator
     *
     */
    @Configuration
    @EnableCaching
    public class CacheService 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());
                }
                return sb.toString();
            }
        };
    }
    
    /**
     * 管理缓存
     *
     * @param redisTemplate
     * @return
     */
    @SuppressWarnings("rawtypes")
    @Bean
    public CacheManager cacheManager(RedisTemplate redisTemplate) {
        RedisCacheManager rcm = new RedisCacheManager(redisTemplate);
        //设置缓存过期时间
        // rcm.setDefaultExpiration(60);//秒
        //设置value的过期时间
        Map<String,Long> map=new HashMap();
        map.put("test",60L);
        rcm.setExpires(map);
        return rcm;
    }
    
    /**
     * RedisTemplate配置
     * @param factory
     * @return
     */
    @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);//如果key是String 需要配置一下StringSerializer,不然key会乱码 /XX/XX
        template.afterPropertiesSet();
        return template;
    }
}

4.常用的操作redis的方法

package com.example;
import java.io.Serializable;
import java.util.Set;
import java.util.concurrent.TimeUnit;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
/**
 * redicache 工具类
 * 
 */
@SuppressWarnings("unchecked")
@Component
public class RedisUtil {
@SuppressWarnings("rawtypes")
@Autowired
private RedisTemplate redisTemplate;
/**
 * 批量删除对应的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 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;
}
}

 

5.在方法前面加上缓存

@RequestMapping("/")
@Cacheable(value="test")
public String getSessionId(HttpSession session){
redisUtil.set("123", "测试");
System.out.println("进入了方法");
String string= redisUtil.get("123").toString();
return string;
}

@Cacheable参数

value  指明缓存将被存到什么地方。

key     Spring默认使用被@Cacheable注解的方法的签名来作为key

condition = "#age < 25" 数将指明方法的返回结果是否被缓存。

本文地址(防爬虫不标注来源):http://my.oschina.net/wangnian/blog/661389

© 著作权归作者所有

共有 人打赏支持
王念博客
粉丝 166
博文 102
码字总数 79089
作品 0
浦东
程序员
私信 提问
加载中

评论(11)

P
PERFECTDAY
RedisUtil报错: No qualifying bean of type 'org.springframework.data.redis.core.RedisTemplate<?, ?>' available: expected at least 1 bean which qualifies as autowire candidate.
木木三少
木木三少

引用来自“王念博客”的评论

这不是缓存的问题 而是jackson的异常,你可以把PageImpl类拷贝出来手动加个构造方法 或者看看jackson有没有注解解决这个问题。

引用来自“absurd717”的评论

结果报了Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: org.springframework.data.domain.PageImpl cannot be cast to com.absurd.core.model.PageImplBean] with root cause
哥们、请教一下、这个问题你解决了没有?
王念博客
王念博客

引用来自“Kevin_Zhan”的评论

配置文件都没引用到,spring怎么知道这个redis的配置在哪呢,对应的key是什么呢

引用来自“王念博客”的评论

这是springBoot的配置,不是spring xml配置的方式。

引用来自“Kevin_Zhan”的评论

你的意思是 他默认会去application.properties去寻找对应的redis的属性,比如host,timeout,然后注入到redis吗?
差不多就是这个意思,你如果加了spring-boot-starter实现的包,再启动Springboot项目就会去application.properties里找对应的配置初始化第三方包的配置,如果你之前不了解Springboot的话可能跑个简单的例子就明白啦。
Kevin_Zhan
Kevin_Zhan

引用来自“Kevin_Zhan”的评论

配置文件都没引用到,spring怎么知道这个redis的配置在哪呢,对应的key是什么呢

引用来自“王念博客”的评论

这是springBoot的配置,不是spring xml配置的方式。
你的意思是 他默认会去application.properties去寻找对应的redis的属性,比如host,timeout,然后注入到redis吗?
王念博客
王念博客

引用来自“Kevin_Zhan”的评论

配置文件都没引用到,spring怎么知道这个redis的配置在哪呢,对应的key是什么呢
这是springBoot的配置,不是spring xml配置的方式。
Kevin_Zhan
Kevin_Zhan
配置文件都没引用到,spring怎么知道这个redis的配置在哪呢,对应的key是什么呢
a
absurd717

引用来自“王念博客”的评论

这不是缓存的问题 而是jackson的异常,你可以把PageImpl类拷贝出来手动加个构造方法 或者看看jackson有没有注解解决这个问题。
结果报了Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.ClassCastException: org.springframework.data.domain.PageImpl cannot be cast to com.absurd.core.model.PageImplBean] with root cause
a
absurd717

引用来自“王念博客”的评论

这不是缓存的问题 而是jackson的异常,你可以把PageImpl类拷贝出来手动加个构造方法 或者看看jackson有没有注解解决这个问题。
public class PageImplBean extends PageImpl {

private static final long serialVersionUID = 1L;
private int number;
private int size;
private int totalPages;
private int numberOfElements;
private long totalElements;
private boolean previousPage;
private boolean firstPage;
private boolean nextPage;
private boolean lastPage;
private List content;
private Sort sort;

public PageImplBean() {
super(new ArrayList());
}

public int getNumber() {
return number;
}

public void setNumber(int number) {
this.number = number;
}

public int getSize() {
return size;
}

public void setSize(int size) {
this.size = size;
}

public int getTotalPages() {
return totalPages;
}

public void setTotalPages(int totalPages) {
this.totalPages = totalPages;
}

public int getNumberOfElements() {
return numberOfElements;
}

public void setNumberOfElements(int numberOfElements) {
this.numberOfElements = numberOfElements;
}

public long getTotalElements() {
return totalElements;
}

public void setTotalElements(long totalElements) {
this.totalElements = totalElements;
}

public boolean isPreviousPage() {
return previousPage;
}

public void setPreviousPage(boolean previousPage) {
this.previousPage = previousPage;
}

public boolean isFirstPage() {
return firstPage;
}

public void setFirstPage(boolean firstPage) {
this.firstPage = firstPage;
}

public boolean isNextPage() {
return nextPage;
}

public void setNextPage(boolean nextPage) {
this.nextPage = nextPage;
}

public boolean isLastPage() {
return lastPage;
}

public void setLastPage(boolean lastPage) {
this.lastPage = lastPage;
}

public List getContent() {
return content;
}

public void setContent(List content) {
this.content = content;
}

public Sort getSort() {
return sort;
}

public void setSort(Sort sort) {
this.sort = sort;
}

public PageImpl pageImpl() {
return new PageImpl(getContent(), new PageRequest(getNumber(),
getSize(), getSort()), getTotalElements());
}
}
王念博客
王念博客
这不是缓存的问题 而是jackson的异常,你可以把PageImpl类拷贝出来手动加个构造方法 或者看看jackson有没有注解解决这个问题。
a
absurd717
com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of org.springframework.data.domain.PageImpl: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?)
at [Source: [B@206540; line: 1, column: 46]
  at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:261) ~[jackson-databind-2.8.3.jar:2.8.3]
意思是PageImpl没有无参构造函数,怎么解决?
SpringBoot 学习二:操作数据库

本文将从以下几个方面介绍: 前言 配置数据源 SpringBoot 整合 Mybatis SpringBoot 整合 JdbcTemplate SpringBoot 整合 Redis 前言 在上篇文章 SpringBoot 学习一 中已经学习了 SpringBoot的...

tsmyk0715
09/26
0
0
springBoot 搭建web项目(前后端分离,附项目源代码地址)

概述 该项目包含springBoot-example-ui 和 springBoot-example,分别为前端与后端,前后端分离,利用ajax交互。 前端html 技术: + + + + 该项目git地址:https://github.com/jiangcaijun/sp...

开源小菜鸟2333
2017/11/01
0
0
恒宇少年/spring-boot-chapter

简书整套文档以及源码解析 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 003 Quer...

恒宇少年
04/19
0
0
SeimiCrawler V2.0 发布,Java 爬虫框架

新版变动 完美支持SpringBoot,可以尽情的集成SpringBoot现有生态,demo参考 回调函数支持方法引用,设置起来更自然 非SpringBoot模式全局配置项通过进行配置,包括 Redis集群信息,SeimiAg...

无极小子
06/25
645
0
SpringBootBucket 2.0.4 发布,代号“傲娇的小二晶”

SpringBootBucket 自从1.0.0版本发布后就有好多人喜欢,目前码云上面star数量接近1.2k。上个月还收到了红薯签名的1000 star奖杯,这个我自己也觉得很惊讶。 由于SpringBoot 1.x官方将终止维护...

一刀
09/16
1K
4

没有更多内容

加载失败,请刷新页面

加载更多

支付宝客户端架构分析:自动化日志收集及分析

摘要: 《支付宝客户端架构解析》系列将从支付宝客户端的架构设计方案入手,带领大家进一步了解支付宝在客户端架构上的迭代与优化历程。 小蚂蚁说: 《支付宝客户端架构解析》系列将从支付宝...

阿里云官方博客
17分钟前
1
0
nginx中部署vue打包后的静态文件

如何在nginx中部署静态资源就不描述了, 请看我的这篇博客 将vue脚手架项目打包后的静态文件放到nginx上, 发现有个问题, 即url上有#, 怎么去掉这个#呢. 1 项目中router的mode 路由的mode要为h...

克虏伯
35分钟前
5
0
JS容易理解错误的地方

在这端代码执行的末尾,你会不会hi变量回事函数中的hi了?你会不会认为这不是按引用传递了? 对值传递和引用传递产生质疑了? 1 var hi = {};2 function sayHello(hi) { ...

器石_
37分钟前
3
0
Java开发学习--MongoDB

之前只学过sql,第一次使用非关系型数据库。以前对于关系型数据库与非关系型数据库的概念很模糊,通过这次的学习对这两者有了一个清晰的概念。 主键 在MongoDB中,主键名叫"_id",如果在生成...

微笑向暖wx
40分钟前
3
0
Java8-2-Lambda表达式实战-一句话实现Map中按照Value排序

今天我们来实战一把, 对Map的Value值排序进行简化. 如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java高级交流:854630135,群...

编程SHA
43分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部