分布式数据存储 之 Redis(二) —— spring中的缓存抽象
分布式数据存储 之 Redis(二) —— spring中的缓存抽象
一、spring boot 中的 StringRedisTemplate
1.StringRedisTemplate Demo
第一步:引入redis依赖
最重要的依赖
compile('org.springframework.boot:spring-boot-starter-data-redis')
此依赖为springCloud 父项目 依赖(但已添加 redis 依赖)
buildscript {
ext {
springBootVersion = '2.1.2.RELEASE'
}
repositories {
mavenLocal() //maven本地仓库
maven {
url = "http://maven.aliyun.com/nexus/content/groups/public"
}
mavenCentral()//maven中心仓库
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
subprojects {
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
apply plugin: 'io.spring.dependency-management'
group = 'com.lichuang.kukri'
version = '1.0.0'
sourceCompatibility = 1.8
repositories {
mavenLocal() //maven本地仓库
maven {
url = "http://maven.aliyun.com/nexus/content/groups/public"
}
mavenCentral()//maven中心仓库
}
ext {
springCloudVersion = 'Greenwich.RELEASE'
}
dependencies {
compile('org.springframework.boot:spring-boot-starter-actuator')
compile('org.springframework.boot:spring-boot-starter-web')
compile('org.springframework.cloud:spring-cloud-starter')
testCompile('org.springframework.boot:spring-boot-starter-test')
//redis 依赖
compile('org.springframework.boot:spring-boot-starter-data-redis')
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
}
第二步:创建 StringRedisTemplate 的 Bean
由 StringRedisTemplate 的构造函数可知需要 RedisConnectionFactory 的 Bean,又由 RedisConnectionFactory 可知需要 RedisStandaloneConfiguration 的 Bean, RedisStandaloneConfiguration 的构造函数中需要有 hostname 以及 port
@Configuration
@ComponentScan
public class AppConfig {
//xxxTemplate -> 设计模式之一 模板方法设计模式
@Bean
public RedisStandaloneConfiguration redisStandaloneConfiguration(){
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration("hostname",6379);
return redisStandaloneConfiguration;
}
@Bean
public RedisConnectionFactory redisConnectionFactory(){
LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(redisStandaloneConfiguration());
return connectionFactory;
}
@Bean
public StringRedisTemplate stringRedisTemplate(){
StringRedisTemplate redisTemplate = new StringRedisTemplate(redisConnectionFactory());
return redisTemplate;
}
}
第三步:获取 StringRedisTemplate 进行运用
- 添加数据至Redis:
redisTemplate.opsForValue().set("name","test"); - 从Redis 获取数据:
redisTemplate.opsForValue().get("name")
public class RedisServer {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
StringRedisTemplate redisTemplate = applicationContext.getBean(StringRedisTemplate.class);
redisTemplate.opsForValue().set("name","test");
//System.out.println(redisTemplate.opsForValue().get("name"));
/* redisTemplate.watch("name");
redisTemplate.multi();
redisTemplate.exec();*/
}
}
二、 Cache Abstraction
1.核心接口
CachManager
Spring's central cache manager SPI.
方法
Cache getCache(String name);
Collection getCacheNames();
Cache
Interface that defines common cache operations
常见实现类
- ConcurrentMapCache
- RedisCache
- EhCacheCache
KeyGenerator
SimpleKeyGenerator(默认实现类)
2. 常见注解
@Cacheable
如果缓存中有值,则使用缓存中的值;如果没有则执行业务方法并存入缓存中
属性
condition
判断
unless
非
@CachePut
每次都会执行业务方法,并设置缓存
@CacheEvict
每次都会执行业务方法,并删除缓存
3. Cache Abstraction Demo
第一步:引入依赖
dependencies {
compile('org.springframework.boot:spring-boot-starter-data-redis')
compile group: 'org.projectlombok', name: 'lombok', version: '1.18.6'
compile group: 'com.alibaba', name: 'fastjson', version: '1.2.56'
}
第二步:创建 CacheManager 的 Bean
注:
1. GenericFastJsonRedisSerializer 类 使 Value 的 储存方式 为 Josn
@Configuration
@ComponentScan
@MapperScan("com.lichuang.kukri.springcloudproject.config.dao")
@EnableCaching
public class AppConfig {
//xxxTemplate -> 设计模式之一 模板方法设计模式
@Bean
public RedisStandaloneConfiguration redisStandaloneConfiguration(){
RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration("hostname",6379);
return redisStandaloneConfiguration;
}
@Bean
public CacheManager cacheManager(){
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory());
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig()
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(new GenericFastJsonRedisSerializer()));
RedisCacheManager redisCacheManager = new RedisCacheManager(redisCacheWriter,redisCacheConfiguration);
return redisCacheManager;
}
}
第三步:创建 Service
@Service
public class CacheService {
@CachePut(cacheNames = "person")
public Person update(int age){
Person person = new Person();
person.setPersonName("admin");
person.setAge(age);
return person;
}
@Cacheable(cacheNames = "person")
public Person selectP(int age){
Person person = new Person();
person.setPersonName("test");
person.setAge(age);
return person;
}
@Cacheable(cacheNames = "cache")
public String selectC(int i){
System.out.println("select");
return "admin";
}
}
Person.java(实体类)
public class Person {
private String personName;
private int age;
public String getPersonName() {
return personName;
}
public void setPersonName(String personName) {
this.personName = personName;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
第四步:运行
public class RedisServer {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
PersonDao personDao = applicationContext.getBean(PersonDao.class);
List<Person> people = personDao.select();
for (int i = 0; i < people.size(); i++) {
System.out.println(people.get(i).getPersonName() + "-" + people.get(i).getAge());
}
/*CacheService cacheService = applicationContext.getBean(CacheService.class);
for (int i = 0; i < 2; i++) {
//System.out.println(cacheService.selectC(i));
cacheService.update(i);
}*/
}
}
第五步:在 Redis 中获取
127.0.0.1:6379> get cache::0
"\"admin\""
127.0.0.1:6379> get person::0
"{\"@type\":\"com.bean.Person\",\"age\":1,\"name\":\"test\"}"
分布式数据存储 之 Redis(二) —— spring中的缓存抽象的更多相关文章
- 分布式数据存储 之 Redis(一) —— 初识Redis
分布式数据存储 之 Redis(一) -- 初识Redis 为什么要学习并运用Redis?Redis有什么好处?我们步入Redis的海洋,初识Redis. 一.Redis是什么 Redis 是一个 ...
- 使用Spring提供的缓存抽象机制整合EHCache为项目提供二级缓存
Spring自身并没有实现缓存解决方案,但是对缓存管理功能提供了声明式的支持,能够与多种流行的缓存实现进行集成. Spring Cache是作用在方法上的(不能理解为只注解在方法上),其核心思想是 ...
- redis在spring中的配置及java代码实现
1.建一个redis.properties属性文件 # Redis Setting redis.addr = 127.0.0.1 redis.port = 6379 redis.auth = mast ...
- Redis整合Spring结合使用缓存实例
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文介绍了如何在Spring中配置redis,并通过Spring中AOP的思想,将缓存的 ...
- Redis整合Spring结合使用缓存实例(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文介绍了如何在Spring中配置redis,并通过Spring中AOP的思想,将缓存的 ...
- spring中使用缓存
一.启用对缓存的支持 Spring 对缓存的支持最简单的方式就是在方法上添加@Cacheable和@CacheEvict注解, 再添加注解之前,必须先启用spring对注解驱动的支持,基于java的配 ...
- Redis学习总结(3)——Redis整合Spring结合使用缓存实例
摘要:本文介绍了如何在Spring中配置redis,并通过Spring中AOP的思想,将缓存的方法切入到有需要进入缓存的类或方法前面. 一.Redis介绍 什么是Redis? redis是一个key- ...
- Redis整合Spring结合使用缓存实例(三)
一.Redis介绍 什么是Redis? redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set( ...
- 使用Redis在Hibernate中进行缓存
Hibernate是Java编程语言的开放源代码,对象/关系映射框架.Hibernate的目标是帮助开发人员摆脱许多繁琐的手动数据处理任务.Hibernate能够在Java类和数据库表之间以及Java ...
随机推荐
- CocoaPods初体验
之前没用过cocoapods,但是新项目需要用到. 安装cocoapods: 按照官方的: $ sudo gem install cocoapods // 但是什么都没有发生 升级gem $ s ...
- Vue : props 使用细节(父组件传递数据给子组件)
props使用细节 在Vue.js中我们可以使用 props 实现父组件传递数据给子组件,下面我们总结一下props的使用细节 1.基础类型检查 2.必填数据 3.默认值 4.自定义验证函数 其中每一 ...
- POJ2516 Minimum Cost —— 最小费用最大流
题目链接:https://vjudge.net/problem/POJ-2516 Minimum Cost Time Limit: 4000MS Memory Limit: 65536K Tota ...
- js实现域名判断后跳转到指定网址
js实现域名判断后跳转到指定网址,也适用于同一虚拟空间放多个网站: <script> try { if(self.locatio ...
- React引入,运行
1.引入 <script src="https://cdn.bootcss.com/react/15.5.4/react.min.js"></script> ...
- 单选框 复选框 隐藏之后,绑定的change事件在ie中失效的问题
有时候需要对单选框和复选框进行美化,就需要在<input type="radio">和<input type="checkbox">元素 ...
- memset函数学习
memset是计算机中C/C++语言函数.将s所指向的某一块内存中的后n个 字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存 ...
- Java 8中Collection转为Map的方法
Java 8中java.util.stream.Collectors提供了几个方法可用于把Collection转为Map结构,本文记录了个人对其中三个的理解. Method Return Type g ...
- Unity里的人物驱动/换装备/换武器/换衣服/卡通重定位(转)
Unity里的人物驱动/换装备/换武器/换衣服/动画重定位 刚学的过程被这个问题困扰最多. 首先,基本的,大家都知道驱动人物需要骨架.绑骨的Mesh和动画(这三个要是不知道的话就得考虑看看计算机图形学 ...
- 常用JSTL标签
1.判断是否为空 <c:choose> <c:when test="${not empty reportInfo.user_register_orgs.register_o ...