一、介绍
这是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 类型
@SpringBootTestpublic class TestString {@Autowiredprivate StringRedisTemplate redisTemplate;/*** set key value*/@Testpublic void setValue() {// set username kingredisTemplate.opsForValue().set("username", "king");redisTemplate.opsForValue().set("address", "USA");}/*** 设置值并添加超时时间* set key value* expire key value*/@Testpublic void setValueWithExpire() {// set address china// expire address 5 ex 5redisTemplate.opsForValue().set("address", "china", 5, TimeUnit.SECONDS);}/*** 不存在则set* SET if Not eXists*/@Testpublic void setIfNotExists() {// set username king ex 10 nxBoolean aBoolean = redisTemplate.opsForValue().setIfAbsent("username", "king", 10, TimeUnit.SECONDS);System.out.println(aBoolean);}/*** 如果存在则set* SET if eXists*/@Testpublic void setIfExists() {// set username danyang ex 10 xxBoolean aBoolean = redisTemplate.opsForValue().setIfPresent("username", "danyang", 10, TimeUnit.SECONDS);System.out.println(aBoolean);}/*** 获取名字* get key*/@Testpublic void getValue() {// get usernameString name = redisTemplate.boundValueOps("username").get();String name2 = redisTemplate.opsForValue().get("username");System.out.println(name);System.out.println(name2);}/*** 删除值* del key*/@Testpublic void delValue() {// del usernameBoolean aBoolean = redisTemplate.opsForValue().getOperations().delete("username");System.out.println(aBoolean);Boolean aBoolean1 = redisTemplate.delete("address");System.out.println(aBoolean1);}}
2、操作 Hash 类型
redisTemplate.boundHashOps,需要先绑定数据类型 hash
@SpringBootTestpublic class TestHash {@Autowiredprivate StringRedisTemplate redisTemplate;/*** 添加* hset key field value*/@Testpublic 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);}/*** 设置超时时间*/@Testpublic void expire() {// hset info name 唐僧redisTemplate.boundHashOps("info").put("name", "唐僧");redisTemplate.boundHashOps("info").expire(20, TimeUnit.SECONDS);}/*** 添加* hset key field value*/@Testpublic void get() {// hset info name 唐僧Object object = redisTemplate.boundHashOps("info").get("name");System.out.println(object);}/*** 添加* hdel key field*/@Testpublic void del() {// hdel key fieldLong delete = redisTemplate.boundHashOps("info").delete("name");System.out.println(delete);}/*** 获取所有key* hkeys key*/@Testpublic void hkeys() {// hkeys keySet<Object> info = redisTemplate.boundHashOps("info").keys();System.out.println(info);Long info1 = redisTemplate.boundHashOps("info").size();}/*** 获取所有value* hvals key*/@Testpublic void hvals() {// hkeys keyList<Object> info = redisTemplate.boundHashOps("info").values();System.out.println(info);}/*** 不存在则 put* hexists key field*/@Testpublic void putIfAbsent() {// hexists info nameBoolean aBoolean = redisTemplate.boundHashOps("info").putIfAbsent("name", "king");System.out.println(aBoolean);}/*** 获取多个key的值* hmget key field field1*/@Testpublic void multiGet() {// hmget key name addressList<Object> keys = new ArrayList<>(Arrays.asList("name", "address"));List info = redisTemplate.boundHashOps("info").multiGet(keys);System.out.println(info);}}
3、操作 List 类型
redisTemplate.boundListOps,需要先绑定数据类型 List
@SpringBootTestpublic class TestList {@Autowiredprivate StringRedisTemplate redisTemplate;/*** 左添加*/@Testpublic void leftPush() {// lpush address 1 2 3 4redisTemplate.boundListOps("address").leftPush("china");redisTemplate.boundListOps("address").leftPush("japan");redisTemplate.boundListOps("address").leftPush("usa");redisTemplate.boundListOps("address").leftPushAll("aa","bb","cc");}/*** 右添加*/@Testpublic void rightPush() {// rpush address 1 2 3 4redisTemplate.boundListOps("address").rightPush("dd");redisTemplate.boundListOps("address").rightPushAll("11","22","33");}/*** 查看指定范围的数据* 如果是*/@Testpublic void rang() {// lrange key 0 0List<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);}/*** 左弹出,一次一个*/@Testpublic void leftPop() {// lpop key valueString address = redisTemplate.boundListOps("address").leftPop();System.out.println(address);}/*** 右弹出,一次一个*/@Testpublic void rightPop() {// rpop key valueString address = redisTemplate.boundListOps("address").leftPop();System.out.println(address);}/*** 根据位置查找某个值*/@Testpublic void searchByIndex() {String address = redisTemplate.boundListOps("address").index(1);System.out.println(address);}/*** 删除指定缓存*/@Testpublic void delete() {// lrem key count valueredisTemplate.boundListOps("address").remove(1, "china");}}
4、操作 Set 类型
redisTemplate.boundSetOps,需要先绑定数据类型 set
@SpringBootTestpublic class TestSet {@Autowiredprivate StringRedisTemplate redisTemplate;/*** 新建,set自动去重* sadd key value*/@Testpublic void add() {// sadd key valueredisTemplate.boundSetOps("name").add("king", "super");redisTemplate.boundSetOps("name").add("pig");redisTemplate.boundSetOps("address").add("china", "usa");}/*** 取出所有值*/@Testpublic void members() {Set<String> name = redisTemplate.boundSetOps("name").members();System.out.println(name);}/*** 判断元素 king 是否在集合set(name)中* sismember key value*/@Testpublic void sismember() {// sismember name kingBoolean aBoolean = redisTemplate.boundSetOps("name").isMember("king");System.out.println(aBoolean);}/*** 删除所有值* srem key value*/@Testpublic void deleteValue() {// srem name pigredisTemplate.boundSetOps("name").remove("pig");}/*** 获取集合中的元素数量* scard key*/@Testpublic void scard() {// scardLong size = redisTemplate.boundSetOps("name").size();System.out.println(size);}/*** 随机获取集合中元素的count数* srandmember key count*/@Testpublic void srandmember() {redisTemplate.boundSetOps("name").getOperations().discard();}}
5、操作 ZSet 类型
redisTemplate.boundZSetOps,需要先绑定数据类型 zset
@SpringBootTestpublic class TestZset {@Autowiredprivate StringRedisTemplate redisTemplate;/*** 添加元素* zadd key [NX|XX] [CH] [INCR] score member [score member ...]*/@Testpublic 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之间的元素个数*/@Testpublic void count() {// zcount key min maxLong count = redisTemplate.boundZSetOps("name").count(1000, 1800);System.out.println(count);}/*** 获取集合中元素的个数*/@Testpublic void zcard() {// zcard nameLong count = redisTemplate.boundZSetOps("name").zCard();System.out.println(count);}/*** 返回 分数在[mix,max]之间(闭区间) 的元素*/@Testpublic 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的元素* 顺序反转*/@Testpublic 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);}/*** 指定移除元素*/@Testpublic void remove() {// zrem name kingLong remove = redisTemplate.boundZSetOps("name").remove("king");System.out.println(remove);}/*** 增加分数*/@Testpublic void addScore() {// zadd name INCR 2000 kingDouble aDouble = redisTemplate.boundZSetOps("name").incrementScore("king", 2000);System.out.println(aDouble);}}
