文章目录
一、添加Redis依赖
二、application.properties
三、添加配置类
四、测试
TestRedisString
TestRedisList
TestRedisHash
Article
TestRedisSet
TestRedisZSet
一、添加Redis依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
二、application.properties
# 应用名称 spring.application.name=springboot_redis server.port=8085 #配置Redis,redis的host是虚拟机服务器上的IP地址,端口6379 spring.redis.host=127.0.0.1 spring.redis.port=6379
三、添加配置类
package com.ljx.springboot_redis.config; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; import org.springframework.cache.CacheManager; import org.springframework.cache.annotation.CachingConfigurerSupport; import org.springframework.cache.annotation.EnableCaching; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.cache.RedisCacheConfiguration; import org.springframework.data.redis.cache.RedisCacheManager; import org.springframework.data.redis.cache.RedisCacheWriter; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.*; import java.time.Duration; /** * @Author: Ljx * @Date: 2021/12/1 13:34 * @role: */ @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport{ private static final StringRedisSerializer STRING_SERIALIZER = new StringRedisSerializer(); private static final GenericJackson2JsonRedisSerializer JACKSON__SERIALIZER = new GenericJackson2JsonRedisSerializer(); @Bean public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) { //设置缓存过期时间 RedisCacheConfiguration redisCacheCfg=RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofHours(1)) .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(STRING_SERIALIZER)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(JACKSON__SERIALIZER)); return RedisCacheManager.builder(RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory)) .cacheDefaults(redisCacheCfg) .build(); } @Bean @ConditionalOnMissingBean(name = "redisTemplate") public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){ // 配置redisTemplate RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(factory); // key序列化 redisTemplate.setKeySerializer(new StringRedisSerializer()); // value序列化 redisTemplate.setValueSerializer(JACKSON__SERIALIZER); // Hash key序列化 redisTemplate.setHashKeySerializer(new StringRedisSerializer()); // Hash value序列化 redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer()); redisTemplate.afterPropertiesSet(); return redisTemplate; } }
四、测试
TestRedisString
package com.ljx.springboot_redis; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.concurrent.TimeUnit; /** * @Author: Ljx * @Date: 2021/12/1 0:52 * @role: */ @SpringBootTest @RunWith(SpringJUnit4ClassRunner.class) class TestRedisString { @Autowired private RedisTemplate<String,String> redisTemplate; @Test public void testSet(){ //向数据库中保存 name heima redisTemplate.opsForValue().set("name","heima"); //相关数据保存 name1 heima1 有效时间为10s redisTemplate.opsForValue().set("name1","heima1",10, TimeUnit.SECONDS); //替换 heima heXXa offset 索引位置是从0开始 redisTemplate.opsForValue().set("name","XX",2); //当key不存在的时候,执行保存操作;当key存在时,什么都不做 redisTemplate.opsForValue().setIfAbsent("name","heima"); //批量保存 Map<String,String> map = new HashMap<>(); map.put("name2","heima2"); map.put("name3","heima3"); map.put("name3","heima3"); redisTemplate.opsForValue().multiSet(map); //追加 当key存在时,会执行追加操作;当key不存在时,会执行保存操作 redisTemplate.opsForValue().append("name5","heima"); } @Test public void testGet(){ //根据key获取value String value = redisTemplate.opsForValue().get("name"); System.out.println(value); //首先根据key获取value,然后再根据value进行截取。从start位置截取到end位置【包含start和end】 String name = redisTemplate.opsForValue().get("name", 5, 7); System.out.println(name); //批量获取 List<String> keys = new ArrayList<>(); keys.add("name2"); keys.add("name3"); keys.add("name4"); List<String> values = redisTemplate.opsForValue().multiGet(keys); for (String s : values) { System.out.println(s); } //根据key获取value的长度 Long size = redisTemplate.opsForValue().size("name"); System.out.println(size); } @Test public void testIncrement(){ redisTemplate.opsForValue().set("age","18"); // 自增1 redisTemplate.opsForValue().increment("age"); System.out.println(redisTemplate.opsForValue().get("age")); // 自增6 redisTemplate.opsForValue().increment("age",6); System.out.println(redisTemplate.opsForValue().get("age")); // 自减 redisTemplate.opsForValue().decrement("age"); } //删除 @Test public void testDelete(){ // 单个删除 redisTemplate.delete("name"); List<String> list = new ArrayList<>(); list.add("name2"); list.add("name3"); list.add("name4"); // 批量删除 redisTemplate.delete(list); } }
TestRedisList
package com.ljx.springboot_redis; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import javax.swing.*; import java.util.List; /** * @Author: Ljx * @Date: 2021/12/1 20:24 * @role: */ @SpringBootTest @RunWith(SpringJUnit4ClassRunner.class) public class TestRedisList { @Autowired private RedisTemplate<String,String> redisTemplate; //增加 @Test public void testAdd(){ //从左边添加一个元素 redisTemplate.opsForList().leftPush("students","zhangshan"); //从左边添加多个元素 redisTemplate.opsForList().leftPush("students","lishi","wangwu"); //从右边添加一个元素 redisTemplate.opsForList().rightPush("students","zhangshan1"); //从右边添加多个元素 redisTemplate.opsForList().rightPush("students","lishi1","wangwu1"); } @Test public void testFind(){ //根据key和元素索引进行查询 //0和正数代表从左边开始 //负数代表从右边开始 String students = redisTemplate.opsForList().index("students", 1); System.out.println(students); String students1 = redisTemplate.opsForList().index("students", -1); System.out.println(students1); //范围查询 //根据key 【start,end】 包括首尾 List<String> students2 = redisTemplate.opsForList().range("students", 0, 2); for (String s : students2) { System.out.println(s); } } //删除 @Test public void testRemove(){ //从左边删除第一个元素 String s = redisTemplate.opsForList().leftPop("students"); //从右边删除第一个元素 String s1 = redisTemplate.opsForList().rightPop("students"); //count > 0; 删除左边起第几个等于指定值的元素 //count < 0; 删除右边起第几个等于指定值的元素 //count = 0; 删除所有等于value的元素 //删除左边起第二个wangwu redisTemplate.opsForList().remove("students",2,"wangwu"); } }
TestRedisHash
package com.ljx.springboot_redis; import com.ljx.springboot_redis.uesr.Article; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; /** * @Author: Ljx * @Date: 2021/12/1 13:07 * @role: */ @SpringBootTest @RunWith(SpringJUnit4ClassRunner.class) public class TestRedisHash { @Autowired private RedisTemplate redisTemplate; @Test public void testPut(){ // redisTemplate.setKeySerializer(new StringRedisSerializer()); // redisTemplate.setHashKeySerializer(new StringRedisSerializer()); // redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer()); Article article = new Article(); article.setTitle("title"); article.setCreateTime(new Date()); article.setAuthor("lixiang"); redisTemplate.opsForHash().put("article","1",article); } @Test public void testGet(){ // redisTemplate.setKeySerializer(new StringRedisSerializer()); // redisTemplate.setHashKeySerializer(new StringRedisSerializer()); // redisTemplate.setHashValueSerializer(new JdkSerializationRedisSerializer()); //判断hashkey是否存在 // Boolean article = redisTemplate.opsForHash().hasKey("article", "2"); // System.out.println(article); // // //根据key和hashkey获取操作 // Article article1 = (Article) redisTemplate.opsForHash().get("article", "2"); // System.out.println(article1); // //根据key获取所有的hashkey // Set<String> set = redisTemplate.opsForHash().keys("article"); // for (Object s : set) { // System.out.println(s); // } List<Article> articles = redisTemplate.opsForHash().values("article"); for (Article article : articles) { System.out.println(article); } Map<String,Article> map = redisTemplate.opsForHash().entries("article"); for (Map.Entry<String, Article> entry : map.entrySet()) { System.out.println(entry.getKey()+":"+entry.getValue()); } } //删除 @Test public void testDelete(){ //当hash中的数据全被删除后,整个hash就没了 redisTemplate.opsForHash().delete("article","1","2"); } }
Article
package com.ljx.springboot_redis.uesr; import javax.xml.crypto.Data; import java.io.Serializable; import java.util.Date; /** * @Author: Ljx * @Date: 2021/12/1 13:12 * @role: */ public class Article implements Serializable { private String author; private Data createTime; private String title; public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public Data getCreateTime() { return createTime; } public void setCreateTime(Data createTime) { this.createTime = createTime; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } @Override public String toString() { return "Article{" + "author='" + author + '\'' + ", createTime=" + createTime + ", title='" + title + '\'' + '}'; } public void setCreateTime(Date date) { } }
TestRedisSet
package com.ljx.springboot_redis; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.List; import java.util.Set; /** * @Author: Ljx * @Date: 2021/12/1 20:48 * @role: */ @SpringBootTest @RunWith(SpringJUnit4ClassRunner.class) public class TestRedisSet { @Autowired private RedisTemplate<String,String> redisTemplate; //增加 @Test public void testAdd(){ redisTemplate.opsForSet().add("Students","zhangsan","lishi","wangwu","Zhangsan"); } //查询 @Test public void testFind(){ //查询所有元素 Set<String> students = redisTemplate.opsForSet().members("Students"); for (String student : students) { System.out.println(student); } //随机获取一个元素 String students1 = redisTemplate.opsForSet().randomMember("Students"); System.out.println(students1); //随机获取多个元素【可能会重复】 List<String> list = redisTemplate.opsForSet().randomMembers("Students", 2); for (String s : list) { System.out.println(s); } } //删除 @Test public void testRemove(){ //移除元素,并返回移除成功个数 Long remove = redisTemplate.opsForSet().remove("Students", "zhangsan", "wangwu"); System.out.println(remove); //随机移除指定集合中的多少个元素 List<String> students = redisTemplate.opsForSet().pop("Students", 2); for (String student : students) { System.out.println(student); } } //多集合操作 @Test public void testMoreSet(){ redisTemplate.opsForSet().add("names1","zhangsan","li","wangwu"); redisTemplate.opsForSet().add("names2","zhangsan","li","zhaoliu"); //取交集 Set<String> intersect = redisTemplate.opsForSet().intersect("names1", "names2"); for (String s : intersect) { System.out.println(s); } //取并集 Set<String> union = redisTemplate.opsForSet().union("names1", "names2"); for (String s : union) { System.out.println(s); } //取差集[第一个集合中存在,但第二个集合中不存在的元素] Set<String> difference = redisTemplate.opsForSet().difference("names2", "names1"); for (String s : difference) { System.out.println(s); } } }
TestRedisZSet
package com.ljx.springboot_redis; import org.junit.Before; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ZSetOperations; import org.springframework.data.redis.serializer.StringRedisSerializer; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; import java.util.Set; @SpringBootTest @RunWith(SpringJUnit4ClassRunner.class) class TestRedisZSet { @Autowired private RedisTemplate<String, String> redisTemplate; @Test public void testAdd(){ redisTemplate.opsForZSet().add("student","wangwu",60); redisTemplate.opsForZSet().add("student","lishi",100); redisTemplate.opsForZSet().add("student","zhangshan",90); } // 分数的增减 @Test public void testScore(){ // 增加分数 redisTemplate.opsForZSet().incrementScore("student","wangwu",30); // 减少分数 redisTemplate.opsForZSet().incrementScore("student","wangwu",-50); } // 查询一个元素的信息 @Test public void testFindOne(){ //查询一个元素的分数 Double score = redisTemplate.opsForZSet().score("student", "wangwu"); System.out.println(score); //查询一个元素在集合中的排名 排名从0开始 Long rank = redisTemplate.opsForZSet().rank("student", "zhangshan"); System.out.println(rank); } //根据区间获取列表 @Test public void testFindList(){ //根据排名区间获取元素列表 Set<String> students = redisTemplate.opsForZSet().range("student",0,2); for (String student : students) { System.out.println(student); } System.out.println("-------------"); Set<ZSetOperations.TypedTuple<String>> student = redisTemplate.opsForZSet().rangeWithScores("student", 0, 2); for (ZSetOperations.TypedTuple<String> stringTypedTuple : student) { System.out.println(stringTypedTuple.getValue()+"同学,得了"+stringTypedTuple.getScore()+"分"); } System.out.println("-----------------------------"); //根据排名区间获取元素列表 Set<String> students1 = redisTemplate.opsForZSet().rangeByScore("student",50,100); for (String student1 : students1) { System.out.println(student1); } System.out.println("-------------"); Set<ZSetOperations.TypedTuple<String>> student1 = redisTemplate.opsForZSet().rangeByScoreWithScores("student", 50, 100); for (ZSetOperations.TypedTuple<String> stringTypedTuple : student1) { System.out.println(stringTypedTuple.getValue()+"同学,得了"+stringTypedTuple.getScore()+"分"); } } //统计 @Test public void testCount(){ //统计一个集合中元素 Long student = redisTemplate.opsForZSet().zCard("student"); System.out.println(student); //根据一个分数区间统计元素数量 Long count = redisTemplate.opsForZSet().count("student", 50, 100); System.out.println(count); } //删除 @Test public void testRemove(){ //根据key-value删除 value允许传入多个 redisTemplate.opsForZSet().remove("student","zhangsan","lisi"); //根据排名区间删除 redisTemplate.opsForZSet().removeRange("student",0,1); //根据分数区间删除 redisTemplate.opsForZSet().removeRangeByScore("student",70,90); } }