Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合能够对关系数据库起到很好的补充做用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。java
(1)数据操做全在内存,读写性能强。
(2)数据结构丰富,支持string,hash,list,set及zset(sorted set)。
(3)支持主从复制,以及数据持久化等mysql
按顺序执行以下命令:web
$ wget http://download.redis.io/releases/redis-5.0.4.tar.gz
$ tar xzf redis-5.0.4.tar.gz
$ cd redis-5.0.4
$ make
$ make install
复制代码
开启服务redis
$ redis-server
复制代码
启动客户机交互测试spring
$ redis-cli -p 6379
127.0.0.1:6379> set k1 k2
OK
127.0.0.1:6379> get k1
"k2"
127.0.0.1:6379>
复制代码
这里使用MyBatis做为持久层框架,使用MySql数据库。sql
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.0.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
复制代码
server:
port: 80
spring:
http:
encoding:
charset: UTF-8
cache:
type: redis
redis:
#redis服务器地址
host: 192.168.78.128
#设置端口号,默认6379
port: 6379
datasource:
driver-class-name: com.mysql.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://localhost:3306/test
#控制台查看SQL执行情况
logging:
level:
com.yurui.rediscache: debug
复制代码
@RunWith(SpringRunner.class)
@SpringBootTest
public class RediscacheApplicationTests {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Test
public void contextLoads() {
stringRedisTemplate.opsForValue().set("k1","v1");
System.out.println(stringRedisTemplate.opsForValue().get("k1"));
}
}
复制代码
测试成功效果: 数据库
一、Linux防火墙没设置好
二、启动服务器前配置文件内没有把bind 127.0.0.1注释掉
三、配置文件中没把protected-mode yes改成no缓存
@Cacheable
能够标记在一个方法上,也能够标记在一个类上。当标记在一个方法上时表示该方法是支持缓存的,当标记在一个类上时则表示该类全部的方法都是支持缓存的。对于一个支持缓存的方法,Spring会在其被调用后将其返回值缓存起来,以保证下次利用一样的参数来执行该方法时能够直接从缓存中获取结果,而不须要再次执行该方法。bash
@CachePut
能够声明一个方法支持缓存功能。与@Cacheable
不一样的是使用@CachePut
标注的方法在执行前不会去检查缓存中是否存在以前执行过的结果,而是每次都会执行该方法,并将执行结果以键值对的形式存入指定的缓存中。服务器
@CacheEvict
是用来标注在须要清除缓存元素的方法或类上的。当标记在一个类上时表示其中全部的方法的执行都会触发缓存的清除操做。@CacheEvict
能够指定的属性有value、key、condition、allEntries和beforeInvocation。
value(cacheName)
@Cacheable
、@CachePut
标注时表示生成的缓存的名称,@CacheEvict
标注时表示将要清空的缓存的名称。
key
在同一名称(类别)下的缓存,须要惟一的key值来标识惟一的缓存,如未指定则会使用默认策略生成的key;
condition
表示缓存操做发生的条件
@Cacheable(cacheNames = "User", key = "#userId")
@GetMapping("/testCacheable/{userId}")
public User testCacheable(@PathVariable("userId") Integer userId) {
// 方法体
}
复制代码
访问/testCacheable/{userId}
时会将返回的User进行缓存,其对应名称为"User",所生成的key为传入进来的userId。
@Component
public class User implements Serializable {
private int userId;
private String username;
// setters,getters,toString()方法已被省略
}
复制代码
因为业务逻辑简单,取消了Service层
@Mapper
public interface UserMapper {
@Insert("insert into user(userId,username) values(#{userId},#{username})")
int userInsert(User user);
@Select("select * from user where userId=#{userId}")
User userQuery(int userId);
}
复制代码
@RestController
public class UserController {
@Autowired
private UserMapper userMapper;
@PostMapping("user")
public String userAdd(User user) {
return userMapper.userInsert(user) != 0 ? "success" : "fail";
}
// 测试Cacheable注解
@Cacheable(cacheNames = "User", key = "#userId")
@GetMapping("/testCacheable/{userId}")
public User testCacheable(@PathVariable("userId") Integer userId) {
return userMapper.userQuery(userId);
}
// 测试CachePut注解
@CachePut(cacheNames = "User", key = "#userId") //缓存名字为"User","userId"做为key
@GetMapping("/testCachePut/{userId}")
public User testCachePut(@PathVariable("userId") Integer userId) {
return userMapper.userQuery(userId);
}
// 测试CacheEvict注解清空指定用户缓存
@CacheEvict(cacheNames = "User", key = "#userId")
@GetMapping("/testCacheEvict/{userId}")
public String testCacheEvict(@PathVariable("userId") Integer userId) {
return "cache for " + userId + " has been flushed";
}
// 测试CacheEvict注解的allEntries属性清空全部用户缓存
@CacheEvict(cacheNames = "User", allEntries = true)
@GetMapping("/testAllEntries")
public String testAllEntries() {
return "All caches have been flushed";
}
}
复制代码
@SpringBootApplication
@EnableCaching // 开启缓存注解
public class RediscacheApplication {
public static void main(String[] args) {
SpringApplication.run(RediscacheApplication.class, args);
}
}
复制代码
测试以前,先经过Postman提交数据,向数据库插入两条记录:
127.0.0.1:6379> flushall
OK
复制代码
分别访问两次
localhost/testCacheable/1
localhost/testCacheable/2
复制代码
控制台打印状况:
127.0.0.1:6379> keys *
1) "User::2"
2) "User::1"
127.0.0.1:6379>
复制代码
可发现,已经使用做为二级缓存。
清空缓存后分别访问两次
localhost/testCachePut/1
localhost/testCachePut/2
复制代码
再访问
localhost/testCacheable/1
复制代码
控制台打印:
@CachePut
注解标注的方法时都会直接从数据库查询,而且查询结果已经存入缓存。
测试前先访问两次@Cacheable
标注的路径完成缓存,而后分别访问
http://localhost/testCacheEvict/1
http://localhost/testCacheable/1
http://localhost/testCacheable/2
复制代码
控制台打印:
测试前先访问两边@Cacheable
标注的路径完成缓存,而后分别访问
http://localhost/testAllEntries
http://localhost/testCacheable/1
http://localhost/testCacheable/2
复制代码
控制台打印:
当咱们使用引入redis的starter
时,容器中默认使用的是RedisCacheManager
。它在操做redis时默认采用JDK的序列化机制,例如redis中查看张三的缓存:
RedisCacheManager
改变采起的序列化机制。
@Configuration
public class Config {
@Bean
public RedisCacheManager JsonCacheManager(RedisConnectionFactory factory) {
RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig()
// 使用GenericJackson2JsonRedisSerializer序列化获得Value
.serializeValuesWith(RedisSerializationContext.SerializationPair.
fromSerializer(new GenericJackson2JsonRedisSerializer()));
return RedisCacheManager.builder(factory)
.cacheDefaults(config)
.build();
}
}
复制代码
缓存以后查看:
RedisCacheConfiguration
中的不一样方法配置。