> 文章列表 > Redis --- 常用命令、Java中操作Redis

Redis --- 常用命令、Java中操作Redis

Redis --- 常用命令、Java中操作Redis

一、Redis常用命令

1.1、字符串string操作命令

Redis 中字符串类型常用命令:

  • SET key value 设置指定key的值

  • GET key 获取指定key的值

  • SETEX key seconds value 设置指定key的值,并将 key 的过期时间设为 seconds 秒

  • SETNX key value 只有在 key 不存在时设置 key 的值

更多命令可以参考Redis中文网:https://www.redis.net.cn

 

1.2、哈希hash操作命令

Redis hash 是一个string类型的 field 和 value 的映射表,hash特别适合用于存储对象,常用命令:

  • HSET key field value 将哈希表 key 中的字段 field 的值设为 value

  • HGET key field 获取存储在哈希表中指定字段的值

  • HDEL key field 删除存储在哈希表中的指定字段

  • HKEYS key 获取哈希表中所有字段

  • HVALS key 获取哈希表中所有值

  • HGETALL key 获取在哈希表中指定 key 的所有字段和值

 

1.3、列表list操作命令

Redis 列表是简单的字符串列表,按照插入顺序排序,常用命令:

  • LPUSH key value1 [value2] 将一个或多个值插入到列表头部

  • LRANGE key start stop 获取列表指定范围内的元素

  • RPOP key 移除并获取列表最后一个元素

  • LLEN key 获取列表长度

  • BRPOP key1 [key2 ] timeout 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超 时或发现可弹出元素为止

 

1.4、集合set操作命令

Redis set 是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据,常用命令:

  • SADD key member1 [member2] 向集合添加一个或多个成员

  • SMEMBERS key 返回集合中的所有成员

  • SCARD key 获取集合的成员数

  • SINTER key1 [key2] 返回给定所有集合的交集

  • SUNION key1 [key2] 返回所有给定集合的并集

  • SDIFF key1 [key2] 返回给定所有集合的差集

  • SREM key member1 [member2] 移除集合中一个或多个成员

 

1.5、有序集合sorted set操作命令

Redis sorted set 有序集合是 string 类型元素的集合,且不允许重复的成员。每个元素都会关联一个double类型的分数(score) 。redis正是通过分数来为集合中的成员进行从小到大排序。有序集合的成员是唯一的,但分数却可以重复。

常用命令:

  • ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员,或者更新已存在成员的 分数

  • ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间内的成员

  • ZINCRBY key increment member 有序集合中对指定成员的分数加上增量 increment

  • ZREM key member [member ...] 移除有序集合中的一个或多个成员

 

1.6、通用命令

Redis中的通用命令,主要是针对key进行操作的相关命令:

  • KEYS pattern 查找所有符合给定模式( pattern)的 key

  • EXISTS key 检查给定 key 是否存在

  • TYPE key 返回 key 所储存的值的类型

  • TTL key 返回给定 key 的剩余生存时间(TTL, time to live),以秒为单位

  • DEL key 该命令用于在 key 存在是删除 key

 

 

二、在Java中操作Redis

2.1、介绍

前面我们讲解了Redis的常用命令,这些命令是我们操作Redis的基础,那么我们在java程序中应该如何操作Redis呢?这就需要使用Redis的Java客户端,就如同我们使用JDBC操作MySQL数据库一样。

Redis 的 Java 客户端很多,官方推荐的有三种:

  • Jedis

  • Lettuce

  • Redisson

Spring 对 Redis 客户端进行了整合,提供了 Spring Data Redis,在Spring Boot项目中还提供了对应的Starter,即 spring-boot-starter-data-redis。

 

2.2、Jedis

Jedis 是 Redis 的 Java 版本的客户端实现。

maven坐标:

<dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>2.8.0</version>
</dependency>

使用 Jedis 操作 Redis 的步骤:

  1. 获取连接

  2. 执行操作

  3. 关闭连接

示例代码:

/* 使用Jedis操作Redis*/
public class JedisTest {@Testpublic void testRedis(){//1 获取连接Jedis jedis = new Jedis("localhost",6379);//2 执行具体的操作jedis.set("username","xiaoming");String value = jedis.get("username");System.out.println(value);//jedis.del("username");jedis.hset("myhash","addr","bj");String hValue = jedis.hget("myhash", "addr");System.out.println(hValue);Set<String> keys = jedis.keys("*");for (String key : keys) {System.out.println(key);}//3 关闭连接jedis.close();}
}

 

2.3、Spring Data Redis

2.3.1、介绍

Spring Data Redis 是 Spring 的一部分,提供了在 Spring 应用中通过简单的配置就可以访问 Redis 服务,对 Redis 底层开发包进行了高度封装。在 Spring 项目中,可以使用Spring Data Redis来简化 Redis 操作。

网址:Spring Data Redis

 maven坐标:

<dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>2.4.8</version>
</dependency>

Spring Boot提供了对应的Starter,maven坐标:

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

Spring Data Redis中提供了一个高度封装的类:RedisTemplate,针对 Jedis 客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

  • ValueOperations:简单K-V操作

  • SetOperations:set类型数据操作

  • ZSetOperations:zset类型数据操作

  • HashOperations:针对hash类型的数据操作

  • ListOperations:针对list类型的数据操作

 

2.3.2、使用方式

环境搭建

  

第一步:创建maven项目springdataredis_demo,配置pom.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.5</version><relativePath/></parent><groupId>com.itheima</groupId><artifactId>springdataredis_demo</artifactId><version>1.0-SNAPSHOT</version><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.4.5</version></plugin></plugins></build>
</project>

 

第二步:编写启动类

package com.itheima;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class App {public static void main(String[] args) {SpringApplication.run(App.class,args);}}

 

第三步:配置application.yml

spring:application:name: springdataredis_demo#Redis相关配置redis:host: localhostport: 6379#password: 123456database: 0 #操作的是0号数据库jedis:#Redis连接池配置pool:max-active: 8 #最大连接数max-wait: 1ms #连接池最大阻塞等待时间max-idle: 4 #连接池中的最大空闲连接min-idle: 0 #连接池中的最小空闲连接

解释说明:

  • spring.redis.database:指定使用Redis的哪个数据库,Redis服务启动后默认有16个数据库,编号分别是从0到15。
  • 可以通过修改Redis配置文件来指定数据库的数量。

 

第四步:提供配置类

/* Redis配置类*/
@Configuration
public class RedisConfig extends CachingConfigurerSupport {@Beanpublic RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory connectionFactory) {RedisTemplate<Object, Object> redisTemplate = new RedisTemplate<>();//默认的Key序列化器为:JdkSerializationRedisSerializerredisTemplate.setKeySerializer(new StringRedisSerializer());redisTemplate.setHashKeySerializer(new StringRedisSerializer());redisTemplate.setConnectionFactory(connectionFactory);return redisTemplate;}}

解释说明:

  • 当前配置类不是必须的,因为 Spring Boot 框架会自动装配 RedisTemplate 对象,但是默认的key序列化器为JdkSerializationRedisSerializer,导致我们存到Redis中后的数据和原始数据有差别.

 

第五步:提供测试类

@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringDataRedisTest {@Autowiredprivate RedisTemplate redisTemplate;}

操作字符串类型数据

/* 操作String类型数据
*/
@Test
public void testString(){//存值redisTemplate.opsForValue().set("city123","beijing");//取值String value = (String) redisTemplate.opsForValue().get("city123");System.out.println(value);//存值,同时设置过期时间redisTemplate.opsForValue().set("key1","value1",10l, TimeUnit.SECONDS);//存值,如果存在则不执行任何操作Boolean aBoolean = redisTemplate.opsForValue().setIfAbsent("city1234", "nanjing");System.out.println(aBoolean);
}

操作哈希类型数据

/* 操作Hash类型数据
*/
@Test
public void testHash(){HashOperations hashOperations = redisTemplate.opsForHash();//存值hashOperations.put("002","name","xiaoming");hashOperations.put("002","age","20");hashOperations.put("002","address","bj");//取值String age = (String) hashOperations.get("002", "age");System.out.println(age);//获得hash结构中的所有字段Set keys = hashOperations.keys("002");for (Object key : keys) {System.out.println(key);}//获得hash结构中的所有值List values = hashOperations.values("002");for (Object value : values) {System.out.println(value);}
}

操作列表类型数据

/* 操作List类型的数据
*/
@Test
public void testList(){ListOperations listOperations = redisTemplate.opsForList();//存值listOperations.leftPush("mylist","a");listOperations.leftPushAll("mylist","b","c","d");//取值List<String> mylist = listOperations.range("mylist", 0, -1);for (String value : mylist) {System.out.println(value);}//获得列表长度 llenLong size = listOperations.size("mylist");int lSize = size.intValue();for (int i = 0; i < lSize; i++) {//出队列String element = (String) listOperations.rightPop("mylist");System.out.println(element);}
}

操作集合类型数据

/* 操作Set类型的数据
*/
@Test
public void testSet(){SetOperations setOperations = redisTemplate.opsForSet();//存值setOperations.add("myset","a","b","c","a");//取值Set<String> myset = setOperations.members("myset");for (String o : myset) {System.out.println(o);}//删除成员setOperations.remove("myset","a","b");//取值myset = setOperations.members("myset");for (String o : myset) {System.out.println(o);}}

操作有序集合类型数据

/* 操作ZSet类型的数据
*/
@Test
public void testZset(){ZSetOperations zSetOperations = redisTemplate.opsForZSet();//存值zSetOperations.add("myZset","a",10.0);zSetOperations.add("myZset","b",11.0);zSetOperations.add("myZset","c",12.0);zSetOperations.add("myZset","a",13.0);//取值Set<String> myZset = zSetOperations.range("myZset", 0, -1);for (String s : myZset) {System.out.println(s);}//修改分数zSetOperations.incrementScore("myZset","b",20.0);//取值myZset = zSetOperations.range("myZset", 0, -1);for (String s : myZset) {System.out.println(s);}//删除成员zSetOperations.remove("myZset","a","b");//取值myZset = zSetOperations.range("myZset", 0, -1);for (String s : myZset) {System.out.println(s);}
}

通用操作

/* 通用操作,针对不同的数据类型都可以操作
*/
@Test
public void testCommon(){//获取Redis中所有的keySet<String> keys = redisTemplate.keys("*");for (String key : keys) {System.out.println(key);}//判断某个key是否存在Boolean itcast = redisTemplate.hasKey("itcast");System.out.println(itcast);//删除指定keyredisTemplate.delete("myZset");//获取指定key对应的value的数据类型DataType dataType = redisTemplate.type("myset");System.out.println(dataType.name());}