博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring 整合 Redis
阅读量:5102 次
发布时间:2019-06-13

本文共 7183 字,大约阅读时间需要 23 分钟。

pom构建:

org.springframework.data
spring-data-redis
1.6.0.RELEASE
org.springframework
spring-test
3.1.2.RELEASE
test
redis.clients
jedis
2.9.0
junit
junit
4.8.2
test

spring配置文件(applicationContext.xml):

开启Spring采用CGLIB代理

redis.properties:

# Redis settingsredis.host=192.168.1.39redis.port=6379redis.pass=jayredis.timeout=0redis.maxIdle=300redis.maxTotal=50redis.maxWaitMillis=1000redis.testOnBorrow=trueredis.testOnReturn=true

Java代码:

自己实现的缓存类 RedisCache

package com.github.util;import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.IOException;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import org.springframework.cache.Cache;import org.springframework.cache.support.SimpleValueWrapper;import org.springframework.dao.DataAccessException;import org.springframework.data.redis.connection.RedisConnection;import org.springframework.data.redis.core.RedisCallback;import org.springframework.data.redis.core.RedisTemplate;public class RedisCache implements Cache {private RedisTemplate
redisTemplate;private String name;public RedisTemplate
getRedisTemplate() { return redisTemplate;}public void setRedisTemplate(RedisTemplate
redisTemplate) { this.redisTemplate = redisTemplate;}public void setName(String name) { this.name = name;}@Overridepublic String getName() { return this.name;}@Overridepublic Object getNativeCache() { return this.redisTemplate;}@Overridepublic ValueWrapper get(Object key) { System.out.println("get key"); final String keyf = key.toString(); Object object = null; object = redisTemplate.execute(new RedisCallback
() { public Object doInRedis(RedisConnection connection) throws DataAccessException { byte[] key = keyf.getBytes(); byte[] value = connection.get(key); if (value == null) { return null; } return toObject(value); } }); return (object != null ? new SimpleValueWrapper(object) : null);}@Overridepublic void put(Object key, Object value) { System.out.println("put key"); final String keyf = key.toString(); final Object valuef = value; final long liveTime = 10 * 6; //86400一天 redisTemplate.execute(new RedisCallback
() { public Long doInRedis(RedisConnection connection) throws DataAccessException { byte[] keyb = keyf.getBytes(); byte[] valueb = toByteArray(valuef); connection.set(keyb, valueb); if (liveTime > 0) { connection.expire(keyb, liveTime); } return 1L; } });}private byte[] toByteArray(Object obj) { byte[] bytes = null; ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { ObjectOutputStream oos = new ObjectOutputStream(bos); oos.writeObject(obj); oos.flush(); bytes = bos.toByteArray(); oos.close(); bos.close(); } catch (IOException ex) { ex.printStackTrace(); } return bytes;}private Object toObject(byte[] bytes) { Object obj = null; try { ByteArrayInputStream bis = new ByteArrayInputStream(bytes); ObjectInputStream ois = new ObjectInputStream(bis); obj = ois.readObject(); ois.close(); bis.close(); } catch (IOException ex) { ex.printStackTrace(); } catch (ClassNotFoundException ex) { ex.printStackTrace(); } return obj;}@Overridepublic void evict(Object key) { System.out.println("del key"); final String keyf = key.toString(); redisTemplate.execute(new RedisCallback
() { public Long doInRedis(RedisConnection connection) throws DataAccessException { return connection.del(keyf.getBytes()); } });}@Overridepublic void clear() { System.out.println("clear key"); redisTemplate.execute(new RedisCallback
() { public String doInRedis(RedisConnection connection) throws DataAccessException { connection.flushDb(); return "ok"; } });}@Overridepublic
T get(Object key, Class
type) { return null;}@Overridepublic ValueWrapper putIfAbsent(Object key, Object value) { return null;}}

注意:

spring配置文件中的

name 的value 可以自定义 。后面方法注解的value要和这个对应

对Redis不懂的看这篇文章.

这里配置就完成了。可以直接在service方法上面开启注解:

有4个注解@Cacheable,@CachePut , @CacheEvict,@CacheConfig
@Cacheable、@CachePut、@CacheEvict 注释介绍
@Cacheable 作用和配置方法
@Cacheable 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存
@Cacheable 主要的参数
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个例如:这里和上面的name 的value对应,楼主这里写的是common
@Cacheable(value=”mycache”) 或者
@Cacheable(value={”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合例如:
@Cacheable(value=”testcache”,key=”#userName”)
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存例如:
@Cacheable(value=”testcache”,condition=”#userName.length()>2”)


--

@CachePut 作用和配置方法

@CachePut 的作用 主要针对方法配置,能够根据方法的请求参数对其结果进行缓存,和 @Cacheable 不同的是,它每次都会触发真实方法的调用
@CachePut 主要的参数
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个例如:
@Cacheable(value=”mycache”) 或者
@Cacheable(value={”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合例如:
@Cacheable(value=”testcache”,key=”#userName”)
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才进行缓存例如:
@Cacheable(value=”testcache”,condition=”#userName.length()>2”)

@CachePut 不同的是不管有没有缓存,都会调用方法.使用于 数据库的插入

//

@CacheEvict 作用和配置方法

@CachEvict 的作用 主要针对方法配置,能够根据一定的条件对缓存进行清空
@CacheEvict 主要的参数
value 缓存的名称,在 spring 配置文件中定义,必须指定至少一个例如:
@CachEvict(value=”mycache”) 或者
@CachEvict(value={”cache1”,”cache2”}
key 缓存的 key,可以为空,如果指定要按照 SpEL 表达式编写,如果不指定,则缺省按照方法的所有参数进行组合例如:
@CachEvict(value=”testcache”,key=”#userName”)
condition 缓存的条件,可以为空,使用 SpEL 编写,返回 true 或者 false,只有为 true 才清空缓存例如:
@CachEvict(value=”testcache”,
condition=”#userName.length()>2”)
allEntries 是否清空所有缓存内容,缺省为 false,如果指定为 true,则方法调用后将立即清空所有缓存例如:
@CachEvict(value=”testcache”,allEntries=true)
beforeInvocation 是否在方法执行前就清空,缺省为 false,如果指定为 true,则在方法还没有执行的时候就清空缓存,缺省情况下,如果方法执行抛出异常,则不会清空缓存例如:
@CachEvict(value=”testcache”,beforeInvocation=true)

额外补充:

知道你们注意到一个问题没有,就是所有的@Cacheable()里面都有一个value=“xxx”的属性,这显然如果方法多了,写起来也是挺累的,如果可以一次性声明完 那就省事了,
所以,有了@CacheConfig这个配置,@CacheConfig is a class-level annotation that allows to share the cache names,不过不用担心,如果你在你的方法写别的名字,那么依然以方法的名字为准。
注释在类上面
@CacheConfig(cacheNames = "common")

转载于:https://www.cnblogs.com/zhousiwei/p/10625764.html

你可能感兴趣的文章
判断一个数是偶数还是素数 做相应处理并排序输出
查看>>
进制转换问题
查看>>
Docker 容器的数据管理
查看>>
驱动相关Error
查看>>
补坑:Prufer 编码总结
查看>>
mysql5.4数据库安装_mysql数据库5.6.45安装后的配置(离线安装包版)
查看>>
Mysql 自动加锁_MYSQL事务 SELECT会自动加锁 及乐观锁
查看>>
mysql 表情字符集_mysql Emoji表情字符集转换
查看>>
iis看mysql连接数_关于IIS连接数和在线人数的详细说明_MySQL
查看>>
mysql数据库语句q_常用的Mysql数据库操作语句大全
查看>>
session 设置1个月_1个月学会识图算量,2个月编清单组价,3个月独立做造价
查看>>
linux mysql的使用_linux下mysql的使用
查看>>
mysql缓存 碎片_有关mysql查询缓存的内存碎片
查看>>
mysql单节点大事务限制是哪个参数_java面试题汇总 转自多处
查看>>
python魔鬼训练营作业_python魔鬼训练营系列教程
查看>>
mac npm全局依赖包变量_如何管理NPM全局包
查看>>
ubuntu mysql修改root密码_ubuntu10.10中修改mysql root用户密码的方法
查看>>
使用命令创建mysql_用命令创建MySQL数据库
查看>>
mysql的NLJ_mysql的join buffer-阿里云开发者社区
查看>>
pythonselenium说明_python+selenium方法大全
查看>>