1.导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring boot redis Redis弹簧启动 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<!-- Redis连接池 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
2.配置核心配置文件
# 应用名称
spring.application.name=redisdemo1
## Redis数据库索引(默认为0)
spring.redis.database=0
#Redis服务器地址
spring.redis.host=127.0.0.1
#Redis服务器连接端口
spring.redis.port=6379
#Redis服务器连接密码(默认为空)
spring.redis.password=
#连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
#连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1
#连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
#连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=0
3.创建控制器类,编写测试代码
3.1测试String类型
@RestController @RequestMapping("/string") public class StringController { @Autowired private RedisTemplate redisTemplate; @RequestMapping("/test.do") public String testString(){ //设置key-value redisTemplate.opsForValue().set("username","chengshish"); //得到指定键的数据值 String str = (String) redisTemplate.opsForValue().get("username"); System.out.println(str); return str; } }
还可以这样写:
public class StringController { @Autowired private RedisTemplate redisTemplate; @RequestMapping("/teststring.do") public String testString(){ //得到字符串键值对的绑定对象 BoundValueOperations stringOper=redisTemplate.boundValueOps("name"); //set(value)--设置字符串键值对的数据值 stringOper.set("hello"); //get()--得到指定键的数据值 String rus=(String)stringOper.get(); return rus; }
opsForxxxx和boundxxxxOps区别
/**获取a,然后获取b,然后删除c,对同一个key有多次操作,按照opsForHash()的写法 * 每次都是redisTemplate.opsForHash().xxx("key","value")写法很是啰嗦 */ int result = (Integer) redisTemplate.opsForHash().get("hash-key","a"); result = (Integer)redisTemplate.opsForHash().get("hash-key","b"); redisTemplate.opsForHash().delete("hash-key","c"); /** * boundHashOps()则是直接将key和boundHashOperations对象进行了绑定, * 后续直接通过boundHashOperations对象进行相关操作即可,写法简洁,不需要 * 每次都显式的将key写出来 */ BoundHashOperations<String, String, Object> boundHashOperations = redisTemplate.boundHashOps("hash-key"); result = (Integer) boundHashOperations.get("a"); result = (Integer) boundHashOperations.get("b"); boundHashOperations.delete("c");
但是当我们查看keys * 会发现一个问题,就是加进来的key不是我们想的那样,如下图
解决方法:需要进行序列化
4.创建配置类,进行序列化
固定模板,以后直接使用
import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; @Configuration public class RedisConfig { @Bean public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory factory){ //我们为了自己开发方便,一般直接使用<String,Object> RedisTemplate<String, Object> template = new RedisTemplate<>(); template.setConnectionFactory(factory); //json序列化配置 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); jackson2JsonRedisSerializer.setObjectMapper(om); //String的序列化 StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); //key采用String的序列化方式 template.setKeySerializer(stringRedisSerializer); //hash的key也采用String的序列化方式 template.setHashKeySerializer(stringRedisSerializer); //value序列化方式采用jackson template.setValueSerializer(jackson2JsonRedisSerializer); //hash的value序列化方式采用jackson template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; } }
测试后发现:
5.五大类型测试
5.1 key-value(String类型)
@SpringBootTest class Redisdemo1ApplicationTests { @Autowired @Qualifier("redisTemplate") private RedisTemplate redisTemplate; @Test void StringDemo() { System.out.println("-----------数字---------------"); //将key和boundValueOps对象进行了绑定 BoundValueOperations ageOps = redisTemplate.boundValueOps("age"); //设置age ageOps.set(23); //给age加值 ageOps.increment(22.3); Double age = (Double) ageOps.get(); System.out.println(age);//45.3 System.out.println("--------------字符串----------------------"); //append的数据值的时候,没有成功 //原因是保存的字符串键值对中的数据值没有序列化 //所以就需要对字符串键值对中的数据值进行序列化 redisTemplate.setValueSerializer(new StringRedisSerializer()); BoundValueOperations nameOps = redisTemplate.boundValueOps("name"); //设置name nameOps.set("lisi"); //追加值 nameOps.append("唐小妃"); String name = (String) nameOps.get(); System.out.println(name);//lisi唐小妃 //一个汉字三个字节 System.out.println(nameOps.size()); //删除key redisTemplate.delete("age"); redisTemplate.delete("name"); //也可以一次性删除多个 /* ArrayList<String> list = new ArrayList<>(); list.add("name"); list.add("age"); redisTemplate.delete(list); */ }
5.2 key-value(Set类型)
@Test void SetDemo(){ BoundSetOperations studentOps = redisTemplate.boundSetOps("student"); /*一个一个添加 studentOps.add("唐小妃"); studentOps.add("波斯客"); studentOps.add("城小将"); */ //也可以添加一组数据 String[] setarray={"卫小青","去病","岳小飞"}; studentOps.add(setarray); //删除一个set值 studentOps.remove("去病"); //删除一组set数据 studentOps.remove(new String[]{"城小将","波斯客"}); //member提取set中数据 Set members = studentOps.members(); System.out.println(members);//[卫小青, 唐小妃, 岳小飞] //set集合中的个数 System.out.println(studentOps.size());//3 //随机抽取count个元素 Set randomMembers = studentOps.distinctRandomMembers(2); System.out.println(randomMembers); }
5.3 key-value(List类型)
@Test void ListDemo() { BoundListOperations personOps = redisTemplate.boundListOps("person"); //从左向右添加,最后一个排在开头 personOps.leftPush("许褚"); personOps.leftPush("典韦"); personOps.leftPush("徐晃"); personOps.leftPush("徐晃"); personOps.leftPush("张辽"); personOps.leftPush("夏侯惇"); BoundListOperations peopleOps = redisTemplate.boundListOps("people"); //从右向左添加 peopleOps.rightPush("许褚"); peopleOps.rightPush("典韦"); peopleOps.rightPush("徐晃"); peopleOps.rightPush("徐晃"); peopleOps.rightPush("张辽"); peopleOps.rightPush("夏侯惇"); //移除list中第一个元素,返回被删除的值 Object obj1 = personOps.leftPop(); System.out.println(obj1);//夏侯惇 //移除list中最后一个元素,返回被删除的值 Object obj2 = personOps.rightPop(); System.out.println(obj2);//许褚 //list集合中的元素个数 System.out.println(personOps.size());//4 //返回指定范围内的元素 List list = personOps.range(1, 2); System.out.println(list);//[徐晃, 徐晃] //remove(count,obj)---从列表里移除前 count 次出现的值为 value 的元素。 //这个 count 参数通过下面几种方式影响这个操作: //count > 0: 从头往尾移除值为 value 的元素。 //count < 0: 从尾往头移除值为 value 的元素。 //count = 0: 移除所有值为 value 的元素。 peopleOps.remove(2,"典韦");//2个典韦消失 //根据索引位置查询元素值 System.out.println(peopleOps.index(4));//夏侯惇 }
5.4 key-value(Hash类型)
@Test void HashDemo(){ BoundHashOperations myhashOps = redisTemplate.boundHashOps("myhash"); //put 添加key-value数据 myhashOps.put("1","唐小妃"); myhashOps.put("2","城小将"); myhashOps.put("3","卫小青"); myhashOps.put("4","嬴小政"); myhashOps.put("5","武小天"); //返回hash中所有的键 Set keys = myhashOps.keys(); System.out.println(keys);//[1, 2, 3, 4, 5] //返回hash中所有的value List values = myhashOps.values(); System.out.println(values);//[唐小妃, 城小将, 卫小青, 嬴小政, 武小天] //hash中键值对个数 System.out.println(myhashOps.size());//5 //根据key移除一个键值对数据,返回值为移除元素的个数 System.out.println(myhashOps.delete("3"));//1 卫小青已被删除 }