一、首先导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
二、配置Redis数据源
redis:
host: localhost
port: 6379
password: root
database: 0
三、编写配置类,创建RedisTemplate对象
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate redisTemplate = new RedisTemplate();
//设置连接工厂 包含了redis的连接信息
redisTemplate.setConnectionFactory(connectionFactory);
//设置key的序列化器,把key序列化成String 写入到redis
redisTemplate.setKeySerializer(new StringRedisSerializer());
//设置value的序列化器,把value序列化成String 写入到redis
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
@Bean
public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connectionFactory){
//只需要设置连接工厂
StringRedisTemplate stringRedisTemplate = new StringRedisTemplate(connectionFactory);
return stringRedisTemplate;
}
}
四、通过StringRedisTemplate对象操作不同类型的Redis
@SpringBootTest
class RedisConfigTest {
@Autowired
private RedisTemplate redisTemplate;
@Autowired
private StringRedisTemplate stringRedisTemplate
@Test
public void testString() {
ValueOperations<String, String> ssvo = stringRedisTemplate.opsForValue();
ssvo.set("key1", "value1");
String value1 = ssvo.get("key1");
//设置断言 期望值 -- 实际值
Assertions.assertEquals("value1", value1);
//ex
ssvo.set("key2", "value2", Duration.ofSeconds(20));
//nx
Boolean value3 = ssvo.setIfAbsent("key3", "value3");
Assertions.assertTrue(value3);
//set ex nx
Boolean value4 = ssvo.setIfAbsent("key4", "value4", Duration.ofSeconds(20));
Assertions.assertTrue(value4);
// TODO ttl
Long ttl = stringRedisTemplate.getExpire("key2");
Assertions.assertTrue(ttl < Duration.ofSeconds(30).getSeconds());
// incr
ssvo.set("key5", "10");
Long key5 = ssvo.increment("key5");
Assertions.assertEquals(11l, key5);
// decr
Long key51 = ssvo.decrement("key5");
Assertions.assertEquals(10L, key51);
}
@Test
public void testHash() {
HashOperations<String, String, String> sooo = stringRedisTemplate.opsForHash();
//set
sooo.put("user:1", "username", "zhangsan");
sooo.put("user:1", "age", "18");
sooo.put("user:1", "gender", "1");
sooo.put("user:1", "city", "jinan");
sooo.put("user:1", "classname", "heima62");
//get
String age = sooo.get("user:1", "age");
Assertions.assertEquals("18", age);
String classname = sooo.get("user:1", "classname");
Assertions.assertEquals("heima62", classname);
//del
Long city = sooo.delete("user:1", "city");
String city1 = sooo.get("user:1", "city");
Assertions.assertNull(city1);
//keys
Set<String> keys = sooo.keys("user:1");
Assertions.assertEquals(4, keys.size());
//values
List<String> values = sooo.values("user:1");
Assertions.assertEquals(4, values.size());
Assertions.assertTrue(values.contains("zhangsan"));
}
@Test
public void testList() {
ListOperations<String, String> ssol = stringRedisTemplate.opsForList();
//push
ssol.leftPush("l1", "1");
ssol.leftPush("l1", "9");
ssol.leftPush("l1", "3");
ssol.leftPush("l1", "5");
ssol.leftPush("l1", "3");
//range
List<String> l1 = ssol.range("l1", 0, 2);
Assertions.assertEquals("3", l1.get(0));
Assertions.assertEquals("5", l1.get(1));
//rpop
String l11 = ssol.rightPop("l1");
Assertions.assertEquals("1", l11);
//llen
Long l12 = ssol.size("l1");
Assertions.assertEquals(4l, l12);
//brpop
new Thread(new Runnable() {
@Override
public void run() {
try {
Thread.sleep(5000);
ssol.leftPush("l2", "100");
} catch (InterruptedException e) {
}
}
}).start();
long start = System.currentTimeMillis();
String l2 = ssol.rightPop("l2", Duration.ofSeconds(10));
long end = System.currentTimeMillis();
Assertions.assertNotNull(l2);
Assertions.assertTrue((end-start)>4000);
}
@Test
public void testSet(){
SetOperations<String, String> sso = stringRedisTemplate.opsForSet();
//sadd
sso.add("s1","1","2","4","8","3","6");
sso.add("s2","2","3","4","5","10","9");
//members
Set<String> s1 = sso.members("s1");
Assertions.assertEquals(6,s1.size());
//srem
sso.remove("s1", "6");
Assertions.assertEquals(6,s1.size());
//sinter
Set<String> intersect = sso.intersect("s1", "s2");
Assertions.assertEquals(3,intersect.size());
//sunion
Set<String> union = sso.union("s1", "s2");
Assertions.assertEquals(8,union.size());
}
@Test
public void testZSet(){
ZSetOperations<String, String> sszo = stringRedisTemplate.opsForZSet();
sszo.add("z1","zs",100);
sszo.add("z1","ww",110);
sszo.add("z1","zl",90);
sszo.add("z1","sd",80);
//zrange
Set<String> z1 = sszo.range("z1", 0, -1);
Assertions.assertEquals(4,z1.size());
//reverseRange
Set<String> z2 = sszo.reverseRange("z1", 0, -1);
Assertions.assertEquals(4,z2.size());
//zincrby
sszo.incrementScore("z1", "sd", 100);
Set<String> z11 = sszo.range("z1", 0, -1);
System.out.println(z11.toString());
//zrem
sszo.remove("z1", "ww");
Set<String> z111 = sszo.range("z1", 0, -1);
Assertions.assertEquals(3,z111.size());
}
@Test
public void testCommon(){
ValueOperations<String, String> ssvo = stringRedisTemplate.opsForValue();
ssvo.set("w1","v1",Duration.ofSeconds(20));
//ttl
Long w1 = stringRedisTemplate.getExpire("w1");
System.out.println(w1);
//exists
Boolean w11 = stringRedisTemplate.hasKey("w1");
System.out.println(w11);
//type
DataType w12 = stringRedisTemplate.type("w1");
System.out.println(w12.toString());
//del
stringRedisTemplate.delete("w1");
//unlink
stringRedisTemplate.unlink("w1");
}
}