赞
踩
SpringBoot Data Redis
中提供了 RedisTemplate
和StringRedisTemplate
,其中StringRedisTemplate
是RedisTemplate
的子类,两个方法基本一致,不同之处主要体现在操作的数据类型
不同注意: 使用RedisTemplate默认是将对象序列化到Redis中,所以放入的对象必须实现对象序列化接口
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
spring.redis.host=localhost
spring.redis.port=6379
spring.redis.database=0 # 选择要操作那个redis库
//启动springboot应用 @SpringBootTest(classes = RedisDay2Application.class) @RunWith(SpringRunner.class) public class TestStringRedisTemplate { //注入StringRedisTemplate @Autowired private StringRedisTemplate stringRedisTemplate; //key value 都是字符串 //操作redis中key相关 @Test public void testKey(){ //stringRedisTemplate.delete("name");//删除一个key Boolean hasKey = stringRedisTemplate.hasKey("name");//判断某个key是否存在 System.out.println(hasKey); DataType name = stringRedisTemplate.type("name");//判断key所对应值的类型 System.out.println(name); Set<String> keys = stringRedisTemplate.keys("*");//获取redis中所有key keys.forEach(key -> System.out.println("key = " + key)); Long expire = stringRedisTemplate.getExpire("age");//获取key超时时间 -1 永不超时 -2 key不存在 >=0 过期时间 System.out.println(expire); stringRedisTemplate.randomKey();//在redis中随机获取一个key //stringRedisTemplate.rename("age","age1");//修改key名字 要求key必须存在 不存在 报错 //stringRedisTemplate.renameIfAbsent("name","name1");//修改key名字 判断key是否存在 stringRedisTemplate.move("name1",1);//移动key到指定库 } //操作redis中字符串 opsForValue 实际操作就是redis中String类型 @Test public void testString(){ stringRedisTemplate.opsForValue().set("name","小陈"); //set 用来设置一个key value String value= stringRedisTemplate.opsForValue().get("name"); //用来获取一个key对应value System.out.println("value = " + value); stringRedisTemplate.opsForValue().set("code","2357",120, TimeUnit.SECONDS);//设置一个key 超时时间 stringRedisTemplate.opsForValue().append("name","他是是一个好人,单纯少年!");//追加 } //操作redis中list类型 opsForList 实际操作就是redis中list类型 @Test public void testList(){ //stringRedisTemplate.opsForList().leftPush("names","小陈");//创建一个列表 并放入一个元素 //stringRedisTemplate.opsForList().leftPushAll("names","小陈","小张","小王");//创建一个列表 放入多个元素 List<String> names = new ArrayList<>(); names.add("xiaoming"); names.add("xiaosan"); //stringRedisTemplate.opsForList().leftPushAll("names",names);//创建一个列表 放入多个元素 List<String> stringList = stringRedisTemplate.opsForList().range("names", 0, -1); //遍历list stringList.forEach(value-> System.out.println("value = " + value)); stringRedisTemplate.opsForList().trim("names",1,3); //截取指定区间的list } //操作redis中set类型 opsForSet 实际操作就是redis中set类型 @Test public void testSet(){ stringRedisTemplate.opsForSet().add("sets","张三","张三","小陈","xiaoming");//创建set 并放入多个元素 Set<String> sets = stringRedisTemplate.opsForSet().members("sets");//查看set中成员 sets.forEach(value-> System.out.println("value = " + value)); Long size = stringRedisTemplate.opsForSet().size("sets");//获取set集合元素个数 System.out.println("size = " + size); } //操作redis中Zset类型 opsForZSet 实际操作就是redis中Zset类型 @Test public void testZset(){ stringRedisTemplate.opsForZSet().add("zsets","小黑",20);//创建并放入元素 Set<String> zsets = stringRedisTemplate.opsForZSet().range("zsets", 0, -1);//指定范围查询 zsets.forEach(value-> System.out.println(value)); System.out.println("====================================="); Set<ZSetOperations.TypedTuple<String>> zsets1 = stringRedisTemplate.opsForZSet().rangeByScoreWithScores("zsets", 0, 1000);//获取指定元素以及分数 zsets1.forEach(typedTuple ->{ System.out.println(typedTuple.getValue()); System.out.println(typedTuple.getScore()); }); } //操作redis中Hash类型 opsForHash 实际操作就是redis中Hash类型 @Test public void testHash(){ stringRedisTemplate.opsForHash().put("maps","name","张三");//创建一个hash类型 并放入key value Map<String,String> map = new HashMap<String,String>(); map.put("age","12"); map.put("bir","2012-12-12"); stringRedisTemplate.opsForHash().putAll("maps",map); //放入多个key value List<Object> values = stringRedisTemplate.opsForHash().multiGet("maps", Arrays.asList("name", "age"));//获取多个key的value values.forEach(value-> System.out.println(value)); String value = (String) stringRedisTemplate.opsForHash().get("maps", "name");//获取hash中某个key的值 List<Object> vals = stringRedisTemplate.opsForHash().values("maps");//获取所有values Set<Object> keys = stringRedisTemplate.opsForHash().keys("maps");//获取所有keys } }
//启动springboot应用 @SpringBootTest(classes = RedisDay2Application.class) @RunWith(SpringRunner.class) public class TestRedisTemplate { //注入RedisTemplate key Object Value Object ===> 对象序列化 name new User() ====> name序列化 对象序列化结果 @Autowired private RedisTemplate redisTemplate; //opsForxxx Value String List Set Zset hash @Test public void testRedisTemplate(){ /** * redisTemplate对象中 key 和 value 的序列化都是 JdkSerializationRedisSerializer * key: string * value: object * 修改默认key序列化方案 : key StringRedisSerializer */ //修改key序列化方案 String类型序列 redisTemplate.setKeySerializer(new StringRedisSerializer()); //修改hash key 序列化方案 redisTemplate.setHashKeySerializer(new StringRedisSerializer()); User user = new User(); // 这里使用打了Lombok的@Accessors注解, 可以链式使用setter方法 user.setId(UUID.randomUUID().toString()).setName("小陈").setAge(23).setBir(new Date()); redisTemplate.opsForValue().set("user", user);//redis进行设置 对象需要经过序列化 User user1 = (User) redisTemplate.opsForValue().get("user"); System.out.println(user1); redisTemplate.opsForList().leftPush("list",user); redisTemplate.opsForSet().add("set",user); redisTemplate.opsForZSet().add("zset",user,10); redisTemplate.opsForHash().put("map","name",user); } }
RedisTemplate默认序列化是使用的是Jdk序列化方式, 有时候我们需要使用json序列化
, 此时要修改; 也可以重写一个RedisTemplate
方式
//修改key序列化方案 String类型序列
redisTemplate.setKeySerializer(new StringRedisSerializer());
//修改hash key 序列化方案
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
自定义RedisTemplate
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。