Hi!欢迎光临陕西省的权威思科、华为、Oracle、红帽、深信服、微软认证培训中心!
| 029-88235527
您现在所在位置:首页 > 新闻资讯 > 最新资讯 >

西安it培训盘点Redis中String数据类型原理实现

发布日期:2020-10-09 09:18:19点击次数:

分享到:
  java培训专业机构教大家首先Redis是KV数据结构,跟JDK中的Map是一样的,Redis是通过hashtable实现的,我们把这个叫做外层的哈希,那么每一个KY就是一个entry,在Redis的源码中,是定义为一个dictEntry。
 
  通过源码 定义了dictEntry对象,对象中存储了一个key,跟一个value,并且还有一个指向了下一个键值对节点的对象。
  接着了解key-value的原理,key是一个字符串,在C语言中(Redis是用C语言开发的),是没有字符串这个数据类型的,只有字符类型,而key并没有直接使用了C语言中的字符数组char[]来实现,而是存储在了一个自定义的数据类型-SDS。
  value并没有存在SDS中,也不是作为字符串存储,而是存储中一个redisObject中,事实上,redis的五大数据类型的value都是存储在redisObject中。
  什么是SDS?Redis中字符串的实现,SDS有多种结构:sdshdr5、sdshdr8、sdshdr16、sdshdr32、sdshdr64,用于存储不同长度的字符串,分别代表的是2^5byte、2^8byte、2^16byte、2^32byte、2^64byte。
 
 西安it培训告诉大家为什么要使用SDS来实现字符串呢?
  首先C语言中并没有字符串类型,要实现的话只能使用char[]来实现,但是使用字符数组必须先给变量分配足够的空间,否则会溢出,分配多了又可能造成浪费
    如果要获取字符串的长度,就需要遍历字符数组,时间复杂度高O(n)
字符串的长度更改会对字符数组的内存进行重新分配
  C语言的 \0 是字符串的标志结束位,如果存储图片音频等多媒体文件的时候,存在二进制安全问题
SDS的特点
  无需担心内存溢出的问题,如果需要就对SDS进行扩容
  定义了len属性,获取字符串长度时间复杂度O(1)
  通过“空间预分配” 和“惰性空间释放”,防止多次重分配内存
  判断字符串是否结束是len属性