Spring整合Redis
redis可以用来做缓存等高效率的工作,因为是存在内存中,所有读取速度会非常的快,然后命令也是很简单的,所以项目中就是要多用多练习,但是项目中不能使用命令进行操作redis呀,所以我们要学用 Spring整合Redis
导入依赖
- 导包是一切的开始哈,没这步啥也不是
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 版本号的话,可以自己去Maven中去选择哈,因为,我使用的是SpringBoot 集成的,所以为了包与包之间的兼容性,我就让他直接选择版本了哈。
- 导包结束后,我们还需要对redis进行一定的参数配置
application.properties (redis配置)
spring.redis.database=11
spring.redis.host=localhost
spring.redis.port=6379
- 然后还需要搞一个配置类 我们定义为: RedisConfig
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){
RedisTemplate<String,Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
// 设置这个Key的序列化方式
template.setKeySerializer(RedisSerializer.string());
// 设置普通的Value的序列化方式
template.setValueSerializer(RedisSerializer.json());
// 设置哈希的key的序列化方式
template.setHashKeySerializer(RedisSerializer.string());
// 设置hash的value序列化方式
template.setHashValueSerializer(RedisSerializer.json());
// 使前面的东东生效
template.afterPropertiesSet();
return template;
}
}
- 作用满,重载个方法,然后设置下五种数据类型的序列化,
- 为什么要进行重载呢,就是因为系统自带的那个返回的是Object,而我们的key总是为String类型的,所以我们在自己搞一个。
- 到这里我们就可以进行测试了,然后如果你的redis是采用压缩包的形式,记得把服务器打开哦,程序安装的就不用了,因为,他会自己开的。
创建测试类,然后将我们配置好的Bean注入进去
@Autowired
private RedisTemplate redisTemplate;
字符串类型(String)
@Test
public void testStrings(){ // 向 redis 数据库中存放 String字符串 类型的数据
String redisKey = "test:count";
redisTemplate.opsForValue().set(redisKey,1);
System.out.println(redisTemplate.opsForValue().get(redisKey));
System.out.println(redisTemplate.opsForValue().increment(redisKey));
System.out.println(redisTemplate.opsForValue().decrement(redisKey));
}
哈希类型(Hash)
@Test
public void testHashes(){ // 向 redis 数据库中存放 hash哈希 类型的数据
String redisKey = "test:user";
redisTemplate.opsForHash().put(redisKey,"username","saobao");
redisTemplate.opsForHash().put(redisKey,"age","18");
// 取值
System.out.println(redisTemplate.opsForHash().get(redisKey,"username"));
System.out.println(redisTemplate.opsForHash().get(redisKey,"age"));
}
列表类型(List)
@Test
public void testLists(){ // 向 redis 数据库中存放 List列表 类型的数据
String redisKey = "test:ids";
redisTemplate.opsForList().leftPush(redisKey,101);
redisTemplate.opsForList().leftPush(redisKey,102);
redisTemplate.opsForList().leftPush(redisKey,103);
System.out.println(redisTemplate.opsForList().size(redisKey));
System.out.println(redisTemplate.opsForList().index(redisKey,0)); // 获取0号索引的数据
System.out.println(redisTemplate.opsForList().range(redisKey,0,2)); // 获取 0 - 2 范围内的数据
// 删除 ,弹出数据
redisTemplate.opsForList().leftPop(redisKey);
redisTemplate.opsForList().rightPop(redisKey);
}
集合类型(Set)
@Test
public void testSets(){ // 向 redis 数据库中存放 set集合 类型的数据
String redisKey = "test:teachers";
redisTemplate.opsForSet().add(redisKey,"刘备","张飞","关羽","赵云","诸葛亮");
// 取数据
System.out.println(redisTemplate.opsForSet().size(redisKey));
System.out.println(redisTemplate.opsForSet().pop(redisKey)); // 随机弹出一个数据
System.out.println(redisTemplate.opsForSet().members(redisKey)); // 取所有数据
}
有序集合类型(SortedSet)
@Test
public void testSortedSets(){
String redisKey = "test:students";
redisTemplate.opsForZSet().add(redisKey,"唐僧",80);
redisTemplate.opsForZSet().add(redisKey,"悟空",90);
redisTemplate.opsForZSet().add(redisKey,"猪八戒",50);
redisTemplate.opsForZSet().add(redisKey,"沙僧",70);
redisTemplate.opsForZSet().add(redisKey,"白龙马",60);
System.out.println(redisTemplate.opsForZSet().zCard(redisKey)); // 统计key中有多少个数据
System.out.println(redisTemplate.opsForZSet().score(redisKey,"猪八戒"));
System.out.println(redisTemplate.opsForZSet().rank(redisKey,"猪八戒")); // 由大到小进行排名
System.out.println(redisTemplate.opsForZSet().reverseRank(redisKey,"猪八戒")); // 由小到大进行排名
System.out.println(redisTemplate.opsForZSet().range(redisKey,0,2)); // 小到大取前三
System.out.println(redisTemplate.opsForZSet().reverseRange(redisKey,0,2)); // 大到小取前三
}
redis 公共API
@Test
public void testKeys(){ // 公共API
System.out.println(redisTemplate.hasKey("test:user")); // 判断一个key是否存在
redisTemplate.delete("test:user"); // 删除一个key
System.out.println(redisTemplate.hasKey("test:user"));
redisTemplate.expire("test:students",10, TimeUnit.SECONDS); // 10秒后删除 ,延迟删除key
}
- 要记下来哦!!!
然后当发生一个key要被多次访问的时候,我们可以进行key的注入,这样可以方便后面的使用
关键字Key绑定
@Test
public void testBoundOperations(){ // 多次访问同一个key
String redisKey = "test:count";
BoundValueOperations operations = redisTemplate.boundValueOps(redisKey);
operations.increment();
operations.increment(); // 增加
operations.increment();
System.out.println(operations.get());
}
- mysql作为关系型数据库,有他必须遵守的 ACID 原则
- 而 我们的 redis 作为非关系型数据库,我们虽然不严格要求 ACID 标准
- 但是我们也有自己的事务管理,同时也有相同的
- 声明式事务 和 编程式事务
- 然后我们一般使用 编程式事务 ,因为我们的redis有个不同的就是
- 在事务进行中的时候,是无法进行查询操作的,只有等提交后我们才可以进行查询
- 而声明式事务采用的是注解的方法,最小的针对单位就是 方法
- 而编程式事务可以 针对到 几行代码,
编程式事务(redis)
@Test
public void testTransactional() { // 编程式事务
Object obj = redisTemplate.execute(new SessionCallback() {
@Override
public Object execute(RedisOperations operations) throws DataAccessException {
String redisKey = "test:tx";
operations.multi(); // 启动事务
operations.opsForSet().add(redisKey,"zhangSan","liSi","wanLaoWu");
System.out.println(operations.opsForSet().members(redisKey));
return operations.exec(); // 提交事务
}
});
System.out.println(obj);
}
- 详细记忆,牢记牢记