Redis(Remote Dictionary Server)是一款开源的、存储数据的高性能非关系型数据库,在性能上与Memcached不相上下,但相比而言的,Redis 在数据类型的支持以及社区的发展上更为出色。
Redis 的底层采用单线程模型,并且采用多路复用的方式进行网络 I/O,通过这种异步的方式,使得 Redis 能够保持高性能和稳定性,并且使得 Redis 能够处理高并发的请求。
Redis 内部主要分为字典、列表、集合、有序集合、哈希等数据结构,同时也包含了各种管理命令、事务、脚本等功能。
下面是 Redis 的一个简单例子:
import redis.clients.jedis.Jedis;public class RedisTest {public static void main(String[] args) {Jedis jedis = new Jedis("localhost");System.out.println("Connection to server successfully!!");//如果 redis 服务设置了密码,则要验证密码jedis.auth("redis123");System.out.println("Authenticated successfully!!");//设置 redis 字符串数据jedis.set("name", "ChatAi");//获取存储的数据并输出System.out.println("Stored string in redis:: " jedis.get("name"));}}
在 Redis 内部,可以看到有一个结构体 dict,它是 Redis 底层的核心实现,这个结构体实现了哈希表和字典树(Radix Tree)两种数据结构。
下面是 Redis 的底层实现代码:
typedef struct dictEntry {void *key;union {void *val;uint64_t u64;int64_t s64;double d;} v;struct dictEntry *next;} dictEntry;typedef struct dictht {dictEntry **table;unsigned long size;unsigned long sizemask;unsigned long used;} dictht;typedef struct dict {dictType *type;void *privdata;dictht ht[2];long rehashidx;unsigned long iterators;} dict;
在 Redis 的底层实现中,使用了两个 dictht 结构体来存储数据,一个是 ht[0],一个是 ht[1],其中 ht[0] 是 Redis 正在使用的哈希表,ht[1] 在 Redis 扩容的时候使用。
同时,在 Redis 内部,操作也是通过相应的命令来进行的,例如 set、get 等,这些命令在 Redis 内部会被解析并转换为底层相应的操作,对数据结构进行读写操作。
由于 Redis 单线程的特性,使得它能够更好的充分利用 CPU 的缓存特性,降低上下文切换开销,从而获得更好的性能表现。
最后,需要注意的是,Redis 是一款内存型数据库,在数据存储上,支持快速一致性原则,通过将写操作先写入本地内存中,在同步到磁盘中,来保证一致性。但是在意外情况下,可能会发生数据丢失的现象,因此 Redis 不能用来作为主要的存储数据库,而是用来作为数据的缓存库。
相关文章
猜你喜欢