01.redis是什么
Redis(Remote Dictionary Service) 是互联网技术领域中使用最广泛的存储中间件,Redis 以超高的性能、完美的文档、简洁的源码著称,国内外很多大型互联网公司都在用,比如说阿里、腾讯、GitHub、Stack Overflow 等等。它的版本更新非常的快,功能也越来越强大,最初只是用来作为缓存数据库,现在已经可以用它来实现消息队列了。
Redis 官方地址为:http://redis.io
Redis 的作者是一名意大利人,网名 Antirez,长相还是过得去的,感兴趣的可以 Google 一下。知道为什么 Redis 的默认端口是 6379 吗?
据他本人说是6379对应但是的一位歌手“MERZ”但当时还有“愚蠢”的意思。有点类似于现在的坤坤。
02.安装 Redis
Redis针对不同操作系统有不同安装方式,这篇入门就以windows为例(官网并不推荐使用windows安装,但本教程基于新手就没有使用linux)
下载地址
Releases · microsoftarchive/redis · GitHub(打不开可以找我要网盘)
有两种安装方式,第一种是 msi 的方式,双击运行后安装;第二种是免安装,绿色版,只需要把 zip 包解压就可以了。(个人使用的是第二种方法)
安装好后,打开命令行,进入(cd)到当前解压后的目录,输入启动命令:
redis-server redis.windows.conf
特别注意,因为win11cd进目录后并不会在目录下运行。解决办法如下:
./redis-server redis.windows.conf
如果还不行可能是安装包下载出问题了(本人就只遇到这个问题)
然后你就会看到 Redis 启动后的欢迎画面
还有一些其他的提示信息:
- Redis 当前的版本号为 3.0.504
- 端口是 6379
- 进程 ID,也就是 PID 为 18516
- Redis 官方地址为:http://redis.io
那如何停止服务呢?
- Ctrl+c
- 直接暴力按左上角叉叉
03.Redis的数据结构
Redis有五种基础数据结构String、Hash、List、Set、SortedSet,也是学 Redis 必须掌握的。除此之外,还有 HyperLogLog、Geo、Pub/Sub,算是高级数据结构了。
我们一个个来解读
-
字符串(Strings):这是最基本的Redis数据类型。二进制安全的字符串可以包含任何数据,例如jpg图片或者序列化的对象。其最大长度可以达到512 MB。
-
列表(Lists):这是由字符串构成的双向链表。可以在其头部或者尾部添加元素,因此,Redis列表可以用作堆栈(stack)或队列(queue)。列表的主要功能包括:push、pop、获取某一部分的元素等。
-
集合(Sets):这是包含字符串的无序集合。你可以通过使用命令,添加、删除和测试元素是否存在。因为它是无序的,所以不能通过索引获取某个元素。
-
有序集合(Sorted sets):和Sets类似,Sorted Sets也是字符串的集合,不同的是每个元素都会关联一个浮点数优先级或分数(score)。元素总是根据分数进行排序,所以我们可以非常快速地获取一个分数范围内的元素集合。
-
哈希(Hashes):这是字符串字段和字符串值之间的映射,所以它们是键值对的集合
String 结构使用非常广泛,比如说把用户的登陆信息转成 JSON 字符串后缓存起来,等需要取出的时候再反序列化一次。
小伙伴们应该都知道,Java 的 String 是不可变的,无法修改。Redis 的 String 是动态的,可以修改的,两者不同哦。关于 Redis 的 String 结构,我觉得老钱的 Redis 教程上讲得非常明白,大家一起拜读下。
Redis 的 String 在内部结构实现上类似于 Java 的 ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。如上图所示,当前字符串实际分配的空间为 capacity,一般高于实际的字符串长度 len。当字符串长度小于 1M 时,扩容是对现有空间的成倍增长;如果长度超过 1M 时,扩容一次只会多增加 1M 的空间。最大长度为 512M。
04.实操Redis
Redis 的解压目录下有一个名叫 redis-cli.exe 的文件,这是 Redis 自带的一个客户端工具,可以用来连接之前我们启动好的 Redis 服务。双击启动它。
以下是完整的键值对测试命令,小伙伴们可以按照格式动手实操一把。
1)set 命令用来存储一个键值对,在本例中,name 为 key,cmower 为 值。
2)get 命令用来获取一个键值对。
3)exists 命令用来测试一个键值对是否存在,(integer) 1
表示存在,(integer) 0
表示不存在。
4)del 命令用来删除一个键值对,(integer) 1
表示执行成功,(integer) 0
表示执行失败。
5)当键值对删除后,再通过 get 命令获取时,结果就为 (nil)
。
问题来了nil是什么意思它是 Objective-C、Swift、Ruby、Lua 等编程语言中的一个关键字,更详细的解释可以看一下《Programming in Lua 程序设计第二版》:
nil 是一种类型,它只有一个值 nil,它的主要功能是用于区别其他任何值,就像之前所说的,一个全局变量在第一次赋值前的默认值就是 nil,将 nil 赋予一个全局变量等同于删除它,Lua 将 nil 用于表示一种“无效值(non-value)”的情况,即没有任何有效值的情况。
想了解 Redis 命令的具体使用方法,可以参考以下链接:
是 Redis Command Reference 和 Redis Documentation 的中文翻译版
05.在Java中使用Redis
第一步,在项目中添加 Jedis(Java 和 Redis 的混拼) 依赖
(Maven):
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
如果版本不同在version后修改你的版本
(gradle):
dependencies {
implementation 'redis.clients:jedis:3.2.0'
}
版本不同同理
第二步,新建 UserInfo(用户信息)类:
package org.example;
public class UserInfo {
private String name;
private int age;
public UserInfo(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "UserInfo{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
第三步,在项目中添加 Gson(用于序列化和反序列化用户信息) 依赖:
(Maven):
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
<scope>compile</scope>
</dependency>
(Gradle):
dependencies {
implementation 'com.google.code.gson:gson:2.8.6'
}
第四步,新建测试类 RedisTest:
import com.google.gson.Gson;
import org.example.UserInfo;
import redis.clients.jedis.Jedis;
public class RedisTest {
private static final String REDIS_KEY = "user";
public static void main(String[] args) {
Jedis jedis = new Jedis("localhost", 6379);
Gson gson = new Gson();
UserInfo userInfo = new UserInfo("最喜欢摆烂", 19);
jedis.set(REDIS_KEY, gson.toJson(userInfo));
UserInfo getUserInfoFromRedis = gson.fromJson(jedis.get(REDIS_KEY),UserInfo.class);
System.out.println("get:" + getUserInfoFromRedis);
System.out.println("exists:" + jedis.exists(REDIS_KEY));
System.out.println("del:" + jedis.del(REDIS_KEY));
System.out.println("get:" + jedis.get(REDIS_KEY));
}
}
下面解释一下这段代码:
1)REDIS_KEY 常量为存储用户信息到 Redis 的 key。
2)在 Jedis 的帮助下,Java 连接 Redis 服务变得非常简单,只需要一行代码:
Jedis jedis = new Jedis("localhost", 6379);
参数分别是主机名,端口号。
存储键值对用 set()
方法,获取键值对用 get()
方法,判断键值对是否存在用 exists()
方法,删除键值对用 del()
方法。
3)Gson 是谷歌提供的一个开源库,可以将 Java 对象序列化为 JSON 字符串,同样可以将 JSON 字符串反序列化(解析)为匹配的 Java 对象。
使用起来也非常简单,toJson()
方法将对象转成 JSON 字符串,fromJson()
方法将 JSON 字符串反序列化对象。
下面是程序输出结果:
get:UserInfo{name='最喜欢摆烂', age=19}
exists:true
del:1
get:null
06、鸣谢
以上就是Redis安装加初步入门的全部内容了(最主要是我也只学到这里哈哈哈哈),redis能做的远远不止这些,如果你在学习的过程中遇到了问题,欢迎随时和我交流,虽然我也是个菜鸟,但我有热情啊。