文章目录
前言
我们在java程序中应该如何操作Redis呢?这就需要使用Redis的Java客户端,就如同我们使用JDBC操作MySQL数据库一样。
Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即 spring-boot-starter-data-redis。
我们使用Spring Data Redis。
一、redis介绍
Redis是一个基于内存的key-value型结构数据库。Redis 是互联网技术领域使用最为广泛的存储中间件。
主要特点:
-
基于内存存储,读写性能高
-
适合存储热点数据(热点商品、资讯、新闻)
-
企业应用广泛
Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库,它属于非关系型数据库
1.redis服务的启用
首先下载Windows版的redis安装包进行安装
1、在cmd命令行中输入redis-server.exe redis.windows.conf
2、直接运行其服务端exe可执行文件
Redis服务默认端口号为 6379 ,如果需要修改端口号可以去配置文件中修改。
当Redis服务启动成功后,可通过客户端进行连接。
2.redis五种常用的数据类型
Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:
-
字符串 string :普通字符串,Redis中最简单的数据类型
-
哈希 hash:也叫散列,类似于Java中的HashMap结构
-
列表 list:按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList
-
集合 set:无序集合,没有重复元素,类似于Java中的HashSet
-
有序集合 sorted set / zset:集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素
二、操作步骤
1.引入maven坐标
代码如下
<!--redis坐标-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
2.配置redis数据源
在yml文件中
spring:
redis:
host: localhost
port: 6379
password: ******
# 创建的时候会默认创建16个库,可以通过database指定操作哪个数据库,默认是操作0号数据库
database: 10
3、编写配置类,创建RedisTemplate对象
放在config包下面
//redis的配置类
@Configuration
@Slf4j
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory){
RedisTemplate redisTemplate = new RedisTemplate();
//设置redis的连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
//设置redis key的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
//设置redis value的序列化器
redisTemplate.setValueSerializer(new StringRedisSerializer());
return redisTemplate;
}
}
当前配置类不是必须的,因为 Spring Boot 框架会自动装配 RedisTemplate 对象,但是默认的key序列化器为JdkSerializationRedisSerializer,导致我们存到Redis中后的数据和原始数据有差别,故设置为StringRedisSerializer序列化器。
4、通过RedisTemplate对象操作Redis
创建一个测试类SpringDataRedisTest
public class SpringDataRedisTest {
@Autowired
private RedisTemplate redisTemplate;
public SpringDataRedisTest() {
}
@Test
public void testRedisTemplate() {
System.out.println(this.redisTemplate);
ValueOperations valueOperations = this.redisTemplate.opsForValue();
HashOperations hashOperations = this.redisTemplate.opsForHash();
ListOperations listOperations = this.redisTemplate.opsForList();
SetOperations setOperations = this.redisTemplate.opsForSet();
ZSetOperations zSetOperations = this.redisTemplate.opsForZSet();
}
}
1). 操作字符串类型数据
@Test
public void testString() {
this.redisTemplate.opsForValue().set("city1", "北京");
String city = (String)this.redisTemplate.opsForValue().get("city");
System.out.println(city);
this.redisTemplate.opsForValue().set("code", "1234", 3L, TimeUnit.MINUTES);
this.redisTemplate.opsForValue().setIfAbsent("lock", "1");
this.redisTemplate.opsForValue().setIfAbsent("lock", "2");
}
2).操作哈希类型数据
@Test
public void testHash() {
HashOperations hashOperations = this.redisTemplate.opsForHash();
hashOperations.put("zyxhash", "name", "zyx");
hashOperations.put("zyxhash", "age", "19");
String o = (String)hashOperations.get("zyxhash", "name");
System.out.println(o);
Set zyxhash = hashOperations.keys("zyxhash");
System.out.println(zyxhash);
List zyxhash1 = hashOperations.values("zyxhash");
System.out.println(zyxhash1);
hashOperations.delete("zyxhash", new Object[]{"age"});
}
3).操作列表类型数据
@Test
public void testList() {
ListOperations listOperations = this.redisTemplate.opsForList();
listOperations.leftPushAll("mylist", new Object[]{"a", "b", "c"});
listOperations.leftPush("mylist", "d");
List mylist = listOperations.range("mylist", 0L, -1L);
System.out.println(mylist);
listOperations.rightPop("mylist");
Long size = listOperations.size("mylist");
System.out.println(size);
}
4).操作集合类型数据
@Test
public void testSet() {
SetOperations setOperations = this.redisTemplate.opsForSet();
setOperations.add("set1", new Object[]{"a", "b", "c", "d"});
setOperations.add("set2", new Object[]{"a", "b", "x", "y"});
Set members = setOperations.members("set1");
System.out.println(members);
Long size = setOperations.size("set1");
System.out.println(size);
Set intersect = setOperations.intersect("set1", "set2");
System.out.println(intersect);
Set union = setOperations.union("set1", "set2");
System.out.println(union);
setOperations.remove("set1", new Object[]{"a", "b"});
}
5).操作有序集合类型数据
@Test
public void testZset() {
ZSetOperations zSetOperations = this.redisTemplate.opsForZSet();
zSetOperations.add("zset1", "a", 10.0);
zSetOperations.add("zset1", "b", 12.0);
zSetOperations.add("zset1", "c", 9.0);
Set zset1 = zSetOperations.range("zset1", 0L, -1L);
System.out.println(zset1);
zSetOperations.incrementScore("zset1", "c", 10.0);
zSetOperations.remove("zset1", new Object[]{"a", "b"});
}
6).通用命令
@Test
public void testCommon() {
Set keys = this.redisTemplate.keys("*");
System.out.println(keys);
Boolean name = this.redisTemplate.hasKey("name");
Boolean set1 = this.redisTemplate.hasKey("set1");
Iterator var4 = keys.iterator();
while(var4.hasNext()) {
Object key = var4.next();
DataType type = this.redisTemplate.type(key);
System.out.println(type.name());
}
this.redisTemplate.delete("mylist");
}