一、介绍
这是Spring组件中一个简单的操作Redis的工具。 暂无其他介绍,直接用吧。
RedisTemplate和StringRedisTemplate的区别
两者的关系是StringRedisTemplate继承RedisTemplate。
2. 两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
3. SDR默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。
StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。
RedisTemplate使用的序列类在在操作数据的时候,比如说存入数据会将数据先序列化成字节数组然后在存入Redis数据库,这个时候打开Redis查看的时候,你会看到你的数据不是以可读的形式展现的,而是以字节数组显示,类似下面
当然从Redis获取数据的时候也会默认将数据当做字节数组转化,这样就会导致一个问题,当需要获取的数据不是以字节数组存在redis当中而是正常的可读的字符串的时候,比如说下面这种形式的数据
二、使用
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
1、操作 String 类型
@SpringBootTest
public class TestString {
@Autowired
private StringRedisTemplate redisTemplate;
/**
* set key value
*/
@Test
public void setValue() {
// set username king
redisTemplate.opsForValue().set("username", "king");
redisTemplate.opsForValue().set("address", "USA");
}
/**
* 设置值并添加超时时间
* set key value
* expire key value
*/
@Test
public void setValueWithExpire() {
// set address china
// expire address 5 ex 5
redisTemplate.opsForValue().set("address", "china", 5, TimeUnit.SECONDS);
}
/**
* 不存在则set
* SET if Not eXists
*/
@Test
public void setIfNotExists() {
// set username king ex 10 nx
Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("username", "king", 10, TimeUnit.SECONDS);
System.out.println(aBoolean);
}
/**
* 如果存在则set
* SET if eXists
*/
@Test
public void setIfExists() {
// set username danyang ex 10 xx
Boolean aBoolean = redisTemplate.opsForValue().setIfPresent("username", "danyang", 10, TimeUnit.SECONDS);
System.out.println(aBoolean);
}
/**
* 获取名字
* get key
*/
@Test
public void getValue() {
// get username
String name = redisTemplate.boundValueOps("username").get();
String name2 = redisTemplate.opsForValue().get("username");
System.out.println(name);
System.out.println(name2);
}
/**
* 删除值
* del key
*/
@Test
public void delValue() {
// del username
Boolean aBoolean = redisTemplate.opsForValue().getOperations().delete("username");
System.out.println(aBoolean);
Boolean aBoolean1 = redisTemplate.delete("address");
System.out.println(aBoolean1);
}
}
2、操作 Hash 类型
redisTemplate.boundHashOps,需要先绑定数据类型 hash
@SpringBootTest
public class TestHash {
@Autowired
private StringRedisTemplate redisTemplate;
/**
* 添加
* hset key field value
*/
@Test
public void put() {
// hset info name 唐僧
redisTemplate.boundHashOps("info").put("name", "唐僧");
// name会覆盖上面的唐僧
Map<String, String> map = new HashMap<>();
map.put("name", "孙悟空");
map.put("address", "china");
map.put("age", "10");
redisTemplate.boundHashOps("info").putAll(map);
}
/**
* 设置超时时间
*/
@Test
public void expire() {
// hset info name 唐僧
redisTemplate.boundHashOps("info").put("name", "唐僧");
redisTemplate.boundHashOps("info").expire(20, TimeUnit.SECONDS);
}
/**
* 添加
* hset key field value
*/
@Test
public void get() {
// hset info name 唐僧
Object object = redisTemplate.boundHashOps("info").get("name");
System.out.println(object);
}
/**
* 添加
* hdel key field
*/
@Test
public void del() {
// hdel key field
Long delete = redisTemplate.boundHashOps("info").delete("name");
System.out.println(delete);
}
/**
* 获取所有key
* hkeys key
*/
@Test
public void hkeys() {
// hkeys key
Set<Object> info = redisTemplate.boundHashOps("info").keys();
System.out.println(info);
Long info1 = redisTemplate.boundHashOps("info").size();
}
/**
* 获取所有value
* hvals key
*/
@Test
public void hvals() {
// hkeys key
List<Object> info = redisTemplate.boundHashOps("info").values();
System.out.println(info);
}
/**
* 不存在则 put
* hexists key field
*/
@Test
public void putIfAbsent() {
// hexists info name
Boolean aBoolean = redisTemplate.boundHashOps("info").putIfAbsent("name", "king");
System.out.println(aBoolean);
}
/**
* 获取多个key的值
* hmget key field field1
*/
@Test
public void multiGet() {
// hmget key name address
List<Object> keys = new ArrayList<>(Arrays.asList("name", "address"));
List info = redisTemplate.boundHashOps("info").multiGet(keys);
System.out.println(info);
}
}
3、操作 List 类型
redisTemplate.boundListOps,需要先绑定数据类型 List
@SpringBootTest
public class TestList {
@Autowired
private StringRedisTemplate redisTemplate;
/**
* 左添加
*/
@Test
public void leftPush() {
// lpush address 1 2 3 4
redisTemplate.boundListOps("address").leftPush("china");
redisTemplate.boundListOps("address").leftPush("japan");
redisTemplate.boundListOps("address").leftPush("usa");
redisTemplate.boundListOps("address").leftPushAll("aa","bb","cc");
}
/**
* 右添加
*/
@Test
public void rightPush() {
// rpush address 1 2 3 4
redisTemplate.boundListOps("address").rightPush("dd");
redisTemplate.boundListOps("address").rightPushAll("11","22","33");
}
/**
* 查看指定范围的数据
* 如果是
*/
@Test
public void rang() {
// lrange key 0 0
List<String> address = redisTemplate.boundListOps("address").range(0, 0);
// lrange key 0 -1 返回所有
List<String> all = redisTemplate.boundListOps("address").range(0, -1);
System.out.println(address);
System.out.println(all);
}
/**
* 左弹出,一次一个
*/
@Test
public void leftPop() {
// lpop key value
String address = redisTemplate.boundListOps("address").leftPop();
System.out.println(address);
}
/**
* 右弹出,一次一个
*/
@Test
public void rightPop() {
// rpop key value
String address = redisTemplate.boundListOps("address").leftPop();
System.out.println(address);
}
/**
* 根据位置查找某个值
*/
@Test
public void searchByIndex() {
String address = redisTemplate.boundListOps("address").index(1);
System.out.println(address);
}
/**
* 删除指定缓存
*/
@Test
public void delete() {
// lrem key count value
redisTemplate.boundListOps("address").remove(1, "china");
}
}
4、操作 Set 类型
redisTemplate.boundSetOps,需要先绑定数据类型 set
@SpringBootTest
public class TestSet {
@Autowired
private StringRedisTemplate redisTemplate;
/**
* 新建,set自动去重
* sadd key value
*/
@Test
public void add() {
// sadd key value
redisTemplate.boundSetOps("name").add("king", "super");
redisTemplate.boundSetOps("name").add("pig");
redisTemplate.boundSetOps("address").add("china", "usa");
}
/**
* 取出所有值
*/
@Test
public void members() {
Set<String> name = redisTemplate.boundSetOps("name").members();
System.out.println(name);
}
/**
* 判断元素 king 是否在集合set(name)中
* sismember key value
*/
@Test
public void sismember() {
// sismember name king
Boolean aBoolean = redisTemplate.boundSetOps("name").isMember("king");
System.out.println(aBoolean);
}
/**
* 删除所有值
* srem key value
*/
@Test
public void deleteValue() {
// srem name pig
redisTemplate.boundSetOps("name").remove("pig");
}
/**
* 获取集合中的元素数量
* scard key
*/
@Test
public void scard() {
// scard
Long size = redisTemplate.boundSetOps("name").size();
System.out.println(size);
}
/**
* 随机获取集合中元素的count数
* srandmember key count
*/
@Test
public void srandmember() {
redisTemplate.boundSetOps("name").getOperations().discard();
}
}
5、操作 ZSet 类型
redisTemplate.boundZSetOps,需要先绑定数据类型 zset
@SpringBootTest
public class TestZset {
@Autowired
private StringRedisTemplate redisTemplate;
/**
* 添加元素
* zadd key [NX|XX] [CH] [INCR] score member [score member ...]
*/
@Test
public void add() {
// zadd name 1000 "king"
redisTemplate.boundZSetOps("name").add("king", 1000);
redisTemplate.boundZSetOps("name").add("supking", 2000);
redisTemplate.boundZSetOps("name").add("zhangsan", 1500);
}
/**
* 返回分数在min到max之间的元素个数
*/
@Test
public void count() {
// zcount key min max
Long count = redisTemplate.boundZSetOps("name").count(1000, 1800);
System.out.println(count);
}
/**
* 获取集合中元素的个数
*/
@Test
public void zcard() {
// zcard name
Long count = redisTemplate.boundZSetOps("name").zCard();
System.out.println(count);
}
/**
* 返回 分数在[mix,max]之间(闭区间) 的元素
*/
@Test
public void rangeByScoreAndReverse() {
// zrangebyscore name 1000 1800(从小到大)
Set<String> strings = redisTemplate.boundZSetOps("name").rangeByScore(1000, 2000);
// 从大到小
Set<String> strings1 = redisTemplate.boundZSetOps("name").reverseRangeByScore(1000, 2000);
System.out.println(strings);
System.out.println(strings1);
}
/**
* 查询 位置在 0,1的元素
* 顺序反转
*/
@Test
public void rangeAndReverse() {
// zrange name 0 1 (分数从小到大)
Set<String> strings = redisTemplate.boundZSetOps("name").range(0, 1);
System.out.println(strings);
// 顺序反转(分数 从大到小)
Set<String> strings1 = redisTemplate.boundZSetOps("name").reverseRange(0, 1);
System.out.println(strings1);
}
/**
* 指定移除元素
*/
@Test
public void remove() {
// zrem name king
Long remove = redisTemplate.boundZSetOps("name").remove("king");
System.out.println(remove);
}
/**
* 增加分数
*/
@Test
public void addScore() {
// zadd name INCR 2000 king
Double aDouble = redisTemplate.boundZSetOps("name").incrementScore("king", 2000);
System.out.println(aDouble);
}
}