前言:
👏作者简介:我是笑霸final,一名热爱技术的在校学生。
📝个人主页:个人主页1 || 笑霸final的主页2
📕系列专栏::本文写在java专栏
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,👍点赞👍 + 👀关注👀 + 🤏收藏🤏
spring data redis
一、基础环境
maven坐标
<!-- https://mvnrepository.com/artifact/org.springframework.data/spring-data-redis -->
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-redis</artifactId>
<version>2.7.2</version>
</dependency>
yml文件
spring:
redis:
host: IP地址
port: 6379
database: 0 #redis默认提供l 16个数据库 这里指定0号数据库
password: 0615
jedis: #连接池
pool:
max-active: 20 #最大连接数,负值表示没有限制,默认8
max-wait: -1 #最大阻塞等待时间,负值表示没限制,默认-1
max-idle: 4 #最大空闲连接,默认8
min-idle: 0 #最小空闲连接,默认0
自动管理连接池,提供了一个高度封装的RedisTemplate类
针对jedis客户端的大量api进行了归类封装,把同一类型的操作封装成了operation
接口,具体如下
- ValueOperations:简单K-V操作
- SetOperations:set类型数据操作
- ZSetOperations:zset类型数据操作
- HashOperations:针对map类型的数据操作
- ListOperations:针对list类型的数据操作
二、设置序列化
我们先来执行如下代码
@SpringBootTest
@RunWith(SpringRunner.class)
public class Test01 {
@Resource
private RedisTemplate redisTemplate;
@Test
public void testString(){
redisTemplate.opsForValue().set("city","遂宁");
}
}
运行结果
可见代码运行成功
我们来看看redis
却没有我们设置的key 因为redisTemplate给我们序列化了!我们如何改变这个序列化?
配置类修改默认的序列化
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();
//设置键的序列化方式
redisTemplate.setKeySerializer(new StringRedisSerializer());
//设置值的序列化方式
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
再来运行代码
成功后
虽然value还是那样但是可以不用序列化 因为get后也会反序列化
@Test
public void testString1(){
final Object city1 = redisTemplate.opsForValue().get("city1");
System.out.println("=============");
System.out.println(city1);
System.out.println("=============");
}
结果:
三、操作数据类型string
简介:String是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
String类型是二进制安全的。意味着Redis的string可以包含任何数据。比如jpg图片或者序列化的对象。
String类型是Redis最基本的数据类型,一个Redis中字符串value最多可以是512M
上代码
/**
* 操作string类型的数据
*/
@Test
public void testString1(){
//设置值
redisTemplate.opsForValue().set("city2","遂宁2");
//设置值的同时设置过期时间 参数说明(key,vaule,lONG型的数据,单位)
redisTemplate.opsForValue().set("key1","value",10l, TimeUnit.SECONDS);
//setNx 当值存在就不设置,不存在才设置
Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city2", "成都");
System.out.println("********"+aBoolean+"********");
aBoolean = redisTemplate.opsForValue().setIfAbsent("city3", "成都");
System.out.println("********"+aBoolean+"********");
//得到所有的key
final Set keys = redisTemplate.keys("*");
System.out.println(keys);
}
四、操作数据类型Hash
Redis hash 是一个键值对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。
类似Java里面的Map<String,Object>
用户ID为查找的key,存储的value用户对象包含姓名,年龄,生日等信息,如果用普通的key/value结构来存储
上代码
/**
* 操作hash类型
*/
@Test
public void testHash(){
//存值
redisTemplate.opsForHash().put("001","name","笑霸");
redisTemplate.opsForHash().put("001","age","18");
redisTemplate.opsForHash().put("001","address","北京");
//取值
final Object name = redisTemplate.opsForHash().get("001", "name");
final Object address = redisTemplate.opsForHash().get("001", "address");
System.out.println(name+"======"+address);
//获得hash中所有的字段
System.out.println("获得hash中所有的字段");
final Set keys = redisTemplate.opsForHash().keys("001");
for (Object key : keys) {
System.out.println(key);
}
//获得hash结构中所有值
System.out.println("获得hash结构中所有值");
final List values = redisTemplate.opsForHash().values("001");
for (Object value : values) {
System.out.println(value);
}
}
五、操作数据类型List
简介
单键多值
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
它的底层实际是个双向链表,对两端的操作性能很高,通过索引下标的操作中间的节点性能会较差。
/**
* 操作数据类型List
*/
@Test
public void testList(){
final ListOperations listOperations = redisTemplate.opsForList();
//存值
listOperations.leftPush("001","a");
//存值(从左存入多个值)
listOperations.leftPushAll("003","b","c","d");
//取值
List ranges = listOperations.range("003", 0, -1);
for (Object range : ranges) {
System.out.print(range+" ");
}
System.out.println();//换行
//获取长度
final Long size = listOperations.size("003");
System.out.println("003的长度为 "+size);
System.out.print("弹出值:");
final int iSize = size.intValue();
for (int i = 0; i < iSize; i++) {
final Object leftPop = listOperations.leftPop("003");
System.out.print(leftPop+" ");
}
System.out.println();//换行
//取值
System.out.println("弹出后再次取值为:");
ranges = listOperations.range("003", 0, -1);
for (Object range : ranges) {
System.out.print(range+" ");
}
}
六、操作数据类型Set
Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
Redis的Set是string类型的无序集合。它底层其实是一个value为null的hash表,所以添加,删除,查找的复杂度都是O(1)。
一个算法,随着数据的增加,执行时间的长短,如果是O(1),数据增加,查找数据的时间不变
/**
* 操作数据类型Set
*/
@Test
public void testSet(){
final SetOperations setOperations = redisTemplate.opsForSet();
//存值
setOperations.add("k1","a","b","c","a");
//取值
Set k1s = setOperations.members("k1");
for (Object k1 : k1s) {
System.out.println(k1);
}
//删除成员
setOperations.remove("k1","a","b","d");
System.out.println("===删除后===");
k1s = setOperations.members("k1");
for (Object k1 : k1s) {
System.out.println(k1);
}
}
七、操作数据类型ZSet(有序集合)
Redis有序集合zset与普通集合set非常相似,是一个没有重复元素的字符串集合。
不同之处是有序集合的每个成员都关联了一个评分(score),这个评分(score)被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但是评分可以是重复了 。
因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。
访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。
/**
* 七、操作数据类型ZSet(有序集合)
*/
@Test
public void testZSet(){
final ZSetOperations zSetOperations = redisTemplate.opsForZSet();
//存值
zSetOperations.add("k2","a",10);
zSetOperations.add("k2","b",11);
zSetOperations.add("k2","c",12);
zSetOperations.add("k2","d",12);
zSetOperations.add("k2","a",10);
//取值
Set k2s = zSetOperations.range("k2", 0, -1);
for (Object k2 : k2s) {
System.out.println(k2);
}
System.out.println("取值完毕");
//修改值
zSetOperations.incrementScore("k2","e",15);//追加元素
zSetOperations.incrementScore("k2","a",20);//修改
//取值
k2s = zSetOperations.range("k2", 0, -1);
for (Object k2 : k2s) {
System.out.println(k2);
}
System.out.println("修改后取值完毕");
//删除成员
zSetOperations.remove("k2","a","b");//删除指定的
zSetOperations.removeRange("k2",0,-1);//删除范围的
}