redis
- 1、redis安装与启动服务
- 2、redis数据类型
- 3、redis常用命令
- 3.1 字符串String
- 3.2 哈希Hash
- 3.3 列表List
- 3.4 集合Set(无序)
- 3.5 有序集合zset
- 3.6 通用命令
- 4、使用Java操作Redis
- 4.1 环境准备
- 4.2 Java操作字符串String
- 4.3 Java操作哈希Hash
- 4.4 Java操作列表List
- 4.5 Java操作集合Set(无序)
- 4.6 Java操作有序集合zset
- 4.7 Java实现Redis常用命令
redis是基于内存的key-value结构的数据库。
1、redis安装与启动服务
安装redis主需要将下载好的redis压缩包解压到无中文的目录中即可。
启动服务打开命令行窗口,通过cd命令进入redis安装目录。或者在资源管理器中先进入redis安装目录,然后再该目录中打开命令行窗口。输入如下命令启动redis服务:
redis-server.exe redis.windows.conf
关闭服务按Ctrl + C
通过客户端连接redis服务。在安装目录中重新打开一个命令行窗口。由于redis默认是没有密码的,所以可以直接输入如下命令:
redis-cli.exe
设置redis密码。打开redis配置文件redis.windows.conf,找到配置密码命令,大概在443行。取消注释,将foobared替换成自己的密码,保存文件,重新启动服务即可。
requirepass foobared
设置密码之后重新通过客户端连接redis服务需要加上密码,完整命令为:
// -h 指定主机地址 -p 指定端口 -a redis密码
redis-cli.exe -h localhost -p 6379 -a 123456
可以通过redis客户端可视化软件连接redis服务,简化redis操作。
2、redis数据类型
redis有5种常用数据类型。
数据类型 | 特点 |
---|---|
字符串(String) | 普通字符串,Redis中最简单的数据类型 |
哈希(hash) | 也叫散列,类似于Java中的HashMap结构 |
列表(list) | 按照插入顺序排列,可以有重复元素,类似于Java中的LinkedList |
集合(set) | 无序集合,没有重复元素,类似于Java中的HashSet |
有序集合(sorted set / zset) | 集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素 |
3、redis常用命令
3.1 字符串String
命令 | 说明 |
---|---|
SET key value | 设置指定key的值 |
GET key | 获取指定key的值 |
SETEX key seconds value | 设置指定key的值,并将key的过期时间设为seconds秒 |
SETNX key value | 只有在key不存在时设置key的值 |
3.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 | 获取哈希表中的所有值 |
3.3 列表List
命令 | 说明 |
---|---|
LPUSH key value1 [value2] | 将一个或多个值插入到列表头部 |
LRANGE key start stop | 获取列表指定范围内的元素,查询所有元素start=0,stop=1 |
RPOP key | 移除并获取列表最后一个元素 |
LLEN key | 获取列表长度 |
3.4 集合Set(无序)
命令 | 说明 |
---|---|
SADD key member1 [member2] | 向集合添加一个或多个成员 |
SMEMBERS key | 返回集合中的所有成员 |
SCARD key | 获取集合的成员数 |
SINTER key1 [key2] | 返回给定所有集合的交集 |
SUNION key1 [key2] | 返回所有给定集合的并集 |
SREM key member1 [member2] | 删除集合中一个或多个成员 |
3.5 有序集合zset
命令 | 说明 |
---|---|
ZADD key score1 member1 [score2 member2] | 向有序集合添加成员 |
ZRANGE key start stop [WITHSCORES] | 通过索引区间返回有序集合中指定区间内的成员 |
ZINCRBY key increment member | 有序集合中对指定成员的分数加上增量increment |
ZREM key member [member…] | 移除有序集合中的一个或多个成员 |
3.6 通用命令
命令 | 说明 |
---|---|
KEYS pattern | 查找所有符合给定模式(pattern)的key |
EXISTS key | 检查给定key是否存在 |
TYPE key | 返回key所储存的值的类型 |
DEL key | 该命令用于在key存在时删除key |
4、使用Java操作Redis
Redis的Java客户端有很多种,这里介绍Spring Data Redis。
Spring Data Redis是Spring的一部分,对Redis底层开发包进行了高度封装。在Spring项目中,可以使用Spring Data Redis来简化操作。
4.1 环境准备
- 引入Redis依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
- 在配置文件中配置Redis数据源
host:主机地址;port:Redis端口号;password:Redis密码;database:数据库0-15
spring:
redis:
host: localhost
port: 6379
password: 123456
database: 0
- 编写配置类
@Configuration
@Slf4j
public class RedisConfiguration {
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { // 注入Redis连接工厂对象
log.info("开始创建RedisTemplate对象...");
RedisTemplate redisTemplate = new RedisTemplate();
// 设置redis的连接工厂对象
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 设置redis key的序列化器
redisTemplate.setKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
}
- 通过注入RedisTemplate 对象操作Redis。
// 注入RedisTemplate 对象
@Autowired
private RedisTemplate redisTemplate;
4.2 Java操作字符串String
说明 | 方法 |
---|---|
获取操作 String 的对象 | opsForValue() |
设置指定key的值 | set(key, value) |
获取指定key的值 | get() |
设置指定key的值,并设置key的过期时间 | set(key, value, 时间, 单位) |
只有在key不存在时设置key的值 | setIfAbsent(key, value) |
Java代码示例:
ValueOperations valueOperations = redisTemplate.opsForValue(); // 获取操作 String 的对象
valueOperations.set("city", "beijing"); // SET key value
String city = (String) valueOperations.get("city"); // GET key
System.out.println(city);
valueOperations.set("code", "123456", 60, TimeUnit.SECONDS); // SETEX key seconds value
valueOperations.setIfAbsent("lock", 1); // SETNX key value
valueOperations.setIfAbsent("lock", 2);
4.3 Java操作哈希Hash
说明 | 方法 |
---|---|
获取操作 hash 的对象 | opsForHash() |
将哈希表key中的字段field的值设为value | put(key, field, value) |
获取存储在哈希表中指定字段的值 | get(key, field) |
删除存储在哈希表中的指定字段 | delete(key, field) |
获取哈希表中的所有字段 | keys(key) |
获取哈希表中的所有值 | values(key) |
Java代码示例:
HashOperations hashOperations = redisTemplate.opsForHash(); // 获取操作 hash 的对象
hashOperations.put("100", "name", "Tom"); // HSET key field value
hashOperations.put("100", "age", "20");
String name = (String) hashOperations.get("100", "name"); // HGET key field
System.out.println(name);
Set keys = hashOperations.keys("100"); // HKEYS key
System.out.println(keys);
List values = hashOperations.values("100"); // HVALS key
System.out.println(values);
hashOperations.delete("100", "name"); // HDEL key field
4.4 Java操作列表List
说明 | 方法 |
---|---|
获取操作 list 的对象 | opsForList() |
将一个或多个值插入到列表头部 | leftPushAll(key, value1, value2) |
插入单个值 | leftPush(key, value) |
获取列表指定范围内的元素,查询所有元素start=0,stop=1 | range(key, start, stop) |
移除并获取列表最后一个元素 | rightPop(key) |
获取列表长度 | size(key) |
Java代码范例:
ListOperations listOperations = redisTemplate.opsForList(); // 获取操作 list 的对象
listOperations.leftPushAll("mylist", "a", "b", "c"); // LPUSH key value1 [value2] 插入多个值
listOperations.leftPush("mylist", "d"); // LPUSH key value1 插入单个值
List mylist = listOperations.range("mylist", 0, -1); // LRANGE key start stop
System.out.println(mylist);
listOperations.rightPop("mylist"); // RPOP key
Long size = listOperations.size("mylist"); // LLEN key
System.out.println(size);
4.5 Java操作集合Set(无序)
说明 | 方法 |
---|---|
获取操作 set 的对象 | opsForSet() |
向集合添加一个或多个成员 | add(setKey, member1, member2) |
返回集合中的所有成员 | members(setKey) |
获取集合的成员数 | size(setKey) |
返回给定所有集合的交集 | intersect(setKey1, setKey2) |
返回所有给定集合的并集 | union(setKey1, setKey2) |
删除集合中一个或多个成员 | remove(setKey, member1, member2) |
Java代码范例:
SetOperations setOperations = redisTemplate.opsForSet(); // 获取操作 set 的对象
setOperations.add("set1", "a", "b", "c", "d"); // SADD key member1 [member2]
setOperations.add("set2", "a", "b", "x", "y");
Set set1Members = setOperations.members("set1"); // SMEMBERS key
System.out.println(set1Members);
Long set1Size = setOperations.size("set1"); // SCARD key
System.out.println(set1Size);
Set intersect = setOperations.intersect("set1", "set2"); // SINTER key1 key2 [key3]
System.out.println(intersect);
Set union = setOperations.union("set1", "set2"); // SUNION key1 key2 [key3]
System.out.println(union);
setOperations.remove("set1", "a"); // SREM key member1 [member2]
4.6 Java操作有序集合zset
命令/说明 | 方法 |
---|---|
获取操作 zset 的对象 | opsForZSet() |
向有序集合添加成员 | add(zsetKey, member, score) |
通过索引区间返回有序集合中指定区间内的成员 | range(zsetKey, start, stop) |
有序集合中对指定成员的分数加上增量increment | incrementScore(zsetKey, member, increment) |
移除有序集合中的一个或多个成员 | remove(zsetKey, member1, member2) |
Java代码范例:
ZSetOperations zSetOperations = redisTemplate.opsForZSet(); // 获取操作 zset 的对象
zSetOperations.add("zset1", "a", 10); // ZADD key score member1
zSetOperations.add("zset1", "b", 12);
zSetOperations.add("zset1", "c", 9);
Set zset1 = zSetOperations.range("zset1", 0, -1); // ZRANGE key start stop
System.out.println(zset1);
zSetOperations.incrementScore("zset1", "c", 10); // ZINCRBY key increment member
zSetOperations.remove("zset1", "a", "b"); // ZREM key member1 [member2]
4.7 Java实现Redis常用命令
通用操作直接使用redisTemplate对象。
说明 | 方法 |
---|---|
查找所有符合给定模式(pattern)的key | keys(“给定的模式”) |
检查给定key是否存在 | hasKey(key) |
返回key所储存的值的类型 | type(key) |
该命令用于在key存在时删除key | delete(key) |
Java代码范例:
// 通用操作直接使用redisTemplate对象
Set keys = redisTemplate.keys("*"); // KEYS pattern
System.out.println(keys);
Boolean name = redisTemplate.hasKey("name"); // EXISTS key
for(Object key : keys){
DataType type = redisTemplate.type(key); // TYPE key
System.out.println(type.name());
}
redisTemplate.delete("mylist"); // DEL key