九、springboot整合redis二之缓冲配置
1.创建Cache配置类
@Configuration
@EnableCaching
public class RedisCacheConfig extends CachingConfigurerSupport { @Value("${redis.cache.expiration}")
private Long expiration; /**
*
* 管理缓存
*/
@Bean
public CacheManager cacheManager(RedisTemplate<Object, Object> redisTemplate) {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
cacheManager.setDefaultExpiration(expiration);// 设置缓存默认过期时间(全局的)秒
return cacheManager;
} /**
* 自定义生成的redis key
* 在使用@Cacheable时,如果不指定key,则使用找个默认的key生成器生成的key
* @return
*/
@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();
}
};
} @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;
}
}
2.使用
1.手动方式:
Jedis工具类
@Component
public class RedisUtil { private Logger log = LoggerFactory.getLogger(getClass()); @Autowired
private StringRedisTemplate stringRedisTemplate; @Autowired
private RedisTemplate<Object, Object> redisTemplate; /**
* 根据redis key 获取 value
*
* @param key 键
* @return String
*/
public String get(String key) {
return this.stringRedisTemplate.opsForValue().get(key);
} /**
* 根据redis key 设置 value
*
* @param key
* @param value
* @param overwrite
*/
public void set(String key, String value, boolean overwrite) {
if(!overwrite) {//setIfAbsent(key, value):如果key不存在则新增,并返回true;存在则不改变已经有的值,并返回false。
boolean isSet = this.stringRedisTemplate.opsForValue().setIfAbsent(key, value); if (!isSet) {
log.warn("key值已存在且不进行覆写");
} }else {
this.stringRedisTemplate.opsForValue().set(key, value);
}
} /**
* 根据redis key 设置 value 同时设置失效时间
*
* @param key
*/
public void set(String key, String value, long timeout) {
boolean isSet = this.stringRedisTemplate.opsForValue().setIfAbsent(key, value); if (isSet) {
this.stringRedisTemplate.expire(key, timeout, TimeUnit.SECONDS);
} else {
log.warn("key值已存在");
}
} /**
* 根据key检查是否已存在
*
* @param key
* @return boolean
*/
public boolean exists(String key) {
boolean result = false;
result = this.stringRedisTemplate.hasKey(key);
return result;
} /**
* 根据key值删除value
*
* @param key
*/
public void del(String key) {
this.stringRedisTemplate.delete(key);
} /**
* 获取hashKey对应的所有键值
*
* @param key 键
* @return 对应的多个键值
*/
public Map<Object, Object> hmget(String key) {
return this.redisTemplate.opsForHash().entries(key);
} /**
* HashSet 并设置时间
*
* @param key 键
* @param map 对应多个键值
* @param time 时间(秒)
* @return true成功 false失败
*/
public boolean hmset(String key, Map<String, Object> map, long timeout) {
try {
this.redisTemplate.opsForHash().putAll(key, map);
if (timeout > 0) {
this.redisTemplate.expire(key, timeout, TimeUnit.SECONDS);
}
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}
} /**
* 根据key删除hash
*
* @param key
*/
public void delhm(String key) {
this.redisTemplate.delete(key);
} /**
* redis分布式锁(同步锁)
* setIfAbsent(key, value):如果key不存在则新增,并返回true;存在则不改变已经有的值,并返回false。
* 1.第一次key不存在,返回true,并新增key,设置过期时间;
* 2.第二次进来,key存在,返回false说明已经锁了。
* @param key
* @param seconds
* @return boolean
*/
public boolean lock(String key, int seconds) {
log.info("{}开始加锁", key); boolean result = this.stringRedisTemplate.opsForValue().setIfAbsent(key, "LOCKED");
log.info("{}锁定完成-{}", key, result); if(result) {
boolean expired = this.stringRedisTemplate.expire(key, seconds, TimeUnit.SECONDS);
log.info("{}设置过期时间{}-{}", key, seconds, expired);
} return result;
}
}
2.自动方式:
添加@Cacheable注解实现缓存添加
添加@CacheEvict注解实现缓存删除
具体实现参考上一篇文章:八、springboot整合redis
九、springboot整合redis二之缓冲配置的更多相关文章
- SpringBoot整合Shiro 二:Shiro配置类
环境搭建见上篇:SpringBoot整合Shiro 一:搭建环境 Shiro配置类配置 shiro的配置主要集中在 ShiroFilterFactoryBean 中 关于权限: anon:无需认证就可 ...
- Springboot整合Redis入门完整篇,零基础入门教学教程
记录一次简易集成Redis缓存 自定义Redisconfig配置 自定义序列化操作 加深印像 整合前提工具环境准备: 1.redis官网 https://redis.io/download 下载安装r ...
- SpringBoot整合Redis、ApachSolr和SpringSession
SpringBoot整合Redis.ApachSolr和SpringSession 一.简介 SpringBoot自从问世以来,以其方便的配置受到了广大开发者的青睐.它提供了各种starter简化很多 ...
- SpringBoot整合Redis及Redis工具类撰写
SpringBoot整合Redis的博客很多,但是很多都不是我想要的结果.因为我只需要整合完成后,可以操作Redis就可以了,并不需要配合缓存相关的注解使用(如@Cacheable). ...
- springboot整合redis——redisTemplate的使用
一.概述 相关redis的概述,参见Nosql章节 redisTemplate的介绍,参考:http://blog.csdn.net/ruby_one/article/details/79141940 ...
- SpringBoot整合Redis使用Restful风格实现CRUD功能
前言 本篇文章主要介绍的是SpringBoot整合Redis,使用Restful风格实现的CRUD功能. Redis 介绍 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-valu ...
- 【SpringBoot | Redis】SpringBoot整合Redis
SpringBoot整合Redis 1. pom.xml中引入Redis相关包 请注意,这里我们排除了lettuce驱动,采用了jedis驱动 <!-- redis的依赖 --> < ...
- Redis-基本概念、java操作redis、springboot整合redis,分布式缓存,分布式session管理等
NoSQL的引言 Redis数据库相关指令 Redis持久化相关机制 SpringBoot操作Redis Redis分布式缓存实现 Resis中主从复制架构和哨兵机制 Redis集群搭建 Redis实 ...
- SpringBoot系列十:SpringBoot整合Redis
声明:本文来源于MLDN培训视频的课堂笔记,写在这里只是为了方便查阅. 1.概念:SpringBoot 整合 Redis 2.背景 Redis 的数据库的整合在 java 里面提供的官方工具包:jed ...
随机推荐
- 【Learning】容斥原理
PPT在这里 https://files.cnblogs.com/files/RogerDTZ/%E5%AE%B9%E6%96%A5%E5%8E%9F%E7%90%86.pdf
- 【hdu2809】 不要62
http://acm.hdu.edu.cn/showproblem.php?pid=2089 (题目链接) 题意 求区间${[n,m]}$中不含有62和4的数的个数. Solution 数位dp板子. ...
- 20135319zl软件破解报告
编写一个简单的C程序.要求只有输入a,才能通过. 现在,使用objdump –d po反汇编这个程序 找到main函数,可以发现movb $0x61,0x1f(%esp)这句语句中是将字符a(对应0x ...
- 构建工具-----Gradle(二)-----myeclipse 10和myeclipse2015安装gradle插件----其他版本的myeclipse类似
我们需要给myeclipse安装gradle的插件.这样myeclipse就能识别到gradle项目了,直接加载进去即可. 我们先安装配置系统命令行的gradle,挺简单的,下载后配置环境变量即可,详 ...
- 使用MyEclipse 2014创建项目
1. 打开MyEclipse 2014,如果是第一次运行,会提示设置workspace路径,如图: WorkSpace路径是指日后你自己利用MyEclipse创建项目时,项目文件的存放路径.通常不要放 ...
- 安装ucenter discuzX
需要先安装ucenter再安装discuzX!! ucenter下载,官网上不大好下载: http://www.comsenz.com/downloads/install/ucenter 下载不了; ...
- element ui 上传文件,读取内容乱码解决
element ui 上传文件,读取内容乱码解决: 加第二个参数 reader.readAsText(file.raw,'gb2312'); <el-upload class="upl ...
- 有用的JavaScript开发小建议
这篇文章将向你分享一些不为人知的但很有用的JavaScript小建议,对那些刚涉及使用JavaScript编程语言的初级开发者应该有很大的帮助. 1. 用数组长度截取数组 我们都知道,对象都是通过使用 ...
- java反射动态加载类Class.forName();
1,所有的new出来的对象都是静态加载的,在程序编译的时候就会进行加载.而使用反射机制Class.forName是动态加载的,在运行时刻进行加载. 例子:直接上两个例子 public class Ca ...
- Chrome截长屏
本文地址:https://www.cnblogs.com/veinyin/p/9257833.html Chrome截取长屏一直是一个痛点,之前尝试过第三方截图工具,但是不是收费就是不怎么好用,今 ...