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解决分布式集群系统中的分布式锁问题