一、简介
Redis是一个基于内存的key-value结构数据库;Redis教程
- 基于内存存储,读写性能高;
- 适合存储热点数据(如:热点商品、资讯、新闻等);
官网:前往
中文网站:前往
Redis安装包分为Windows版和Linux版
- Windows版下载:快速下载通道
- Linux版下载:快速下载通道
二、下载与安装
Redis的windows版属于绿色软件,直接解压即可使用,解压目录结构如下:
进入到解压目录内,在顶部文件路径输入cmd,进入cmd终端页面输入启动服务命令:
redis-server.exe redis.windows.conf
如果你想在 IDEA Shell Script 配置里面写启动命令
.\redis-server.exe redis.windows.conf
继续在解压目录下新开一个cmd终端窗口,输入启动客户端连接命令:redis-cli.exe, 然后输入:keys * ;进行查看就成功了
也可以通过命令连接指定地址和端口的redis服务:
//例如连接本地的redis服务 redis-cli.exe-h localhost-p6379三、设置Redis服务的密码
redis默认是没有密码的,可以通过修改【redis.windows.conf】配置文件,进行密码设置;
- 打开redis.windows.conf配置文件;
- 全局搜索:requirepass foobared;
- 去掉【#requirepass foobared】的#;
- 将foobared 修改为你需要设置的密码【例如:123456】;
- 保存文件重新启动服务;
修改后:
退出服务命令:
exit 或 按键:ctrl+c重启服务后,再连接进行操作就报错:【需要NOAUTH身份验证】;
可以通过命令进行快速认证连接:
redis-cli.exe-h localhost-p6379-a123456就可以重新进行操作了!以上命令用法可以当做练手学习;
四、Redis图形软件的使用
安装redis的图形界面软件:【Another Redis Desktop Manger】
下载地址:Another Redis Desktop Manger
下载完成后双击运行安装就可以了;
进入到图形软件,点击【新建连接】,进行连接设置,设置完成点击确定就完成连接了;
五、Redis数据类型
5种常用数据类型
Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:- 字符串 string
- 哈希 hash
- 列表 list
- 集合 set
- 有序集合 sorted set / zset
各种数据类型的特点
- 字符串 string:最基础、常用的类型,可存储字符串、整数或浮点数,常用于缓存、计数器、分布式锁等场景;
- 哈希 hash:也叫散列,类似于java中的HashMap结构,适合存储对象,如用户信息、商品详情,可对单个字段进行读写;
- 列表 list:按插入顺序存储,支持两端操作,可以有重复元素,类似于java中的LinkedList,适合消息队列、最新动态列表;
- 集合 set:元素唯一且无序,类似于java中的HashSet,适合去重、共同好友、标签等场景;
- 有序集合 zset:元素唯一,集合中每个元素关联一个分数(score),根据分数进行升序排序,适合排行榜、延时队列等场景。
数据类型选型建议
- 需要缓存热点数据、简单计数 → 优先考虑 string;
- 需要存储结构化对象并频繁更新部分字段 → 优先考虑 hash;
- 需要按时间顺序存取、实现队列 → 优先考虑 list;
- 需要去重、求交集并集 → 优先考虑 set;
- 需要按分数排序、做排行榜 → 优先考虑 zset。
六、Redis常用命令
- 键操作命令
| 命令 | 示例 | 说明 |
|---|---|---|
| SET | SET name zhangsan | 设置指定 key 的值,若 key 已存在则覆盖 |
| GET | GET name | 获取指定 key 的值,不存在时返回(nil) |
| DEL | DEL name | 删除一个或多个 key,返回被删除的数量 |
| KEYS | KEYS pattern,如:KEYS * 或者KEYS user* | 查找所有符合给定模式(pattern)的key |
| EXISTS | EXISTS name | 判断 key 是否存在,存在返回 1,不存在返回 0 |
| TYPE | TYPE name | 检查数据类型,返回对应的数据类型 |
| EXPIRE | EXPIRE name 60 | 设置 key 的过期时间(单位:秒),到期后自动删除 |
- 字符串命令
| 命令 | 示例 | 说明 |
|---|---|---|
| INCR | INCR count | 将 key 中存储的数字值加 1,常用于计数器、浏览量统计 |
| DECR | DECR count | 将 key 中存储的数字值减 1 |
| APPEND | APPEND msg " world" | 将字符串追加到 key 原有值的末尾,返回追加后的总长度 |
- 哈希命令
| 命令 | 示例 | 说明 |
|---|---|---|
| HSET | HSET user:1 name zhangsan | 设置哈希表中指定字段的值,字段不存在则新建 |
| HGET | HGET user:1 name | 获取哈希表中指定字段的值 |
| HDEL | HDEL user:1 name | 删除哈希表中的一个或多个字段 |
| HKEYS | HKEYS user:1 | 获取哈希表中所有字段 |
| HVALS | HVALS user:1 | 获取哈希表中所有值 |
- 列表命令
| 命令 | 示例 | 说明 |
|---|---|---|
| LPUSH | LPUSH list a b c | 从列表左侧(头部)插入一个或多个元素 |
| RPUSH | RPUSH list x y | 从列表右侧(尾部)插入一个或多个元素 |
| LRANGE | LRANGE list [开始位置,如:0] [结束位置,如:-1] | 获取列表指定范围内的元素,"-1"代表:整个列表的最后位置 |
| LLEN | LLEN list | 获取列表长度 |
| LPOP | LPOP list | 移除并返回列表左侧(头部)的第一个元素 |
| RPOP | RPOP list | 移除并返回列表右侧(尾部)的最后一个元素 |
- 集合命令
| 命令 | 示例 | 说明 |
|---|---|---|
| SADD | SADD gather a b c | 向集合中添加一个或多个元素,重复元素会被忽略 |
| SMEMBERS | SMEMBERS gather | 返回集合中的所有元素 |
| SCARD | SCARD gather | 获取集合的成员数 |
| SINTER | SINTER gather1 gather2 | 返回给定所有集合的交集 |
| SUNION | SUNION gather1 gather2 | 返回给定所有集合的并集 |
| SREM | SREM gather a | 从集合中移除一个或多个元素 |
- 有序集合命令
| 命令 | 示例 | 说明 |
|---|---|---|
| ZADD | ZADD zset 90 zhangsan | 向有序集合中添加元素并指定分数(score),用于排行榜等场景 |
| ZRANGE | ZRANGE zset 0 -1 [WITHSCORES] | 按分数升序返回指定范围内的元素,withscores为可选输入,如输入,会把分数一起返回 |
| ZINCRBY | ZINCRBY zset increment zhangsan | 有序集合中对指定成员的分数加上增量 increment |
| ZSCORE | ZSCORE zset zhangsan | 获取有序集合中指定元素的分数 |
| ZREM | ZREM zset zhangsan | 移除有序集合中的一个或者多个元素 |
- 通用命令
| 命令 | 示例 | 说明 |
|---|---|---|
| SELECT | SELECT 1 | 切换到指定的数据库(Redis 默认有 16 个库,编号 0-15) |
| DBSIZE | DBSIZE | 返回当前数据库中 key 的总数量 |
| FLUSHDB | FLUSHDB | 清空当前数据库中的所有 key,操作前请谨慎确认 |
以上命令可通过图形操作软件进行测试;
七、在java中操作Redis
前面我们学习了 Redis 的命令行操作,接下来看看如何在 Java 项目中操作 Redis。本章将介绍常用的 Java 客户端,以及 Spring Data Redis 的使用方式,帮助你把 Redis 集成到实际项目中。
1. Redis的java客户端
常用的 Java 客户端有以下三种:
- Jedis:轻量、简洁,是 Redis 官方推荐的 Java 客户端,API 直观,适合中小型项目;
- Lettuce:基于 Netty 实现,支持同步、异步和响应式编程,性能优秀,是 Spring Boot 2.x 默认的客户端;
- Redisson:功能最丰富,提供了分布式锁、分布式集合等高级特性,适合复杂分布式场景。
选型建议:如果是 Spring Boot 项目,直接使用默认的 Lettuce 即可;如果只是简单的工具类或非 Spring 项目,可以选择 Jedis。
下面以 Jedis 为例,演示在 Java 中操作 Redis:
<!-- Maven 依赖 --><dependency><groupId>redis.clients</groupId><artifactId>jedis</artifactId><version>4.4.3</version></dependency>importredis.clients.jedis.Jedis;publicclassJedisDemo{publicstaticvoidmain(String[]args){// 1. 建立连接(默认端口 6379)Jedisjedis=newJedis("localhost",6379);// 2. 如果设置了密码,需要认证// jedis.auth("123456");// 3. 执行操作jedis.set("name","zhangsan");Stringname=jedis.get("name");System.out.println("name = "+name);// 4. 关闭连接jedis.close();}}2. Spring Data Redis使用方式
Spring Data Redis 是对 Jedis/Lettuce 的进一步封装,提供了RedisTemplate和StringRedisTemplate等模板类,让我们可以用更简洁的代码操作 Redis。
第一步:引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>第二步:配置连接信息
# application.ymlspring:redis:host:localhostport:6379password:123456# 如果设置了密码则填写,没有则删除此行database:0第三步:编写配置类(设置序列化器)
importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.data.redis.connection.RedisConnectionFactory;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;importorg.springframework.data.redis.serializer.StringRedisSerializer;@ConfigurationpublicclassRedisConfig{@BeanpublicRedisTemplate<String,Object>redisTemplate(RedisConnectionFactoryfactory){RedisTemplate<String,Object>template=newRedisTemplate<>();template.setConnectionFactory(factory);// key 使用字符串序列化器template.setKeySerializer(newStringRedisSerializer());// value 使用 JSON 序列化器template.setValueSerializer(newGenericJackson2JsonRedisSerializer());// hash 的 key 和 value 也使用同样的序列化器template.setHashKeySerializer(newStringRedisSerializer());template.setHashValueSerializer(newGenericJackson2JsonRedisSerializer());template.afterPropertiesSet();returntemplate;}}第四步:在业务代码中使用
importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.data.redis.core.RedisTemplate;importorg.springframework.stereotype.Service;@ServicepublicclassUserService{@AutowiredprivateRedisTemplate<String,Object>redisTemplate;// 缓存用户信息(使用 hash 类型)publicvoidcacheUser(StringuserId,Stringname){Stringkey="user:"+userId;redisTemplate.opsForHash().put(key,"name",name);redisTemplate.opsForHash().put(key,"age",25);}// 读取缓存publicObjectgetUserName(StringuserId){Stringkey="user:"+userId;returnredisTemplate.opsForHash().get(key,"name");}// 浏览量计数器(使用 string 类型)publicvoidincrementViewCount(StringarticleId){Stringkey="view:count:"+articleId;redisTemplate.opsForValue().increment(key);}}小结:通过 Spring Data Redis,我们可以用面向对象的方式操作 Redis,无需关心底层连接管理。实际项目中,Redis 常用于缓存热点数据、分布式锁、计数器、消息队列等场景,建议结合前面学过的数据类型,在项目中多加练习。