SpringBoot整合Redis

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

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

java操作Redis

引入依赖

<!--引入jedis连接依赖-->
<dependency>
  <groupId>redis.clients</groupId>
  <artifactId>jedis</artifactId>
  <version>3.2.0</version>
</dependency>

创建jedis对象

 public static void main(String[] args) {
   //1.创建jedis对象
   Jedis jedis = new Jedis("192.168.40.4", 6379);//1.redis服务必须关闭防火墙  2.redis服务必须开启远程连接
   jedis.select(0);//选择操作的库默认0号库
   //2.执行相关操作
   //....
   //3.释放资源
   jedis.close();
 }

基本上和redis里命令相同

SpringBoot整合Redis

环境搭建

引入依赖

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

配置文件

spring:
  redis:
    host: localhost
    port: 6379
    database: 0

StringRedisTemplate 操作

这里列举的不全,可以自己多试一下

	@Autowired
    private StringRedisTemplate stringRedisTemplate;//对字符串支持比较友好,不能存储对象
操作key
		//操作redis中的key
         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));
         
         Long time = stringRedisTemplate.getExpire("name");//获取key超时时间
         System.out.println(time);
         
         String s = stringRedisTemplate.randomKey();//在redis中随机获取一个key
         System.out.println(s);
操作字符串
//操作redis中字符串,opsForValue实际操作就是redis中的string类型
        stringRedisTemplate.opsForValue().set("name","dyk");
        String name = stringRedisTemplate.opsForValue().get("name");
        System.out.println(name);

        stringRedisTemplate.opsForValue().set("code","1234",120, TimeUnit.SECONDS);//设置一个key的超时时间

        stringRedisTemplate.opsForValue().append("name","123");//追加
stringRedisTemplate.opsForList().leftPush("names","dyk");//创建一个列表,放入一个元素
        stringRedisTemplate.opsForList().leftPushAll("names","lfw","cb","dyk");//创建一个列表放入多个元素
        stringRedisTemplate.opsForList().leftPushAll("names", Arrays.asList("cb","lfw","dyk"));//创建一个列表放入(集合)多个元素

        List<String> names = stringRedisTemplate.opsForList().range("names", 0, -1);//遍历list
        names.forEach(name-> System.out.println(name));

        stringRedisTemplate.opsForList().trim("names",1,3);//截取指定区间的list,没有返回值直接修改原集合
操作list
stringRedisTemplate.opsForList().leftPush("names","dyk");//创建一个列表,放入一个元素
        stringRedisTemplate.opsForList().leftPushAll("names","lfw","cb","dyk");//创建一个列表放入多个元素
        stringRedisTemplate.opsForList().leftPushAll("names", Arrays.asList("cb","lfw","dyk"));//创建一个列表放入(集合)多个元素

        List<String> names = stringRedisTemplate.opsForList().range("names", 0, -1);//遍历list
        names.forEach(name-> System.out.println(name));

        stringRedisTemplate.opsForList().trim("names",1,3);//截取指定区间的list,没有返回值直接修改原集合
操作set
		stringRedisTemplate.opsForSet().add("sets","xiaosan","xiaosi","xiaowu");
        Set<String> sets = stringRedisTemplate.opsForSet().members("sets");
        sets.forEach(value-> System.out.println(value));
操作zset
	 stringRedisTemplate.opsForZSet().add("zsets","dyk",100);
         Set<String> zset = stringRedisTemplate.opsForZSet().range("zsets", 0, -1);//指定范围查询
         zset.forEach(value-> System.out.println(value));

         Set<ZSetOperations.TypedTuple<String>> zsets = stringRedisTemplate.opsForZSet().rangeByScoreWithScores("zsets", 0, 101);//获取指定元素即分数
         zsets.forEach(typedtuple-> {
             System.out.println(typedtuple.getValue());
             System.out.println(typedtuple.getScore());
         });
操作hash
	stringRedisTemplate.opsForHash().put("maps","name","dyk");//创建一个hash类型,并放入keyvalue
         Map<String,String> map=new HashMap<>();
         map.put("age","12");
         map.put("id","1");
         stringRedisTemplate.opsForHash().putAll("maps",map);//放入多个key value
         List<Object> values = stringRedisTemplate.opsForHash().multiGet("maps", Arrays.asList("name", "age", "id"));
         values.forEach(value-> System.out.println(value));

         stringRedisTemplate.opsForHash().get("maps","name"); //获取hash中某个key的值
         stringRedisTemplate.opsForHash().values("maps");//获取所有的values
         stringRedisTemplate.opsForHash().keys("maps");//获取所有的key

RedisTemplate 操作

package com.blb.springbootredis;

import com.blb.springbootredis.entity.User;
import org.junit.jupiter.api.Test;
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 java.util.Date;

@SpringBootTest
public class redistemplatetest {

    @Autowired
    private RedisTemplate redisTemplate;
    @Test
    public void testtemplate(){

        // redisTemplate中对象中的key和value的序列化都是 JdkSerializationRedisSerializer()
        //修改默认key序列化方案: key StringRedisSerializer() value JdkSerializationRedisSerializer()
        User user=new User();
        user.setAge(18);
        user.setBirthday(new Date());
        user.setName("dyk");
        user.setId("1");
        //修改key的序列化
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        //修改value的序列化
        redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
        //修改hash key的序列化
        redisTemplate.setHashKeySerializer(new StringRedisSerializer());
        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","user",user);
    }

}

key的绑定操作

//key的绑定操作 如果日后对某一个key的操作及其频繁,可以将这个key绑定到对应redistemplate中,日后基于绑定操作都是操作这个key

  boundValueOps 用来对String值绑定key
  boundListOps 用来对List值绑定key
  boundSetOps 用来对Set值绑定key
  boundZsetOps 用来对Zset值绑定key
  boundHashOps 用来对Hash值绑定key

总结

  • 针对于日后处理key value 都是string使用StringRedisTemplate
  • 针对于日后处理的key value 存在的对象使用 RedisTemplate
  • 针对于同一个key的多次操作可以使用boundxxxOps简化书写

redis应用场景

利用redis中字符串类型完成手机验证码存储的实现
利用redis中字符串类型完成,具有失效业务功能 12306,淘宝订单还有40分钟
利用redis分布式集群系统中的 session共享
利用redis zset类型,可排序set类型 排行榜功能
利用redis分布式缓存
利用redis存储认证之后token信息 微信小程序,用户 openid 令牌超时
利用redis解决分布式集群系统中的分布式锁问题

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值