文章目录
Spring Boot 2.2.1.RELEASE
添加Spring Data Redis相关依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!--spring2.0集成redis所需common-pool2-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
<version>2.4.2</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.60</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
application.yml 添加Redis环境配置
spring:
redis:
# Redis默认情况下有16个分片,这里配置具体使用的分片,默认是0
database: 0
host: localhost
port: 6379
# 连接密码(默认为空)
password:
# 连接超时时间(毫秒)
timeout: 10000ms
lettuce:
pool:
# 连接池最大连接数(使用负值表示没有限制) 默认 8
max-active: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
max-wait: -1
# 连接池中的最大空闲连接 默认 8
max-idle: 8
# 连接池中的最小空闲连接 默认 0
min-idle: 0
Spring Boot自动配置的redisTemplate是RedisTemplate<Object, Object>
可自定义redisTemplate,修改key和value的序列化器
@Configuration
public class RedisConfig {
/**
* Spring data Redis 自定义redisTemplate
* @param factory
* @return
*/
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
RedisTemplate<String, Object> template = new RedisTemplate();
template.setConnectionFactory(factory);
template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(new GenericFastJsonRedisSerializer());
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(new GenericFastJsonRedisSerializer());
return template;
}
}
测试User类
@Data
// 无参构造函数,fastjson序列化需要
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private int id;
private String name;
}
1. 字符串 String
@SpringBootTest
public class OpsForValueTest {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* set
* 可设置超时,偏移量等参数
*/
@Test
public void set() {
redisTemplate.opsForValue().set("redisTemplate_string", "redisTemplate_value");
}
/**
* 由于设置的是10秒失效,十秒之内查询有结果,十秒之后返回为null
* redisTemplate_timeUnit_10 Wed Nov 27 17:05:25 CST 2019
* redisTemplate_timeUnit_10 Wed Nov 27 17:05:26 CST 2019
* redisTemplate_timeUnit_10 Wed Nov 27 17:05:27 CST 2019
* redisTemplate_timeUnit_10 Wed Nov 27 17:05:28 CST 2019
* redisTemplate_timeUnit_10 Wed Nov 27 17:05:29 CST 2019
* redisTemplate_timeUnit_10 Wed Nov 27 17:05:30 CST 2019
* redisTemplate_timeUnit_10 Wed Nov 27 17:05:31 CST 2019
* redisTemplate_timeUnit_10 Wed Nov 27 17:05:32 CST 2019
* redisTemplate_timeUnit_10 Wed Nov 27 17:05:33 CST 2019
* redisTemplate_timeUnit_10 Wed Nov 27 17:05:34 CST 2019
* cannot find
*/
@Test
public void setTime() throws Exception {
redisTemplate.opsForValue().set("redisTemplate_timeUnit","redisTemplate_timeUnit_10",10, TimeUnit.SECONDS);
while (true) {
Object value = redisTemplate.opsForValue().get("redisTemplate_timeUnit");
if (value != null) {
System.out.println(value + " " + new Date());
Thread.sleep(1000);
} else {
System.out.println("cannot find");
break;
}
}
}
/**
* get
*/
@Test
public void get() {
String value = String.valueOf(redisTemplate.opsForValue().get("redisTemplate_string"));
System.out.println(value);
}
/**
* multiSet
*/
@Test
public void multiSet() {
Map<String,String> map = new HashMap<>();
map.put("redisTemplate_map_key_1", "redisTemplate_map_value_1");
map.put("redisTemplate_map_key_2", "redisTemplate_map_value_2");
map.put("redisTemplate_map_key_3", "redisTemplate_map_value_3");
redisTemplate.opsForValue().multiSet(map);
}
/**
* multiGet
*/
@Test
public void multiGet() {
List<String> keys = new ArrayList<>();
keys.add("redisTemplate_map_key_1");
keys.add("redisTemplate_map_key_2");
keys.add("redisTemplate_map_key_3");
System.out.println(redisTemplate.opsForValue().multiGet(keys));
}
/**
* getAndSet
* 设置键的字符串值并返回其旧值
*/
@Test
public void getAndSet() {
String oldValue = String.valueOf(redisTemplate.opsForValue().getAndSet("redisTemplate_string", "redisTemplate_value_new"));
System.out.println(oldValue);
}
/**
* increment
* 自增,再调用自增1
*/
@Test
public void incrementSet() {
stringRedisTemplate.opsForValue().increment("stringTemplate_increment", 1);
}
/**
* 用stringRedisTemplate,在fastJSON转 set
*/
@Test
public void setObject() {
User user = new User(1, "张三");
stringRedisTemplate.opsForValue().set("stringTemplate_object", JSON.toJSONString(user));
}
/**
* 用stringRedisTemplate,在fastJSON转 get
*/
@Test
public void getObject() {
String userJson = stringRedisTemplate.opsForValue().get("stringTemplate_object");
User user = JSON.parseObject(userJson, new TypeReference<User>(){});
System.out.println(user);
}
/**
* 用redisTemplate,value使用fastJSON转 set
*/
@Test
public void setFastJsonObject() {
User user = new User(2, "李四");
redisTemplate.opsForValue().set("redisTemplate_object", user);
}
/**
* 用redisTemplate,value使用fastJSON转 get
*/
@Test
public void getFastJsonObject() {
User user = (User)redisTemplate.opsForValue().get("redisTemplate_object");
System.out.println(user);
}
}
2. 字典 Hash
@SpringBootTest
public class OpsForHashTest {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
/**
* put
* {redisTemplate_hash_key_1=redisTemplate_hash_value_1, redisTemplate_hash_key_2=redisTemplate_hash_value_2, redisTemplate_hash_key_3=redisTemplate_hash_value_3}
*/
@Test
public void put() {
redisTemplate.opsForHash().put("redisTemplate_hash", "redisTemplate_hash_key_1", "redisTemplate_hash_value_1");
redisTemplate.opsForHash().put("redisTemplate_hash", "redisTemplate_hash_key_2", "redisTemplate_hash_value_2");
redisTemplate.opsForHash().put("redisTemplate_hash", "redisTemplate_hash_key_3", "redisTemplate_hash_value_3");
}
/**
* putAll
* {redisTemplate_hash_key_1=redisTemplate_hash_value_1, redisTemplate_hash_key_2=redisTemplate_hash_value_2, redisTemplate_hash_key_3=redisTemplate_hash_value_3,
* redisTemplate_hash_all_key_1=redisTemplate_hash_all_value_1, redisTemplate_hash_all_key_2=redisTemplate_hash_all_value_2}
*/
@Test
public void putAll() {
Map<String, Object> map = new HashMap<>();
map.put("redisTemplate_hash_all_key_1", "redisTemplate_hash_all_value_1");
map.put("redisTemplate_hash_all_key_2", "redisTemplate_hash_all_value_2");
redisTemplate.opsForHash().putAll("redisTemplate_hash", map);
}
/**
* entries
* 获取键值对
*/
@Test
public void entries() {
System.out.println(redisTemplate.opsForHash().entries("redisTemplate_hash"));
}
/**
* 迭代器
*
* redisTemplate_hash_key_1:redisTemplate_hash_value_1
* redisTemplate_hash_key_2:redisTemplate_hash_value_2
* redisTemplate_hash_key_3:redisTemplate_hash_value_3
*/
@Test
public void scan() {
Cursor<Map.Entry<Object, Object>> cursor = redisTemplate.opsForHash().scan("redisTemplate_hash", ScanOptions.NONE);
while(cursor.hasNext()){
Map.Entry<Object, Object> entry = cursor.next();
System.out.println(entry.getKey() + ":" + entry.getValue());
}
}
}
3. 列表 List
@SpringBootTest
public class OpsForListTest {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
/**
* leftPush
* 左插入
* [redisTemplate_lpush_3, redisTemplate_lpush_2, redisTemplate_lpush_1]
*/
@Test
public void leftPush() {
redisTemplate.opsForList().leftPush("redisTemplate_lpush", "redisTemplate_lpush_1");
redisTemplate.opsForList().leftPush("redisTemplate_lpush", "redisTemplate_lpush_2");
redisTemplate.opsForList().leftPush("redisTemplate_lpush", "redisTemplate_lpush_3");
}
/**
* leftPush
* 插入到该值的左边
* [redisTemplate_lpush_3, redisTemplate_lpush_2, redisTemplate_lpush_leftPushPivot, redisTemplate_lpush_1]
*/
@Test
public void leftPushPivot() {
redisTemplate.opsForList().leftPush("redisTemplate_lpush", "redisTemplate_lpush_1", "redisTemplate_lpush_leftPushPivot");
}
/**
* leftPushAll
* list 直接左插入一个list,后面有值也不是添加在原有的list中
* [redisTemplate_lpush_4, [redisTemplate_lpush_list_1, redisTemplate_lpush_list_2, redisTemplate_lpush_list_3], redisTemplate_lpush_3, redisTemplate_lpush_2, redisTemplate_lpush_1]
*/
@Test
public void leftPushAllList() {
redisTemplate.opsForList().leftPush("redisTemplate_lpush_list", "redisTemplate_lpush_1");
redisTemplate.opsForList().leftPush("redisTemplate_lpush_list", "redisTemplate_lpush_2");
redisTemplate.opsForList().leftPush("redisTemplate_lpush_list", "redisTemplate_lpush_3");
List<String> list = new ArrayList<>();
list.add("redisTemplate_lpush_list_1");
list.add("redisTemplate_lpush_list_2");
list.add("redisTemplate_lpush_list_3");
redisTemplate.opsForList().leftPushAll("redisTemplate_lpush_list",list);
redisTemplate.opsForList().leftPush("redisTemplate_lpush_list", "redisTemplate_lpush_4");
}
/**
* leftPushAll
* array 直接左插入在原有list之中
* [redisTemplate_lpush_Array_3, redisTemplate_lpush_Array_2, redisTemplate_lpush_Array_1, redisTemplate_lpush_3, redisTemplate_lpush_2, redisTemplate_lpush_1]
*/
@Test
public void leftPushAllArray() {
String[] array = {
"redisTemplate_lpush_Array_1",
"redisTemplate_lpush_Array_2",
"redisTemplate_lpush_Array_3"
};
redisTemplate.opsForList().leftPushAll("redisTemplate_lpush",array);
}
/**
* leftPushIfPresent
* 向左插入(如果存在)
* 只有key存在,才插入
* 0
* 0
* 1
* 2
* [bb, aa]
*/
@Test
public void leftPushIfPresent() {
System.out.println(redisTemplate.opsForList().leftPushIfPresent("leftPushIfPresent","aa"));
System.out.println(redisTemplate.opsForList().leftPushIfPresent("leftPushIfPresent","bb"));
System.out.println(redisTemplate.opsForList().leftPush("leftPushIfPresent","aa"));
System.out.println(redisTemplate.opsForList().leftPushIfPresent("leftPushIfPresent","bb"));
}
/**
* 删除并返回最左边的值
* [bb, aa]
* bb
*/
@Test
public void leftPop() {
System.out.println(redisTemplate.opsForList().leftPop("leftPushIfPresent"));
}
/**
* rightPush
* 右插入
* [redisTemplate_rpush_1, redisTemplate_rpush_2, redisTemplate_rpush_3]
*/
@Test
public void rightPush() {
redisTemplate.opsForList().rightPush("redisTemplate_rpush", "redisTemplate_rpush_1");
redisTemplate.opsForList().rightPush("redisTemplate_rpush", "redisTemplate_rpush_2");
redisTemplate.opsForList().rightPush("redisTemplate_rpush", "redisTemplate_rpush_3");
}
/**
* rightPush
* 插入到该值的右边
* [redisTemplate_rpush_1, redisTemplate_rpush_rightPushPivot, redisTemplate_rpush_2, redisTemplate_rpush_3]
*/
@Test
public void rightPushPivot() {
redisTemplate.opsForList().rightPush("redisTemplate_rpush", "redisTemplate_rpush_1", "redisTemplate_rpush_rightPushPivot");
}
/**
* rightPushAll
* list 直接右插入一个list,后面有值也不是添加在原有的list中
* [redisTemplate_rpush_1, redisTemplate_rpush_2, redisTemplate_rpush_3, [redisTemplate_rpush_list_1, redisTemplate_rpush_list_2, redisTemplate_rpush_list_3], redisTemplate_rpush_4]
*/
@Test
public void rightPushAllList() {
redisTemplate.opsForList().rightPush("redisTemplate_rpush_list", "redisTemplate_rpush_1");
redisTemplate.opsForList().rightPush("redisTemplate_rpush_list", "redisTemplate_rpush_2");
redisTemplate.opsForList().rightPush("redisTemplate_rpush_list", "redisTemplate_rpush_3");
List<String> list = new ArrayList<>();
list.add("redisTemplate_rpush_list_1");
list.add("redisTemplate_rpush_list_2");
list.add("redisTemplate_rpush_list_3");
redisTemplate.opsForList().rightPushAll("redisTemplate_rpush_list",list);
redisTemplate.opsForList().rightPush("redisTemplate_rpush_list", "redisTemplate_rpush_4");
}
/**
* rightPushAll
* array 直接右插入在原有list之中
* [redisTemplate_rpush_1, redisTemplate_rpush_2, redisTemplate_rpush_3, redisTemplate_rpush_Array_1, redisTemplate_rpush_Array_2, redisTemplate_rpush_Array_3]
*/
@Test
public void rightPushAllArray() {
String[] array = {
"redisTemplate_rpush_Array_1",
"redisTemplate_rpush_Array_2",
"redisTemplate_rpush_Array_3"
};
redisTemplate.opsForList().rightPushAll("redisTemplate_rpush",array);
}
/**
* rightPushIfPresent
* 向右插入(如果存在)
* 只有key存在,才插入
* 0
* 0
* 1
* 2
* [aa, bb]
*/
@Test
public void rightPushIfPresent() {
System.out.println(redisTemplate.opsForList().rightPushIfPresent("rightPushIfPresent","aa"));
System.out.println(redisTemplate.opsForList().rightPushIfPresent("rightPushIfPresent","bb"));
System.out.println(redisTemplate.opsForList().rightPush("rightPushIfPresent","aa"));
System.out.println(redisTemplate.opsForList().rightPushIfPresent("rightPushIfPresent","bb"));
}
/**
* [bb, cc, cc]
* cc
*/
@Test
public void rightPop() {
System.out.println(redisTemplate.opsForList().rightPop("rightPushIfPresent"));
}
/**
* 根据index替换值
* [aa, cc]
*/
@Test
public void set() {
redisTemplate.opsForList().set("rightPushIfPresent",1, "cc");
}
/**
* 根据count次数,删除查找到的值
*
* count > 0,删除从头到尾移动的值的元素。
* count < 0,删除等于从尾到头移动的值的元素。
* count = 0,删除等于value的所有元素。
*
* [aa, aa, bb, cc, cc]
* [bb, cc, cc]
*/
@Test
public void remove() {
// 删除列表中存储的两次出现的值 aa
redisTemplate.opsForList().remove("rightPushIfPresent",2, "aa");
}
/**
* range
*/
@Test
public void range() {
List<Object> list = redisTemplate.opsForList().range("rightPushIfPresent", 0, 10);
System.out.println(list);
}
}
4. 集合 Set
@SpringBootTest
public class OpsForSetTest {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
/**
* [redisTemplate_set_3, redisTemplate_set_2, redisTemplate_set_1]
*/
@Test
public void add() {
redisTemplate.opsForSet().add("redisTemplate_set", "redisTemplate_set_1", "redisTemplate_set_2", "redisTemplate_set_3");
}
/**
* intersect
* 交集
* 可设置keyList,对多个进行交集
*
* intersectAndStore
* 交集保存到另一个set中
*
* [redisTemplate_intersect_3, redisTemplate_intersect_2]
*/
@Test
public void intersect() {
redisTemplate.opsForSet().add("redisTemplate_intersect_1", "redisTemplate_intersect_1", "redisTemplate_intersect_2", "redisTemplate_intersect_3");
redisTemplate.opsForSet().add("redisTemplate_intersect_2", "redisTemplate_intersect_2", "redisTemplate_intersect_3");
System.out.println(redisTemplate.opsForSet().intersect("redisTemplate_intersect_1", "redisTemplate_intersect_2"));
}
/**
* union
* 并集
*
* [redisTemplate_union_4, redisTemplate_union_1, redisTemplate_union_3, redisTemplate_union_2]
*/
@Test
public void union() {
redisTemplate.opsForSet().add("redisTemplate_union_1", "redisTemplate_union_1", "redisTemplate_union_2", "redisTemplate_union_3");
redisTemplate.opsForSet().add("redisTemplate_union_2", "redisTemplate_union_2", "redisTemplate_union_4");
System.out.println(redisTemplate.opsForSet().union("redisTemplate_union_1", "redisTemplate_union_2"));
}
/**
* difference
* 差集
*
* [redisTemplate_difference_1, redisTemplate_difference_3]
* [redisTemplate_difference_4]
*/
@Test
public void difference() {
redisTemplate.opsForSet().add("redisTemplate_difference_1", "redisTemplate_difference_1", "redisTemplate_difference_2", "redisTemplate_difference_3");
redisTemplate.opsForSet().add("redisTemplate_difference_2", "redisTemplate_difference_2", "redisTemplate_difference_4");
System.out.println(redisTemplate.opsForSet().difference("redisTemplate_difference_1", "redisTemplate_difference_2"));
System.out.println(redisTemplate.opsForSet().difference("redisTemplate_difference_2", "redisTemplate_difference_1"));
}
/**
* 迭代器
*
* redisTemplate_set_3
* redisTemplate_set_2
* redisTemplate_set_1
*/
@Test
public void scan() {
Cursor<Object> cursor = redisTemplate.opsForSet().scan("redisTemplate_set", ScanOptions.NONE);
while(cursor.hasNext()){
System.out.println(cursor.next());
}
}
/**
* 获取members
*/
@Test
public void members() {
System.out.println(redisTemplate.opsForSet().members("redisTemplate_set"));
}
}
5. 有序集合 Sorted Set
@SpringBootTest
public class OpsForZSetTest {
@Autowired
private RedisTemplate<String,Object> redisTemplate;
/**
* add
*
* [redisTemplate_zset_2, redisTemplate_zset_1]
*/
@Test
public void add() {
ZSetOperations.TypedTuple<Object> objectTypedTuple1 = new DefaultTypedTuple<>("redisTemplate_zset_1",2.0);
ZSetOperations.TypedTuple<Object> objectTypedTuple2 = new DefaultTypedTuple<>("redisTemplate_zset_2",1.0);
Set<ZSetOperations.TypedTuple<Object>> tuples = new HashSet<>();
tuples.add(objectTypedTuple1);
tuples.add(objectTypedTuple2);
redisTemplate.opsForZSet().add("redisTemplate_zset",tuples);
}
/**
* incrementScore
* 增加score,改变排序
* [redisTemplate_zset_1, redisTemplate_zset_2]
*/
@Test
public void incrementScore() {
redisTemplate.opsForZSet().incrementScore("redisTemplate_zset", "redisTemplate_zset_2", 1.1);
}
/**
* range
*/
@Test
public void range() {
System.out.println(redisTemplate.opsForZSet().range("redisTemplate_zset",0,10));
}
/**
* rangeWithScores
* 根据分数递增返回zset
* value:redisTemplate_zset_1score:2.0
* value:redisTemplate_zset_2score:2.1
*/
@Test
public void rangeWithScores() {
Set<ZSetOperations.TypedTuple<Object>> tuples = redisTemplate.opsForZSet().rangeWithScores("redisTemplate_zset",0,10);
Iterator<ZSetOperations.TypedTuple<Object>> iterator = tuples.iterator();
while (iterator.hasNext()){
ZSetOperations.TypedTuple<Object> typedTuple = iterator.next();
System.out.println("value:" + typedTuple.getValue() + "score:" + typedTuple.getScore());
}
}
/**
* 迭代器
* redisTemplate_zset_1:2.0
* redisTemplate_zset_2:2.1
*/
@Test
public void scan() {
Cursor<ZSetOperations.TypedTuple<Object>> cursor = redisTemplate.opsForZSet().scan("redisTemplate_zset", ScanOptions.NONE);
while (cursor.hasNext()){
ZSetOperations.TypedTuple<Object> item = cursor.next();
System.out.println(item.getValue() + ":" + item.getScore());
}
}
}
6. 基数统计 HyperLogLog
@SpringBootTest
public class HyperLogLogTest {
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* 3
*/
@Test
public void addTest(){
stringRedisTemplate.opsForHyperLogLog().add("hyperLogLog1","value1");
stringRedisTemplate.opsForHyperLogLog().add("hyperLogLog1","value1");
stringRedisTemplate.opsForHyperLogLog().add("hyperLogLog1","value2");
stringRedisTemplate.opsForHyperLogLog().add("hyperLogLog1","value3");
}
/**
* 3
*/
@Test
public void add2Test(){
stringRedisTemplate.opsForHyperLogLog().add("hyperLogLog2","value3");
stringRedisTemplate.opsForHyperLogLog().add("hyperLogLog2","value4");
stringRedisTemplate.opsForHyperLogLog().add("hyperLogLog2","value4");
stringRedisTemplate.opsForHyperLogLog().add("hyperLogLog2","value5");
}
/**
* 将多个 HyperLogLog 合并为一个 HyperLogLog
*/
@Test
public void unionTest(){
stringRedisTemplate.opsForHyperLogLog().union("hyperLogLog","hyperLogLog1","hyperLogLog2");
}
/**
* 5
*/
@Test
public void sizeTest(){
System.out.println(stringRedisTemplate.opsForHyperLogLog().size("hyperLogLog"));
}
}
7. 发布订阅 pub/sub
application.yml 添加配置
server:
port: 8123
redis-channel: redischat
新建一个配置类,添加消息监听容器;亦可在RedisConfig中添加
@Configuration
public class RedisPubSubConfig {
private static String REDIS_CHANNEL;
@Value("${redis-channel:'redischat'}")
public void setUseRedisChannel(String redisChannel) {
REDIS_CHANNEL = redisChannel;
}
/**
* spring data Redis 添加消息监听容器,用于pub/sub
* @param connectionFactory
* @param listenerAdapter
* @return
*/
@Bean
RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory, MessageListenerAdapter listenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
container.addMessageListener(listenerAdapter, new PatternTopic(REDIS_CHANNEL));
return container;
}
}
添加订阅方
@Component
public class Subscriber extends MessageListenerAdapter {
@Autowired
private StringRedisTemplate stringRedisTemplate;
@Override
public void onMessage(Message message, byte[] pattern) {
byte[] body = message.getBody();
byte[] channel = message.getChannel();
String msg = stringRedisTemplate.getStringSerializer().deserialize(body);
String topic = stringRedisTemplate.getStringSerializer().deserialize(channel);
System.out.println("监听到topic为" + topic + "的消息:" + msg);
}
}
启动application,用测试类向该channel发消息
@SpringBootTest
public class PubSubTest {
@Autowired
private StringRedisTemplate stringRedisTemplate;
private static String REDIS_CHANNEL;
@Value("${redis-channel:'redischat'}")
public void setUseRedisChannel(String redisChannel) {
REDIS_CHANNEL = redisChannel;
}
@Test
public void pubTest() {
stringRedisTemplate.convertAndSend(REDIS_CHANNEL, "redis pub/sub test");
}
}
成功获取并打印消息
8. 事务
@SpringBootTest
public class TransactionTest {
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* 事务
*
* resultList 为命令执行结果:
* true
* true
* value1
*/
@Test
public void transactionTest() {
List<Object> resultList = stringRedisTemplate.execute(new SessionCallback<List<Object>>() {
public List<Object> execute(RedisOperations operations) throws DataAccessException {
StringRedisTemplate stringRedisTemplate = (StringRedisTemplate)operations;
stringRedisTemplate.multi();
stringRedisTemplate.opsForValue().set("transaction1", "value1");
stringRedisTemplate.opsForValue().set("transaction2", "value2");
operations.opsForValue().get("transaction1");
return stringRedisTemplate.exec();
}
});
}
}
9. 管道 pipeline
@SpringBootTest
public class PipelineTest {
@Autowired
private StringRedisTemplate stringRedisTemplate;
/**
* pipeline
*
* resultList 为命令执行结果:
* true
* true
* true
* value3
*/
@Test
public void pipelineTest(){
List<Object> resultList = stringRedisTemplate.executePipelined(new RedisCallback<Object>() {
public Object doInRedis(RedisConnection connection) throws DataAccessException {
StringRedisConnection stringRedisConnection = (StringRedisConnection)connection;
stringRedisConnection.set("pipeline1", "value1");
stringRedisConnection.set("pipeline2", "value2");
stringRedisConnection.set("pipeline2", "value3");
stringRedisConnection.get("pipeline2");
return null;
}
});
}
}
参考:
Spring Data Redis 文档
spring-data-redis 2.0 的使用示例代码
spring boot通过Spring Data Redis集成redis
如何使用RedisTemplate访问Redis数据结构
SpringBoot中使用redis事务