redis是一个键值对的数据库服务器,本节将对redis的数据库实现进行简单介绍,并用java于语言进行简单翻译。说明服务器保存数据的方法,客户端切换数据库的方法,以及数据的添加、删除、更新、查询等操作。
1、服务器中的数据库结构
redis服务器将所有的数据库的数据状态保存在redisServer类中,其中dbnum属性表示数据库的数量(默认为16,改属性可配置redis.conf),每一个db数组属性对应着一个数据库,java代码如下:
class RedisServer {
//数据库的数量
int dbnum;
//所有的数据库
RedisDB[] db;
//....
}
其中redis服务器中的每一个数据库对应一个RedisDB对象,其中RedisDB类中的dict属性保存了数据库中的所有键值对,因此称为这个字典为键空间。
因为数据库中的键总是字符串类型,而值有多种数据类型string、hash、list、set、zset等,因此在java中可以使用string表示键,object表示所有的值,java代码如下:
class RedisDB {
//因为保存的是键值对,所有使用map进行存储
//数据库中的键空间,保存着数据库中所有的键值对
Map<String, Object> dict;
//.....
}
举一个例子,当我们在redis的数据执行以下操作的时候:
键空间将会是如下结构的展示的样子:
实际上对数据库的键的添加、删除、修改和查询操作,其实都是对键空间dict的具体操作。从java代码上看来,就是对Map数据的操作。
2. 对键的操作代码实现
添加操作:添加一个键到数据库,需要判断键是否存在,如果存在则覆盖原先的值,否则就添加一个新的键值对。
修改操作:其实也是添加操作的一种,只不过该键已存在,会覆盖掉原来的值。
查询操作:就是查询具体的键。
删除操作:删除对应的键值对。
以上操作对应的java伪代码如下:
public class RedisDB{
....
//简单的添加一个键
public String add(String key, Object value) {
//其他业务操作
dict.put(key, value);
if (value instanceof String) {
return "OK";
} else if (value instanceof List) {
List vals = (List) value;
return "(integer) " + vals.size();
}
//其他类型判断
return "OK";
}
//删除一个键
public String del(String key) {
//其他业务操作
dict.remove(key);
return "(integer) 1";
}
//更新操作
public String update(String key, Object value){
//其他业务操作
return add(key, value);
}
//查询操作
public Object get(String key){
//其他业务操作
return dict.get(key);
}
}
3. 键的添加操作
在java中,可以看做是向Map集合中添加一个key和value的操作,add方法。
举个例子,键空间的状态如上图所示,那么添加一个键的操作后:
redis> set date 2020-04-13
OK
添加之后的键空间状态如下所示:
4. 删除键
删除数据库的键的操作,实际上就是在键空间里面删除键对应的键值对对象。在java中,可以看做是对Map进行移除某个元素的操作,del方法。
举个例子,键空间的状态如上图所示,那么删除一个键的操作后:
redis> del article
(integer) 1
删除之后的键空间状态如下所示:
5. 键的更新
对一个数据库键进行更新,实际上就是对键空间里面的键所对应的值进行更新,根据值的对象类型不同,更新的具体方法也不同。在java中,也可以看做是想Map中添加一个重复的元素,Map会把之前的元素值给替换掉,update方法。
举个例子,键空间的状态如上图所示,那么删除一个键的操作后:
redis> set msg world
OK
msg的值对象之前包含的"hello"更新为了"world",更新之后的键空间状态如下所示:
6. 键的查询
对一个数据库键进行取值,实际上就是在键空间中取出键所对应的值对象,根据值对象的不同,具体的取值方法也不同。在java中,可以看做就是从Map集合中去,某一个元素的操作get方法。