spring boot整合redis基本操作

准备工作

引入依赖

 org.springframework.bootspring-boot-starter-test2.6.10org.springframework.bootspring-boot-starter-data-redis2.6.10compilecom.alibabafastjson1.2.58compile

修改序列号方式

    @Beanpublic RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {RedisTemplate template = new RedisTemplate<>();template.setConnectionFactory(redisConnectionFactory);template.setDefaultSerializer(new FastJsonRedisSerializer<>(Object.class));return template;}

配置redis

spring:redis:host: 192.168.208.139

编写主启动类

@SpringBootApplication
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}
}

编写测试类

@SpringBootTest
public class TestApplication {@Autowiredprivate RedisTemplate redisTemplate;}

数据类型

Redis是一种高性能的键值存储系统,支持多种数据类型。以下是Redis中常见的数据类型及其说明:

1. 字符串(String):字符串是Redis中最基本的数据类型,可以存储任意类型的数据,如整数、浮点数、二进制数据等。

2. 列表(List):列表是一个有序的字符串集合,可以在列表的两端进行插入和删除操作。可以用于实现队列、栈等数据结构。

3. 哈希(Hash):哈希是一个键值对的集合,类似于关联数组。可以用于存储对象的属性和值,支持快速的查找和更新操作。

4. 集合(Set):集合是一个无序的字符串集合,不允许重复的元素。可以进行交集、并集、差集等集合操作。

5. 有序集合(Sorted Set):有序集合是一个有序的字符串集合,每个元素都关联着一个分数,可以根据分数进行排序。可以用于实现排行榜、优先级队列等功能。

6. 地理空间索引(Geospatial Index):地理空间索引是Redis 3.2版本引入的数据类型,用于存储地理位置信息,并支持根据距离进行查询。

这些数据类型在Redis中都有对应的命令和操作,可以根据具体的需求选择合适的数据类型来存储和操作数据。

字符串操作

存值

@Testvoid testStrSet(){ValueOperations operations = redisTemplate.opsForValue();//value设置为 key。operations.set("key","正常的value");//value为 的 key设置 和 过期timeout时间operations.set("key1","有过期时间的value",10, TimeUnit.SECONDS);//key用给定value的 覆盖从指定offset开始的部分operations.set("key2","有offset",3);//如果存在就修改operations.setIfPresent("key1","有过期时间的value",10, TimeUnit.SECONDS);//如果不存在就添加operations.setIfAbsent("key1","有过期时间的value",10, TimeUnit.SECONDS);Map map=new HashMap();map.put("map1","111");map.put("map2","222");//一次设置多个operations.multiSet(map);Map map1=new HashMap();map1.put("map3","3333");map1.put("map4","444");//如果map中一个元素也不存在就设置Boolean aBoolean = operations.multiSetIfAbsent(map1);System.out.println(aBoolean);//获取老值并设置新值Object andSet = operations.getAndSet("key", "newvalue");System.out.println(andSet);operations.set("append","22");//给key追加operations.append("append","333");operations.set("num",10);//给key减一  值必须是数字operations.decrement("num");//给key减2  值必须是数字Long num = operations.decrement("num", 2);System.out.println(num);//给key加一  值必须是数字operations.increment("num");//给key加2  值必须是数字operations.increment("num",2);}

取值

    @Testvoid testStrGet(){ValueOperations operations = redisTemplate.opsForValue();operations.set("key",123456789);//获取keyObject key = operations.get("key");System.out.println(key);//获取key的值的字符串前五位 如下面获取的值是12345String key1 = operations.get("key", 0, 4);System.out.println(key1);//获取key的值并设置过期时间Object key2 = operations.getAndExpire("key", 10, TimeUnit.SECONDS);System.out.println(key2);//获取key值并删除Object key3 = operations.getAndDelete("key");System.out.println(key3);//获取key的值,并删除它的过期时间Object key4 = operations.getAndPersist("key");System.out.println(key4);operations.set("key2",2131);//获取多个key的值List list = operations.multiGet(Arrays.asList("key", "key2"));System.out.println(list);}

hash操作

存值

    @Testvoid testHashPut(){//类似map 一个map中有多个kv键值对String key="map";HashOperations operations = redisTemplate.opsForHash();//添加集合map中添加一个属性和值operations.put(key,"name","张三");operations.put(key,"age",22);Map data=new HashMap();data.put("gender","man");data.put("address","南京");//添加集合map中添加mapoperations.putAll(key,data);//如果不存在就添加operations.putIfAbsent(key,"age",22);}

取值

 @Testvoid testHashGet(){//类似map 一个map中有多个kv键值对String key="map";HashOperations operations = redisTemplate.opsForHash();//查询集合map中一个属性和值Object name = operations.get(key, "name");System.out.println(name);//获取集合map的值Map entries = operations.entries(key);System.out.println(entries);//获取一个集合中的多个属性值List list = operations.multiGet(key, Arrays.asList("name", "age"));System.out.println(list);//获取一个集合的所有的key集合Set keys = operations.keys(key);System.out.println(keys);//获取一个集合的所以值集合List values = operations.values(key);System.out.println(values);//查询key中的所有kvCursor scan = operations.scan(key, ScanOptions.NONE);while (scan.hasNext()){Object next = scan.next();System.out.println(next);}String pattern="*a*";//*是通配符Long count=2L; //每次查返回的数目,不是分页,而是每次查多少条数据,查完为止,例如匹配有十条数据,这边写2,就需要消耗五次io,但结果返回是十条数据//查询key包含a的kvScanOptions build = ScanOptions.scanOptions().match("*a*").count(2).build();Cursor scan1 = operations.scan(key, build);while (scan1.hasNext()){Object next = scan1.next();System.out.println(next);}//给集合key中的num加一(没有这个属性就创建 初始值是0 然后加一)operations.increment(key,"num",1);//是否包含牧歌属性Boolean num = operations.hasKey(key, "num");System.out.println(num);//查看属性的长度Long length = operations.lengthOfValue(key, "num");System.out.println(length);//          随机获取集合中的两个kvMap map = operations.randomEntries(key, 2);System.out.println(map);//随机获取集合中的一个kvMap.Entry entry = operations.randomEntry(key);System.out.println(entry);//随机获取集合中的一个keyObject o = operations.randomKey(key);System.out.println(o);//随机获取集合中两个keyList list1 = operations.randomKeys(key, 2);System.out.println(list1);//删除集合中多个keyoperations.delete(key,"num","age");}

list操作

存值

  @Testvoid testListPush() {String key = "list";ListOperations operations = redisTemplate.opsForList();//向集合左边加入值,如果集合不存在就创建集合operations.leftPush(key, 11);operations.leftPush(key, 22);//向集合又边加入值operations.rightPush(key, 33);//查询索引是0-2的值,如果end为-1就是查询全部List range = operations.range(key, 0, 2);System.out.println(range);//向集合左边加入集合operations.leftPushAll(key, Arrays.asList(4, 5, 6));//向集合又边加入集合operations.rightPushAll(key, Arrays.asList(4, 5, 6));//如果存在就向左边添加operations.leftPushIfPresent(key, 22);//更新list中索引是0的值为1 (找不到对应的索引会报错)operations.set(key, 0, "1");String key1 = "list1";String key2 = "list2";operations.leftPushAll(key1, Arrays.asList(1, 2, 3));operations.leftPushAll(key2, Arrays.asList(4, 5, 6));//将key中头部第一个移到key1中的头部operations.move(ListOperations.MoveFrom.fromHead(key1), ListOperations.MoveTo.toHead(key2));//list1=> 3 2 1  => 2 1   list2 => 6 5 4 => 3 6 5 4String key3 = "list3";operations.leftPushAll(key3, Arrays.asList("ss", "hhh", "dsfs", "hhh", "23", "hhh"));//从左边开始删除前两个hhhoperations.remove(key3, 2, "hhh");String key4 = "list4";operations.leftPushAll(key4, Arrays.asList("11", "22", "33", "44"));//截取list4,只取索引1-3的数据operations.trim(key4, 1, 3);List range1 = operations.range(key4, 0, -1);System.out.println(range1);//[ 33,22,11]String key5 = "list5";operations.leftPushAll(key5, Arrays.asList("11", "22", "33", "44"));//更新operations.set(key5, 2, "222");List range2 = operations.range(key5, 0, -1);System.out.println(range2);//[44, 33, 222, 11]}

取值

 @Testvoid testListPop() {String key6 = "list6";ListOperations operations = redisTemplate.opsForList();operations.leftPushAll(key6, Arrays.asList(1, 2, 3, 4, 5));//获取指定索引的数据Object value = operations.index(key6, 2);System.out.println(value);//获取指定索引范围的数据  end为-1时是查询start后面的所有数据List range = operations.range(key6, 0, 3);System.out.println(range);//获取指定值的索引Long index = operations.indexOf(key6, 3);System.out.println(index);//获取指定值在集合中的最后一个索引位置Long lastIndex = operations.lastIndexOf(key6, 3);System.out.println(lastIndex);//从左边取集合移除并返回第一个元素Object o = operations.leftPop(key6);//从集合左边移除并返回3个元素List list = operations.leftPop(key6, 3);//去集合中取元素,最多等待十秒钟,如果取不到就返回Object o1 = operations.leftPop(key6, 10, TimeUnit.SECONDS);System.out.println(o1);String key7 = "list7";//从list6中移除右边第一个元素到list7中的左边第一个位置,最多等待十秒钟operations.rightPopAndLeftPush(key6, key7, 10, TimeUnit.SECONDS);}

set操作

    @Testvoid testSet() {SetOperations operations = redisTemplate.opsForSet();String key = "set";//向集合set中添加元素operations.add(key,11,22,33);String key1 = "set1";//向集合set中添加元素operations.add(key1,44,33,55);//取第一个元素Object pop = operations.pop(key);System.out.println(pop);//去前两个元素List pop1 = operations.pop(key, 2);//取两个集合的并集Set union = operations.union(Arrays.asList(key,key1));System.out.println(union);String key2="set2";//将两个集合的并集存储到另一个集合中operations.unionAndStore(Arrays.asList(key,key1),key2);//取所有集合的并集Set union1 = operations.union(key, Arrays.asList(key1, key2));//取集合的交集Set intersect = operations.intersect(Arrays.asList(key, key1, key2));String key3="set3";//将集合的交集存到另一个集合中operations.intersectAndStore(key,Arrays.asList(key1,key2),key3);//获取集合的差集Set difference = operations.difference(Arrays.asList(key, key1, key2));//将集合的差集存放到另一个集合中operations.differenceAndStore(key, Arrays.asList(key1, key2), key3);//判断1是不是key中的元素Boolean member = operations.isMember(key, 1);//判断元素是不是集合中的Map member1 = operations.isMember(key, 1, 2, 3);//从集合中随机获取不同的几个元素Set set = operations.distinctRandomMembers(key, 3);//从集合中随机获取可重复的元素List list = operations.randomMembers(key, 2);//将3从集合key中移到key1中operations.move(key, 3, key1);//查询值包含a的集合,每次查询两个  *是通配符Cursor scan = operations.scan(key, ScanOptions.scanOptions().match("*a*").count(2).build());while (scan.hasNext()){Object next = scan.next();System.out.println(next);}}

zset操作

@Testvoid testZSet(){ZSetOperations operations = redisTemplate.opsForZSet();String key="zSet";
//        //查询新元素,分数是1,排序是按照分数排序的operations.add(key,"value",1);Set set = new HashSet<>();set.add(new DefaultTypedTuple("value1",Double.valueOf(2)));set.add(new DefaultTypedTuple("value2",Double.valueOf(3)));set.add(new DefaultTypedTuple("value3",Double.valueOf(2)));
//        //插入多个元素operations.add(key,set);//不存在就插入operations.addIfAbsent(key,"aa",1);//查询集合中索引0-2数据,如果end为-1就是查询start后面所有元素Set range = operations.range(key, 0, 2);//查询分数是0-100直接数据,如果max为-1就是查询所有数据Set set = operations.rangeByScore(key, 0, 100);//取分数位于0-100之间的从0个开始的100个数据Set set1 = operations.rangeByScore(key, 0, 100, 0, 10);//随机取10数据List list = operations.randomMembers(key, 10);//取分数位于0-100之间的从0个开始的100个数据Set set2 = operations.rangeByScoreWithScores(key, 0, 100, 0, 10);//查询分数是10-100之间数据Set set3 = operations.rangeByLex(key, RedisZSetCommands.Range.range().gt(10).lt(100));//给元素加分operations.incrementScore(key,"value",1);//根据值删除元素operations.remove(key,1,2,3);//删除数据Long aLong = operations.removeRange(key, 0, 1);//        交并差参考zet}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部