RedisConfig
注解:@Configuration
redisTemplate
参数:RedisConectionFactory factory
返回值:RedisTemplate<String, Object>
方法体逻辑:
- 实例化一个RedisTemplate
- 设置连接工厂
- 设置Key的序列化方式
- setKeySerializer(RedisSerializer.string())
- 设置value的序列化方式
- setValueSerializer(RedisSerializer.json())
- 设置hash的key的序列化方式
- setHashKeySerializer(RedisSerializer.string())
- 设置hash的value的序列化方式
- setHashValueSerializer(RedisSerializer.json())
- template.afterPropertiesSet
- return
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
// 实例化一个redis模板
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
// 为redis模板添加一个添加连接工厂
redisTemplate.setConnectionFactory(factory);
// 设置普通Key的序列化方式
redisTemplate.setKeySerializer(RedisSerializer.string());
// 设置普通Value的序列化方式
redisTemplate.setValueSerializer(RedisSerializer.json());
// 设置HashKey的序列化方式
redisTemplate.setHashKeySerializer(RedisSerializer.string());
// 设置HashValue的序列化方式
redisTemplate.setHashValueSerializer(RedisSerializer.json());
// 设置已经完成配置的标识
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
测试一下使用redisTemplate操作Redis数据库
- String
- Hash
- List
- Set
- SortedSet
- keys相关的操作
- bound
当需要多次访问的时候,可以使用BoundValueOperations来绑定一个key,这样子就不需要每次都把可以传入redisTemplate来进行操作
- 编程式事务
- redisTemplate.execute
- operations.multi()开始事务
- 中间
- return operations.exec()
在事务中,Redis的每个命令会先存放在队列中,事务提交的时候才会一并提交,因此使用redis管理事务的时候,中间不能查询。
@Autowired
private RedisTemplate redisTemplate;
@Test
public void testRedis() {
// 1. 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));
// 2. Hash
String redisHashKey = "test:hash";
redisTemplate.opsForHash().put(redisHashKey, "count", 1);
System.out.println(redisTemplate.opsForHash().get(redisHashKey, "count"));
System.out.println(redisTemplate.opsForHash().increment(redisHashKey, "count", 1));
System.out.println(redisTemplate.opsForHash().get(redisHashKey, "count"));
// 3. List
String redisListKey = "test:list";
redisTemplate.opsForList().leftPush(redisListKey, 1);
redisTemplate.opsForList().leftPush(redisListKey, 2);
redisTemplate.opsForList().leftPush(redisListKey, 3);
redisTemplate.opsForList().leftPush(redisListKey, 4);
redisTemplate.opsForList().leftPush(redisListKey, 5);
redisTemplate.opsForList().leftPush(redisListKey, 6);
System.out.println(redisTemplate.opsForList().rightPop(redisListKey));
System.out.println(redisTemplate.opsForList().range(redisListKey, 0, 4));
// 4. Set
String redisSetKey = "test:set";
redisTemplate.opsForSet().add(redisSetKey, 1, 2, 3, 4, 5);
redisTemplate.opsForSet().add(redisSetKey, 6);
Set members = redisTemplate.opsForSet().members(redisSetKey);
System.out.println(members);
// 5. SortedSet
String redisZSetKey = "test:ZSet";
redisTemplate.opsForZSet().add(redisZSetKey, "学生1", 91);
redisTemplate.opsForZSet().add(redisZSetKey, "学生2", 81);
redisTemplate.opsForZSet().add(redisZSetKey, "学生3", 71);
redisTemplate.opsForZSet().add(redisZSetKey, "学生4", 61);
redisTemplate.opsForZSet().add(redisZSetKey, "学生5", 51);
redisTemplate.opsForZSet().add(redisZSetKey, "学生6", 41);
redisTemplate.opsForZSet().add(redisZSetKey, "学生7", 31);
// 统计有序集合内的元素的数量
System.out.println(redisTemplate.opsForZSet().zCard(redisZSetKey));
// 查找指定key的score
System.out.println(redisTemplate.opsForZSet().score(redisZSetKey, "学生1"));
// 查找指定key的排序,默认是升序的,reverse之后为降序
System.out.println(redisTemplate.opsForZSet().reverseRank(redisZSetKey, "学生7"));
// 查找指定区间的key,默认升序
System.out.println(redisTemplate.opsForZSet().reverseRange(redisZSetKey, 0, 2));
// 6. keys相关的操作
// 删除key
redisTemplate.delete("test:ZSet");
// 判断key是否存在
System.out.println(redisTemplate.hasKey("test:ZSet"));
// 设置key的生存时间
redisTemplate.expire("test:set", 10, TimeUnit.SECONDS);
// 7. bound 访问同一个Key的好帮手 BoundXXXOperations
// String redisKey = "test:count";
// BoundValueOperations operations = redisTemplate.boundValueOps(redisKey);
// operations.increment();
// operations.increment();
// operations.increment();
// operations.increment();
// operations.increment();
// System.out.println(operations.get());
// 8. Redis的编程式事务
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");
operations.opsForSet().add(redisKey, "lisi");
operations.opsForSet().add(redisKey, "wangwu");
// 提交事务
return operations.exec();
}
});
System.out.println(obj);
}