文档章节

SpringBoot之redis

王念博客
 王念博客
发布于 2016/04/17 14:53
字数 835
阅读 1.4W
收藏 19

#程序员薪资揭榜#你做程序员几年了?月薪多少?发量还在么?>>>

        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://www.wncode.cn

© 著作权归作者所有

王念博客
粉丝 208
博文 122
码字总数 95703
作品 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 搭建web项目(前后端分离,附项目源代码地址)

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

开源小菜鸟2333
2017/11/01
2.4W
3
SpringBootBucket 1.0.0 发布,SprintBoot 全家桶

Spring Boot 现在已经成为Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。 本项目对目前Web开发中常用的各个技术,通过和SpringBoot的集成,并且对各种技术通过“一...

一刀
2018/03/05
9.5K
17
Spring Boot 全家桶 - SpringBootBucket

Spring Boot 现在已经成为Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。 本项目对目前Web开发中常用的各个技术,通过和SpringBoot的集成,并且对各种技术通过“一...

一刀
2018/03/05
1.3W
10
小D课堂 - 零基础入门SpringBoot2.X到实战_汇总

第1节零基础快速入门SpringBoot2.0 小D课堂 - 零基础入门SpringBoot2.X到实战第1节零基础快速入门SpringBoot2.01、SpringBoot2.x课程介绍和高手系列知识点 小D课堂 - 零基础入门SpringBoot2...

osc_0jbt10ev
2019/08/22
23
0
SpringBoot整合Redis、ApacheSolr和SpringSession

一、简介 SpringBoot自从问世以来,以其方便的配置受到了广大开发者的青睐。它提供了各种starter简化很多繁琐的配置。SpringBoot整合Druid、Mybatis已经司空见惯,在这里就不详细介绍了。今天...

小忽悠
2018/07/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

华为pat地址转换,以及内网web服务器发布

实验名称:华为pat地址转换,以及内网web服务器发布 实验拓扑图: 3. 实验目的 : 1.使内网通过pat转化出去上外网 2.使用静态pat做端口映射,发布web服务器 3.配置交换机远程登录 4. 地址规划 cl...

osc_2ch77h9m
27分钟前
7
0
php优化与模块

缓存 xcache eaccelerator zendopcache pdo_mysql扩展 memcache扩展 memcached扩展 mongo扩展 imagemagick imagick扩展...

osc_tb68dlqx
29分钟前
25
0
ATFX投资者教育活动凸显优势,助力客户有效应对市场波动

ATFX动态:新冠肺炎疫情全球传播期间,各国纷纷颁布“居家令”等措施,要求员工必须待在家里,因此也给各行各业带来了不同程度的影响。为了配合各国颁布的防疫措施,ATFX全球办事处依据各地的...

ATFX
29分钟前
22
0
ospf的工作原理

#谈起ospf(开放式最短路径优先),首先它是一种链路状态路由协议 它的工作过程主要有以下几点 : # 建立邻居表 hello : 仅仅使用hello报文,发现邻居,用于邻居的建立,维护,拆除 ospf 路由仅仅...

osc_4dgu16li
30分钟前
16
0
mysql5.7.20安装

rpm -qa | grep mysql yum -y install make gcc-c++ cmake bison-devel ncurses-devel cd /root wget http://www.sourceforge.net/projects/boost/files/boost/1.59.0/boost_1_59_0.tar.gz m......

osc_pl4ni83h
32分钟前
17
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部