1. 简单使用
1. 实体类 User
public class User implements Serializable {
private String userName;
private String userId;
public User(String userName, String userId) {
this.userName = userName;
this.userId = userId;
}
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
@Override
public String toString() {
return userId + " --- " + userName;
}
}
2. 配置 SingleRedisAppConfig
@Configuration
@Profile("single")
public class SingleRedisAppConfig {
@Bean
public LettuceConnectionFactory redisConnectionFactory() {
System.out.println("使用单机版本");
return new LettuceConnectionFactory(new RedisStandaloneConfiguration("127.0.0.1", 6379));
}
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate redisTemplate = new RedisTemplate();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 可以配置对象的转换规则,比如使用json格式对object进行存储。
// Object --> 序列化 --> 二进制流 --> redis-server存储
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
return redisTemplate;
}
}
3. 简单示例 SingleExampleService
@Service
@Profile("single")
public class SingleExampleService {
// 直接注入StringRedisTemplate,则代表每一个操作参数都是字符串
@Resource
private StringRedisTemplate stringRedisTemplate;
// 参数可以是任何对象,默认由JDK序列化
@Resource
private RedisTemplate redisTemplate;
/**
* 简单的缓存插入功能
*/
public void setByCache(String userId, String userInfo) {
stringRedisTemplate.opsForValue().set(userId, userInfo);
}
/**
* 对象缓存功能
*/
public User findUser(String userId) throws Exception {
User user = null;
// 1、 判定缓存中是否存在
user = (User) redisTemplate.opsForValue().get(userId);
if (user != null) {
System.out.println("从缓存中读取到值:" + user);
return user;
}
// TODO 2、不存在则读取数据库或者其他地方的值
user = new User(userId, "张三");
System.out.println("从数据库中读取到值:" + user);
// 3、 同步存储value到缓存。
redisTemplate.opsForValue().set(userId, user);
return user;
}
}
4. 测试 SingleTests
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
@ActiveProfiles("single") // 设置profile
public class SingleTests {
@Resource
private SingleExampleService exampleService;
@Test
public void setTest() {
exampleService.setByCache("tony", "hahahhaha");
exampleService.setByCache("a", "1");
exampleService.setByCache("foo", "bar");
}
@Test
public void getTest() throws Exception {
User user = exampleService.findUser("tony");
System.out.println(user);
}
}
2. SpringCache 的使用
@Configuration
@Profile("single")
@EnableCaching
// 开启spring cache注解功能
public class SingleRedisAppConfig { }
2. 配置文件修改,添加 Bean cacheManager
// 配置Spring Cache注解功能
@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {
RedisCacheWriter redisCacheWriter = RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory);
RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
RedisCacheManager cacheManager = new RedisCacheManager(redisCacheWriter, redisCacheConfiguration);
return cacheManager;
}
3. 简单实现 SpringCacheService
@Service
@Profile("single")
public class SpringCacheService {
/**
* springcache注解版本(官方大部分资料开始往springboot方向引导,实际上不用springboot,也是差不多的方式)
* value~单独的缓存前缀
* key缓存key 可以用springEL表达式
*/
@Cacheable(cacheManager = "cacheManager", value = "cache-1", key = "#userId")
public User findUserById(String userId) throws Exception {
// 读取数据库
User user = new User(userId, "张三");
System.out.println("从数据库中读取到数据:" + user);
return user;
}
@CacheEvict(cacheManager = "cacheManager", value = "cache-1", key = "#userId")
public void deleteUserById(String userId) throws Exception {
System.out.println("用户从数据库删除成功,请检查缓存是否清除~~" + userId);
}
// 如果数据库更新成功,更新redis缓存
@CachePut(cacheManager = "cacheManager", value = "cache-1", key = "#user.userId", condition = "#result ne null")
public User updateUser(User user) throws Exception {
// 读取数据库
System.out.println("数据库进行了更新,检查缓存是否一致");
return user; // 返回最新内容,代表更新成功
}
}
4. 测试 SpringCacheTests
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
@ActiveProfiles("single") // 设置profile
public class SpringCacheTests {
@Resource
SpringCacheService springCacheService;
// ---------------spring cache注解演示
// get
@Test
public void springCacheTest() throws Exception {
User user = springCacheService.findUserById("tony");
System.out.println(user);
}
// update
@Test
public void springCacheTest2() throws Exception {
springCacheService.updateUser(new User("hhhhhhh-2", "tony"));
User user = springCacheService.findUserById("tony");
System.out.println(user);
}
// delete
@Test
public void springCacheTest3() throws Exception {
springCacheService.deleteUserById("tony");
}
}