九、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 ...
随机推荐
- 【模考】2018.04.08 Travel
Description 有N个人出去旅行,第i个人去A国有Ai种游玩方式,去B国有Bi种游玩方式,问至少有C个人去A国的情况下,所有人的游玩方式有多少种不同的可能. 两种所有人的游玩方式不同当且仅当存 ...
- Valid Parentheses - LeetCode
目录 题目链接 注意点 解法 小结 题目链接 Valid Parentheses - LeetCode 注意点 考虑输入为空的情况 解法 解法一:如果是'('.'{'.'['这三者就入栈,否则就判断栈 ...
- 滥用DNSAdmins权限进行Active Directory提权
0x00 前言 除了在实现自己的DNS服务器功能之外,Microsoft还为该服务器实现自己的管理协议以便于管理与Active Directory域集成.默认情况下,域控制器也是DNS服务器; 大 ...
- %1$s %1$d Android string (java & Android 格式化字符串)
1$s // String%1$d // int //R.string.old:<string name="old">我今年%1$d岁了</string> ...
- 解题:TJOI 2015 组合数学
题面 通过这个题理解了一下反链的概念,更新在图论知识点里了 每个点向右和下连边可以建出一张图,这个题事实上是让我们求图的最小链覆盖.Dilworth定理告诉我们,最小链覆盖等于最长反链(反链:DAG中 ...
- 【纪中集训2019.3.23】IOer
题目 描述 你要在\(m\)天内,刷\(n\)道题,每天可以刷的题的数目不限: 第\(i\)天可以刷的题目的种类是\(ui+v\): 两种刷题的方案不同当且仅当某天刷题的数量不同或者依次刷题的种类不同 ...
- R语言外部数据读取
0 引言 使用R语言.Python等进行数据处理的第一步就是要导入数据(也可以使用UCI数据集),下文主要根据R语言的帮助文档来介绍外部文件数据的导入方法和注意事项.下面先附上一些指令. 1 格式r ...
- C陷阱与缺陷的个人知识点摘录
编译过程的一点心得体会: .h文件其实只在预处理的过程用到,用来将类似#include <stdio.h>这样的行展开为具体内容. 那些标准库或者其他库中的函数,是在链接的过程中连接器把相 ...
- Redis3未授权访问漏洞导致服务器被入侵
今天在腾讯云上搭的开发环境里的一台机器cpu load飚升老高,然后还能登陆上去,top后发现两个可疑进程./root/目录下有修改过的文件./opt目录被干掉了, 后经分析,这台机器上有redis外 ...
- python实现将IP地址转换为数字
话不多说,直接代码 ip_addr='192.168.2.10' # transfer ip to int def ip2long(ip): ip_list=ip.split('.') result= ...