本文最后更新于22 天前,其中的信息可能已经过时,如有错误请发送邮件到qiqin-chang@qq.com
基础信息:
下载地址:
win版:https://github.com/microsoftarchive/redis/releases
Linux版:https://download.redis.io/releases/
安装方式:解压安装
默认端口号:6379
推荐版本:3.2.1
推荐可视化工具:Another Redis
推荐驱动工具:SpringData Redis
基础操作:
服务端:
运行操作:
redis-server.exe redis.windows.conf
结束操作:
ctrl + c
客户端:
连接操作:
redis-cli.exe (默认连接本地服务端)redis-cli.exe -h 服务端地址 -p 端口号 -a 密码
退出操作:
exit
密码设置:
在redis.windows.conf文件中解开requirepass foobared (foobared为密码)
驱动工具:SpringData Redis
基础配置:
配置方式:导入maven坐标->配置Redis数据源->编写配置类->创建RedisTemplate对象->通过对象操作Redis
导入maven坐标:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
配置Redis数据源:
spring:
redis:
host: localhost
port: 6379
password: 123456
database: 0
基础类型:
| 类型 | 符号 | 说明 |
|---|---|---|
| 字符串 | string | 普通字符,Redis中最简单的数据 |
| 哈希 | hash- | 类似与Java中的HashMap结构 |
| 列表 | list | 按照插入顺序排序,可以有重复元素,类似于Java中的LinkedList |
| 集合 | set | 无须集合,没有重复元素,类似Java中的HashSet |
| 有序集合 | sorted set/zset | 集合中的每个元素关联一个分数(score),根据分数升序排列,没有重复元素 |
操作命令:
字符串:
SET key value 设置指定key的值
GET key 获取指定key的值
SETEX key second value 设置指定key的值,并将key的过期时间设置为seconds
SETNX key value 只有在key不存在时才能设置key的值
哈希:
HSET key field value 将哈希表key中的字段field的值设为value
HSET key field 获取存储在哈希表中的指定字段
HDEL key field 删除存储在 哈希表中的指定字段
HKEYS key 获取哈希表中的所有字段
HVALS key 获取哈希表中的所有值
字符串:
LPUSH key value1 [value2] 将一个或多个值插入到列表头部
LRANG key start stop 获取列表指定范围内的元素(stop=-1为返回全部)
RPOP key 移除并获取列表最后一个元素
LLEN key 获取列表长度
集合:
SADD key member1 [member2] 向集合添加一个或多个成员
SMEMBERS key 返回集合中的所有成员
SCARD key 返回给定所有集合的交集
SINTER key1 [key2] 返回所有给定集合的并集
SUNION key1 [key2] 返回所有给定集合的并集
SREM key member1 [member2] 删除集合中的一个或多个成员
有序集合:
ZADD key score1 member1 [score2 member2] 向有序集合添加一个或多个成员
ZRANGE key start stop [WITHSCORES] 通过索引区间返回有序集合中指定区间的成员
ZINCRBY key increment member 有序集合中对指定成员的分数加上增量increment
ZREM key member1 [member2] 移除有序集合中的一个或多个成员
通用命令:
KEYS pattern 查找所有符合给定模式(pattern)的key
EXISTS key 检查给定key是否存在
TYPE key 返回key所存储的值的类型
DEL key 该命令用于在key存在时删除key
使用方法:
字符串 String:
//存入对象
redisTemplate.opsForValue().set("user:" + user.getId(), user, Duration.ofMinutes(30));
//获取对象
redisTemplate.opsForValue().get("user:" + id);
哈希 hash:
redisTemplate.opsForHash().put("user:1001", "name", "Alice");
redisTemplate.opsForHash().put("user:1001", "age", 25);
String name = (String) redisTemplate.opsForHash().get("user:1001", "name");
列表 list:
//添加元素
//从左边插入一个元素
redisTemplate.opsForList().leftPush("users:list", user);
//从左边批量插入多个元素
redisTemplate.opsForList().leftPushAll("users:list", user1, user2);
//从右边插入一个元素
redisTemplate.opsForList().rightPush("users:list", user);
//从右边批量插入多个元素
redisTemplate.opsForList().rightPushAll("users:list", user1, user2);
//获取列表范围
//获取整个列表(0 到 -1 表示全部)
List<Object> users = redisTemplate.opsForList().range("users:list", 0, -1);
//获取前3个元素
List<Object> firstThree = redisTemplate.opsForList().range("users:list", 0, 2);
//获取最后一个元素
List<Object> lastOne = redisTemplate.opsForList().range("users:list", -1, -1);
//获取列表长度
Long size = redisTemplate.opsForList().size("users:list");
// 弹出元素(移除并返回)
// 从左边弹出一个元素
Object leftUser = redisTemplate.opsForList().leftPop("users:list");
// 从右边弹出一个元素
Object rightUser = redisTemplate.opsForList().rightPop("users:list");
// 阻塞式弹出(BLPOP / BRPOP)——如果列表为空则等待,单位:秒
Object blockedUser = redisTemplate.opsForList().leftPop("users:list", 10, TimeUnit.SECONDS);
Object blockedRight = redisTemplate.opsForList().rightPop("users:list", 5, TimeUnit.SECONDS);
//删除元素
//移除列表中等于 value 的前 n 个元素
//count > 0 : 从头开始删除最多 count 个匹配项
//count < 0 : 从尾开始删除最多 |count| 个匹配项
//count = 0 : 删除所有匹配项
Long removedCount = redisTemplate.opsForList().remove("users:list", 1, user); // 删除第一个匹配的 user
Long removeAll = redisTemplate.opsForList().remove("users:list", 0, user); // 删除所有匹配的 user
//获取指定索引位置的元素
//获取索引为 0 的元素(第一个)
Object first = redisTemplate.opsForList().index("users:list", 0);
//获取倒数第一个元素
Object last = redisTemplate.opsForList().index("users:list", -1);
//设置指定索引位置的元素
//将索引 index 处的元素设置为新值(必须存在该索引)
redisTemplate.opsForList().set("users:list", 2, updatedUser);
//截取并保留指定范围
//只保留列表中 [0, 9] 范围内的元素,其余删除(可用于分页缓存清理)
redisTemplate.opsForList().trim("users:list", 0, 9);
//清空整个列表
redisTemplate.opsForList().trim("users:list", 1, 0); // 巧妙技巧:起始 > 结束 → 清空
无序集合 set:
//存入集合
redisTemplate.opsForSet().add("users:set", "user");
//获取集合中所有值
Set<Object> userSet = redisTemplate.opsForSet().members("users:set");
//判断是否存在该值
Boolean isLiked = redisTemplate.opsForSet().isMember("users:set", "user");
//获取集合大小
Long count = redisTemplate.opsForSet().zCard("users:set"); // 推荐写法
// 删除一个用户
redisTemplate.opsForSet().remove("users:set", "user");
// 删除多个用户
redisTemplate.opsForSet().remove("users:set", "user1", "user2");
// 删除所有匹配的值
Object[] toRemove = {"user1", "user2"};
redisTemplate.opsForSet().remove("users:set", toRemove);
//随机弹出并删除元素
Object luckyUser = redisTemplate.opsForSet().pop("users:set");
//求交集
Set<Object> commonFriends = redisTemplate.opsForSet().intersect("user:set1", "user:set2");
//求并集
Set<Object> allMembers = redisTemplate.opsForSet().union("user:set1", "user:set2");
//求差集
Set<Object> recommendUsers = redisTemplate.opsForSet().difference("user:set1", "user:set2");
有序集合 sorted set/zset:
//将值存入指定的有序集合
redisTemplate.opsForZSet().add(LEADERBOARD_KEY, userId.toString(), score); //key value 排序值
//获取第x个到第y个的该集合的所有值
//正序获得
redisTemplate.opsForZSet().rangeWithScores(LEADERBOARD_KEY, 0, topN - 1);
//逆序获得
redisTemplate.opsForZSet().reverseRangeWithScores(LEADERBOARD_KEY, 0, topN - 1);
//获取该值的存入顺序(从0开始)
redisTemplate.opsForZSet().reverseRank(LEADERBOARD_KEY, uid);
//获取排序值
redisTemplate.opsForZSet().score(LEADERBOARD_KEY, uid);
//增加排序值
redisTemplate.opsForZSet().incrementScore(LEADERBOARD_KEY, uid, increment);
//删除该值
redisTemplate.opsForZSet().remove(LEADERBOARD_KEY, uid);
//获取该有序集合存入值的数量
redisTemplate.opsForZSet().zCard(LEADERBOARD_KEY);
//获取区间内的值
redisTemplate.opsForZSet().reverseRangeByScoreWithScores(LEADERBOARD_KEY, min, max);
//删除区间内的值
redisTemplate.opsForZSet().removeRangeByScore(LEADERBOARD_KEY, min, max);
设置过期时间:
redisTemplate.expire("key", 10, TimeUnit.SECONDS);
redisTemplate.expireAt("key", new Date(System.currentTimeMillis() + 60000));