内容仅供个人学习所用,如有错误,多多包涵
一、基本介绍
Redis是一款C语言编写的经典的NoSql数据库,即非关系型数据库,支持单线程,Redis以Key-Value的存储方式,Value支持多种数据结构(String、List、Set、Hash、Zset),Redis为了保证效率,会将数据存储在内存中,与memcached不同的是,Redis会周期性地把更新的数据写入磁盘。
(我的理解:在Java后端开发中,对数据库进行CRUD时,redis可以存储一部分数据,而且这部分数据的查询时间很短,从而减少了一部分数据库IO,优化了程序的运行时间。)
二、数据类型
1、String字符串
Redis最基本的数据类型,底层原理是动态字符串,当需要存储的数据长度大于字符串分配的存储空间时,字符串就需要进行扩容,当字符串的大小小于1M时,扩容时加倍现有的存储空间,当字符串大小大于1M时,扩容时每次增加1M的存储空间,但最长不超过512M。
2、List列表
底层原理是双向链表,当List中元素个数较少时,会以ziplist的结构存储(储存空间连续),当元素个数增多时,会用多个ziplist进行存储,每个ziplist构成一个双向链表。
3、set集合
与List类似,不同的是Set会自动对数据进行去重,当需要存储一个列表数据,又不希望数据出现重复时,可以选择Set,Java中的HashSet底层是HashMap,Redis中的Set与其类似,底层原理是Value值为null的Hash表。
4、Hash哈希
底层原理是hash表,在存储对象时常用,存储模型如下图,当field-value个数较少且长度较短时,采用ziplist的存储结构,否则使用hashtable。
5、Zset有序集合
与set类似,同样会对数据进行自动去重,特殊的是,Zset会对每个成员设置一个score值,可以根据score值对数据进行排序,底层原理是hash+跳表,hash的作用是将元素和权重score关联起来,保证唯一对应,通过元素可以找到其对应的score,跳表的作用是将权重值score排序,根据score的范围获取元素列表。