redis(一)基础介绍和简单原理

redis(一)基础介绍和简单原理

基础介绍

基础数据结构

string:使用SDS的结构,数据会进行冗余(长度double && <=1M)。对于每一个string有一个数据头,记录了长度(待补充)
list:使用的链表结构,元素弹出,内存回收。3.2之后采用quicklist=lickedLis->ziplist,多个ziplist之间使用双向指针。5.0之后整数集合采用listpack。
set:hash的变形,value是null。
zset:底层使用跳跃表,类似于B+树,底层为所有的节点,然后随机选举节点升级,连接起来,并每一个value都会带有一个score,代表这个value的权重,按照score排序。查找的时间复杂度为log(n)
hash:类比java中hashmap结构,hvalue只能存string。rehash的时候会保留两个结构,然后渐进的方式去进行数据迁移。查找的时候会遍历两遍。
stream:5.0新增的数据类型。每一个key对应的都是一个消息链表。一个stream上面可以挂载多个消费组,每一个消费组都有自己的游标last_delivered_id表示消费到哪一个。一个消费组里面有多个消费者,相互竞争消费数据。消费链表中每一个消息的key是id(时间戳-id)
HyperLogLog:稀疏矩阵->稠密矩阵(固定12k空间),用于大数量的统计,会有一定的误差。和set一样使用就可以
Geohash:用于存储地理位置,直接通过geodist可以计算两点之间的距离。
位图:就是将string看成是byte数组,直接可以在某个范围内统计0/1的数量。

一些基本函数

  • incr key int的数据自增加,超过Long的max报错
  • incrby key num value+num num可是是负数
  • hincrby key hkey 同上
  • scan 0 key* count 100(槽位数) 遍历所有的key,返回游标地址,0表示结束(采用高位进位加法遍历)
  • redis-cli -h 127.0.0.1 -p 7001 –-bigkeys [-i 0.1] 用于找到大key
  • redis-cli --bigkeys -i 0.01(扫描间隔) 大key扫描
  • redis-cli --host 192.168.x.x --port 6379 --latency 检验实例之间的延时

插件

  • 布隆过滤器:4.0之后插件形式,会出现误判,结构就是set。对key进行hash,然后hash之后的位置置为1。
bf.add key value
bf.madd key value [value...] 批量添加
bf.exists key value 判断是否存在
bf.mexists key value [value...] 批量判断是否存在
  • lua脚本:多用于实现原子性的连续操作
命令:eval +脚本
注意:执行lua脚本的时候,redis会保护主线程不会因为出现错误而奔溃,但是已经产生的影响无法回退
Script kill  内部主线程一段时间之后会调用钩子函数,来执行这个命令

底层结构

SDS结构

  1. typedef char *sds
  2. head包含字符长度(len),最大容量(alloc)等
  3. 有好多种sds,不同长度的string使用不同的类型
长度在0和2^5-1之间,选用SDS_TYPE_5类型的header。
长度在2^5和2^8-1之间,选用SDS_TYPE_8类型的header。
长度在2^8和2^16-1之间,选用SDS_TYPE_16类型的header。
长度在2^16和2^32-1之间,选用SDS_TYPE_32类型的header。
长度大于2^32的,选用SDS_TYPE_64类型的header。能表示的最大长度为2^64-1

quicklist=linkedlist+ziplist

quicklist结构.jpg
3.2版本之后修改为上图的结构,ziplist的大小是可变的
node节点的数据被压缩成为ziplist,挂载在node节点上

跳表

skiplist结构.png
跳表搜索的时间复杂度是 O(logn),插入/删除也是

stream

wrOaRS.png

HyperLogLog的原理

给定一系列的随机整数,我们记录下低位连续零位的最大长度 k,通过这个 k 值可以估算出随机数的数量。因为通过计算可找到低位连续零位的最大长度k和数字大小n的关系:n≈2^k,根据这个规律,通过复杂的算法可将其精度进一步变得准确。

posted @ 2020-09-15 10:51  ElliottX4  阅读(199)  评论(0)    收藏  举报