14-SpringBoot-整合Redis

1、简介

Spring Boot Data Redis中提供了RedisTemplateStringRedisTemplate,其中StringRedisTemplate是RedisTemplate的子类,两个方法基本一致,不同之处主要体现在操作的数据类型不同,RedisTemplate中的两个泛型都是Object,意味着存储的key和value都可以是一个对象,而StringRedisTemplate的两个泛型都是String,意味着StringRedisTemplate的key和value都只能是字符串。

注意:使用RedisTemplate默认是将对象序列化Redis中,所以放入的对象必须实现对象序列化接口

2、环境准备

2.1、导入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

2.2、配置application.properties

spring.redis.host=127.0.0.1
spring.redis.port=6379
spring.redis.database=0

2.3、StringRedisTemplate

@SpringBootTest
class RedisApplicationTests {
    @Autowired
    private StringRedisTemplate stringRedisTemplate;

    @Test
    void contextLoads() {
        //操作redis中字符串 opsForValue实际操作就是redis中String类型
        stringRedisTemplate.opsForValue().set("k1","asd");
    }

    //操作redis中key相关
    @Test
    public void testKey(){
    //  stringRedisTemplate.delete("k1"); 删除一个key
        Boolean name = stringRedisTemplate.hasKey("name");//判断某个key是否存在
        System.out.println(name);
        DataType type = stringRedisTemplate.type("name");//判断key所对应值的类型
        System.out.println(type);
        Set<String> keys = stringRedisTemplate.keys("*");//获取redis中所有key
        keys.forEach(s -> System.out.println(s));
        Long expire = stringRedisTemplate.getExpire("name");//获取key的超时时间
        System.out.println(expire);
        //还有需要的常用命令具体参考: https://blog.csdn.net/qq_45632660/article/details/113827804
    }
    //操作redis中list类型 opsForList实际操作就是redis中的list类型
    @Test
    public void testList(){
        Long push = stringRedisTemplate.opsForList().leftPush("name", "张安");//创建一个列表并放入一个元素
        System.out.println(push);
    }
    //set相关操作 opsForSet
    @Test
    public void testSet(){
        stringRedisTemplate.opsForSet().add("sets","xiaosan","xiaosi","xiaowu");
        Set<String> sets = stringRedisTemplate.opsForSet().members("sets");
        sets.forEach(value-> System.out.println(value));
    }
    //zset相关操作 opsForZSet
    @Test
    public void testZSet(){
        stringRedisTemplate.opsForZSet().add("zsets","小黑",10);
        Set<String> zsets = stringRedisTemplate.opsForZSet().range("zsets", 0, -1);
        zsets.forEach(value-> System.out.println(value));
    }
    //hash相关操作 opsForHash
    @Test
    public void testHash(){
        stringRedisTemplate.opsForHash().put("maps","name","小黑");
        Object o = stringRedisTemplate.opsForHash().get("maps", "name");
        System.out.println(o);
    }
}

2.4、RedisTemplate

准备工作

  • User实体类
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User implements Serializable {

    private String id;
    private String name;
    private Integer age;
    private Date date;
}
  • 测试
@Autowired
private RedisTemplate redisTemplate;

@Test
public void test(){
    /*
    redisTemplate对象中的key和value的序列化都是JdkSerializationRedisSerializer
    key:String
    value: Object
    修改默认key序列化方案: key StringRedisSerializer
     */
    /*
    修改key序列化方案 String类型序列
    修改了key那么下面的"user"就不会在经过序列化了
     */
    redisTemplate.setKeySerializer(new StringRedisSerializer());
    //修改hash key序列化方案
    redisTemplate.setHashKeySerializer(new StringRedisSerializer());
    redisTemplate.opsForValue().set("user",new User("1","张三",15,new Date()));//redis进行设置,对象需要经过序列化
    System.out.println(redisTemplate.opsForValue().get("user"));
}

注意:

因为对象实现了序列化,所以我们设置的key和value都会以序列化的形式存储,如图示

在这里插入图片描述

这样对我们读取数据是非常不友好的,所以我们不能把key序列化,而是以普通字符串存储,所以我们使用

redisTemplate.setKeySerializer(new StringRedisSerializer());不把key进行序列化,hash采用redisTemplate.setHashKeySerializer(new StringRedisSerializer());

命令参考

redis四大数据类型命令参考:https://blog.csdn.net/qq_45632660/article/details/113827804

3、项目开发中常用

@Autowired
private StringRedisTemplate stringRedisTemplate;
//Spring data为了方便我们对redis进行更友好的操作,因此提供了bound api简化操作
    @Test
    public void testBound(){
        //我们对同一个key进行频繁的操作,可以通过bound绑定key简化开发
        stringRedisTemplate.opsForValue().set("name","zhangsan");
        stringRedisTemplate.opsForValue().append("name","你是一个好人");
        stringRedisTemplate.opsForValue().get("name");

        //对字符串类型key进行绑定 后续所有操作都是基于这个key操作
        BoundValueOperations<String, String> nameValue = stringRedisTemplate.boundValueOps("name");
        //省略了key,因为绑定了key下面所有的key都是name
        nameValue.set("张三");
        nameValue.append("你是一个好人");

        //其它类型也是一样
    }

4、总结

  1. 针对于日后处理key value都是String使用StringRedisTemplate
  2. 针对于日后处理的key value存在对象 使用RedisTemplate
  3. 针对于同一个key多次操作可以使用boundXXXOps() value List Set Hash Zset的api简化书写
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值