九、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 ...
随机推荐
- unable to create new native thread
一.认识问题: 首先我们通过下面这个 测试程序 来认识这个问题:运行的环境 (有必要说明一下,不同环境会有不同的结果):32位 Windows XP,Sun JDK 1.6.0_18, eclipse ...
- UILabel居中显示的方法
在IB中拖出一个UIView @IBOutlet weak var myView: UIView! 下面创建的UILabel是在myView中居中显示 方法1: var label = UILabel ...
- 【BZOJ3609】人人尽说江南好(博弈论)
[BZOJ3609]人人尽说江南好(博弈论) 题面 BZOJ 洛谷 题解 昨天考试的时候,毒瘤出题人出了一个\(noip\)博弈十合一然后他就被阿鲁巴了,因为画面残忍,就不再展开. 这题是他的十合一中 ...
- 主机 & 虚拟机 & 开发板 三者的恩爱情仇
# 主机 & 虚拟机 & 开发板 > 三者网络连通性,使用ping命令检测 @ Bridge 模式 ## 主机 & 虚拟机 主机与虚拟机相当于一个网络里的两台主机,都有各 ...
- 【转载】dfs序七个经典问题
作者:weeping 出处:www.cnblogs.com/weeping/ 原文链接 https://www.cnblogs.com/weeping/p/6847112.html 参考自:<数 ...
- 【学习笔记】BEST定理
害怕忘记简单写一点: 无向图的生成树计数:https://www.cnblogs.com/zj75211/p/8039443.html (*ZJ学长 ORZ ) 有向图的欧拉回路计数:https: ...
- D. Huge Strings Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combined)
http://codeforces.com/contest/868/problem/D 优化:两个串合并 原有状态+ 第一个串的尾部&第二个串的头部的状态 串变为第一个串的头部&第二个 ...
- Navicat数据备份
备份:点击数据库---数据传输 目标:备份地点,数据会传送到yaozh_backup 数据传输成功
- python---基础知识回顾(八)数据库基础操作(sqlite和mysql)
一:sqlite操作 SQLite是一种嵌入式数据库,它的数据库就是一个文件.由于SQLite本身是C写的,而且体积很小,所以,经常被集成到各种应用程序中,甚至在iOS和Android的App中都可以 ...
- Lena与数字图像处理
在数字图像处理中,Lena(Lenna)是一张被广泛使用的标准图片,特别在图像压缩的算法研究中. 黑白Lena图 标准Lena (为什么用这幅图,是因为这图的各个频段的能量都很丰富:即有低频(光滑 ...