注意,本篇博客是Redis的最入门教程,不会过多深入介绍Redis的数据结构原理和应用场景。只是简单介绍Redis的基本操作,以及如何在Java中使用Redis。有关Redis的进阶知识后面会持续更新。
Redis的数据类型
Redis提供了丰富的数据类型,最常见的5种基本数据类型为:
- String:字符串;
- Hash:哈希;
- List:列表;
- Set:集合;
- Zset:有序集合;
随着Redis版本的更新,后面又支持了四种数据类型:
- BitMap:位图;
- HyperLogLog:用于"统计基数"的数据结构;
- GEO:存储地理位置信息;
- Stream:消息队列;
关于各种数据类型及其背后的实现源码不在本篇博客的讨论范围(后面会专门写博客讨论)。
作为入门教程,我们以String为例进行简单的介绍。在Redis中,String数据类型是动态的(这区别于Java,Java中String是不可变的)。Redis的String内部结构类似于Java的ArrayList,采用预分配冗余空间的方式来减少内存的频繁分配。如下图所示,分配的实际空间capacity一般高于实际字符串长度len。当字符串长度小于 1MB时,扩容是成倍增长;当长度超过1MB,每次扩容增加1MB,最大长度为512MB。
Redis实战
在后台启动Redis服务端,忘记怎么启动的见【Redis教程0x01】。进入redis-cli命令行客户端,这个客户端是有智能提示的,输入命令,会有相应的提示。以下是完整的键值对测试命令,大伙可以按照格式实战一下:
127.0.0.1:6379> set name iq50
OK
127.0.0.1:6379> get name
"iq50"
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> del name
(integer) 1
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379>
1)set 命令用来存储一个键值对,在本例中,name 为 key,iq50 为值。
2)get 命令用来获取一个键值对。
3)exists 命令用来测试一个键值对是否存在,(integer) 1 表示存在,(integer) 0 表示不存在。
4)del 命令用来删除一个键值对,(integer) 1 表示执行成功,(integer) 0 表示执行失败。
5)当键值对删除后,再通过 get 命令获取时,结果就为 (nil) 。
那么什么是nil呢?
它是 Objective-C、Swift、Ruby、Lua 等编程语言中的一个关键字。nil 是一种类型,它只有一个值 nil,它的主要功能是用于区别其他任何值,就像之前所说的,一个全局变量在第一次赋值前的默认值就是 nil,将 nil 赋予一个全局变量等同于删除它,Lua 将 nil 用于表示一种“无效值(non-value)”的情况,即没有任何有效值的情况。
Java中使用Redis
首先,需要在pom中导入依赖:
<!-- 用于连接Redis; Jedis = Java + Redis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.2.0</version>
</dependency>
<!-- 用于序列化和反序列化 -->
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
<scope>compile</scope>
</dependency>
编写测试类测试:
package org.example;
import com.google.gson.Gson;
import org.junit.Test;
import redis.clients.jedis.Jedis;
public class RedisTest {
// 常量USER_KEY用于存储用户信息的key
private static final String USER_KEY = "user";
@Test
public void demo001(){
// 借助Jedis,只需一行代码就能连接到Redis
// 参数为主机名、端口号
Jedis jedis = new Jedis("localhost",6379);
// 初始化一个用于序列化、反序列化的gson类(google json)
Gson gson = new Gson();
User user = new User("IQ50zzz",24);
// 存储键值对用set方法
jedis.set(USER_KEY,gson.toJson(user));
// 读取键值对用get方法
User userFromRedis = gson.fromJson(jedis.get(USER_KEY), User.class);
System.out.println("get:" + userFromRedis);
System.out.println("exists:" + jedis.exists(USER_KEY));
System.out.println("del:" + jedis.del(USER_KEY));
System.out.println("get:" + jedis.get(USER_KEY));
}
}
class User {
private String name;
private int age;
public User(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "UserInfo{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
// getter & setter
}
output:
get:UserInfo{name='IQ50zzz', age=24}
exists:true
del:1
get:null
代码中已经给了比较详细的注释了,就不多加赘述。
结语
本篇博客为大家简单介绍了Redis的数据类型,以及在Java中如何连接Redis。后面我们将继续深入研究Redis。