1.一些概念
1-StringRedisTemplate继承RedisTemplate;
2-两者数据不共通,StringRedisTemplate只管StringRedisTemplate里面的数据,RedisTemplate只管RedisTemplate中的数据;
3-两者序列化类不同,RedisTemplate使用的是JdkSerializationRedisSerializer,存入数据会将数据先序列化成字节数组然后在存入Redis数据库;StringRedisTemplate使用的是StringRedisSerializer。
2.使用
1. opsForSet
@Autowired
private StringRedisTemplate redisTemplate;
//向变量中批量添加值。
redisTemplate.opsForSet().add(Constant.DEVICE_OPT_PREFIX, deviceId);
redisTemplate.expire(Constant.DEVICE_OPT_PREFIX, 5, TimeUnit.MINUTES);
//获取变量中的值
Set<String> deviceIds = redisTemplate.opsForSet().members(Constant.DEVICE_OPT_PREFIX);
2. opsForValue
@Autowired
private StringRedisTemplate redisTemplate;
Set<String> deviceIdOptKeys = redisTemplate.keys(Constant.DEVICE_OPT_PREFIX.concat("*"));
Set<String> failDeviceIds = new HashSet<>();
if (ObjectUtils.isNotEmpty(deviceIdOptKeys)){
failDeviceIds = deviceIdOptKeys.stream().map(x->x.substring(Constant.DEVICE_OPT_PREFIX.length())).collect(Collectors.toSet());
}
if (failDeviceIds.contains(deviceId)){
redisTemplate.opsForValue().append(Constant.DEVICE_OPT_PREFIX + deviceId,"#");
} else {
redisTemplate.opsForValue().set(Constant.DEVICE_OPT_PREFIX + deviceId,"#",30,TimeUnit.MINUTES);
}
redisTemplate.delete(Constant.DEVICE_OPT_PREFIX + deviceId);
// 设置键、值和过期时间
redisTemplate.opsForValue().set(Constant.DEVICE_OPT_PREFIX + deviceId,
"#",
10, TimeUnit.MINUTES);
// 获取键对应的值
String deviceValue = redisTemplate.opsForValue().get(Constant.DEVICE_OPT_PREFIX + deviceId);
3. 操作自增值
将 key 所储存的值加上增量 increment 。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。本操作的值限制在 64 位(bit)有符号数字表示之内。
@Autowired
private StringRedisTemplate redisTemplate;
@Test
void testRedisTemplateIncrement() {
String key = "testRedisTemplateIncrement";
redisTemplate.opsForValue().increment(key);
System.out.println("-get value is:"+redisTemplate.boundValueOps(key).get(0,-1));
System.out.println("get value is:"+redisTemplate.opsForValue().get(key));
redisTemplate.opsForValue().increment(key);
System.out.println("get value is:"+redisTemplate.opsForValue().get(key));
redisTemplate.opsForValue().decrement(key);
System.out.println("get value is:"+redisTemplate.opsForValue().get(key));
}
4. opsForZSet
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@RunWith(SpringRunner.class)
@Slf4j
public class ZSetDemo {
@Autowired
private StringRedisTemplate redisTemplate;
@Test
public void testAdd() {
//向集合中插入元素,并设置分数
redisTemplate.opsForZSet().add("zset-rank", "p1", 2.1);
//向集合中插入多个元素
DefaultTypedTuple<String> tuple1 = new DefaultTypedTuple<String>("p2", 1.1);
DefaultTypedTuple<String> tuple2 = new DefaultTypedTuple<String>("p3", 3.1);
redisTemplate.opsForZSet().add("zset-rank", new HashSet<>(Arrays.asList(tuple1, tuple2)));
//向集合中插入元素,并设置分数
redisTemplate.opsForZSet().add("zset-rank", "p1", System.currentTimeMillis());
//打印
printZSet("zset-rank");
}
@Test
public void testRemove() {
printZSet("zset-rank");
//从集合中删除指定元素
redisTemplate.opsForZSet().remove("zset-rank", "p1");
printZSet("zset-rank");
}
@Test
public void testIncrementScore() {
//为指定元素加分
Double score = redisTemplate.opsForZSet().incrementScore("zset-rank", "p1", 2);
System.out.println(score);//返回加分后的得分
printZSet("zset-rank");
}
@Test
public void testRank() {
//返回指定成员的排名(从小到大)
Long rank = redisTemplate.opsForZSet().rank("zset-rank", "p1");
//从大到小
Long reverseRank = redisTemplate.opsForZSet().reverseRank("zset-rank", "p1");
System.out.println(rank);
System.out.println(reverseRank);
}
@Test
public void testSetScore() {
//向集合中插入元素,并设置分数
redisTemplate.opsForZSet().add("zset-rank", "p1", System.currentTimeMillis());
//返回集合内元素的排名,以及分数(从小到大)
Set<ZSetOperations.TypedTuple<String>> tuples = redisTemplate.opsForZSet().rangeWithScores("zset-rank", 0, -1);
for (ZSetOperations.TypedTuple<String> tuple : tuples) {
System.out.println(tuple.getValue() + " : " + tuple.getScore());
}
}
@Test
public void testRangeByScore() {
//返回集合内元素在指定分数范围内的排名(从小到大)
// Set<String> ranking = redisTemplate.opsForZSet().rangeByScore("zset-rank", 0, 5);
// System.out.println(ranking);
// redisTemplate.opsForZSet().add("zset-rank", "p1", System.currentTimeMillis());
// redisTemplate.expire("zset-rank",1, TimeUnit.MINUTES);
Set<String> ranking2 = redisTemplate.opsForZSet().rangeByScore("zset-rank", 0, System.currentTimeMillis());
//带偏移量和个数,下例意为从第二个开始,要三个
Set<String> ranking2 = redisTemplate.opsForZSet().rangeByScore("zset-rank", 0, System.currentTimeMillis(), 0, 3);
System.out.println(ranking2);
}
@Test
public void testCount() {
//返回集合内指定分数范围的成员个数
Long count = redisTemplate.opsForZSet().count("zset-rank", 0, 2);
System.out.println(count);
//返回集合内的成员个数
Long size = redisTemplate.opsForZSet().size("zset-rank");//等同于zCard(key);
System.out.println(size);
}
@Test
public void testScore() {
//获得指定元素的分数
Double score = redisTemplate.opsForZSet().score("zset-rank", "p1");
System.out.println(score);
}
@Test
public void testRemoveRange() {
//删除指定索引范围的元素
printZSet("zset-rank");
redisTemplate.opsForZSet().removeRange("zset-rank", 0, 0);
printZSet("zset-rank");
}
@Test
public void testRemoveRangeByScore() {
//删除指定分数范围内的元素
printZSet("zset-rank");
redisTemplate.opsForZSet().removeRangeByScore("zset-rank", 4, 5);
printZSet("zset-rank");
redisTemplate.opsForZSet();
}
private void printZSet(String key) {
//按照排名先后(从小到大)打印指定区间内的元素, -1为打印全部
Set<String> range = redisTemplate.opsForZSet().range(key, 0, -1);
//reverseRange 从大到小
System.out.println(range);
}
}
5. keys 和 scan 使用
Set<String> matchKeys = redisTemplate.keys(deviceId + ":*");
- keys的操作会导致数据库暂时被锁住,其他的请求都会被堵塞;业务量大的时候会出问题
- 当需要模糊匹配扫描key,匹配出自己需要的key时,可以使用scan命令
public Set<String> scan(String matchKey) {
Set<String> keys = redisTemplate.execute((RedisCallback<Set<String>>) connection -> {
Set<String> keysTmp = new HashSet<>();
Cursor<byte[]> cursor = connection.scan(new ScanOptions.ScanOptionsBuilder() .match("*" + matchKey + "*").count(1000).build());
while (cursor.hasNext()) {
keysTmp.add(new String(cursor.next()));
}
return keysTmp;
});
return keys;
}