Redis-基础数据结构

string

redis所有数据的基础,采用预分配进行数据的分配当数据小于1MB时候,成倍扩容,大于1MB每次扩容1倍。最大512MB。

int类型支持计数

list

quicklist的数据结构(ziplist+双向链表)

hash

类似于Java的hashmap,采用数组+链表方式,数据量小采用ziplist。

rehash采用渐进式

set

底层采用一个特殊的字典来维护,字典的值都为NULL

zset

(skiplist or ziplist)+hash

bitmap

  • setbit key offset value【0 or 1】 set某一位的bit值

  • getbit key offset 返回当前位的值

  • bitcount key [start end] 返回start-end值为1的bit的数量。start-end必须是8的倍数

  • bitpos key [true false] 返回第一个true or false的值。

hyperHyperLog

  • pfadd key value 不同的才会加入到列表中
  • pfcount key 查看key的值

用于统计网站的uv,大小是12kb,缺点是有误差

bloomfilter

redis4.0以后提供插件支持

  • bf.add
  • bf.exists

重复并且存在误判。

Reids的限流–redis-cell

redis4.0后提供的限流模块

cl.throttle key capacity opsQuota opssec quota-pre-action

返回值
0 or 1 –结果0允许,1不允许
capacity–漏斗容量
left_quota–剩余容量
next_gen_quota_sec–下一次产生多少令牌的事件
maxQuotaSec–令牌桶满,下一次capacity=left_quota的时间 单位:秒

Redis的位置服务-GeoHash

 原理是,将地球变为一个平面,划分成一系列方格每个方格有一个唯一编号,方格越近编号越近,将坐标的经纬度映射为一维坐标,放在唯一的方格中,只需要查看俩个方格的距离即可。

坐标会变成一串整数编码越长越精确,这些整数编码能还原成坐标。getHash会对这个整数做一次base32。

redis的坐标编码是52位,且底层采用zset。value是key,score是哪个52位的编码,我们查询附近的坐标只需要按照score查询即可

命令

  • geoadd key 精度 纬度 value 添加
  • geodist key value1 value2 单位 查询value1和value2的距离
  • geoops key value 获取value的坐标
  • geohash key value 获取hash值可以计算出经纬度
  • georediusbymember key value 20 km [withcoord withdist withhash] count 3 asc 查找value半径20km的其他坐标【包括自己】 按照距离升序排列
  • georedius key value x y 20 km [withcoord withdist withhash] count 3 asc 查找坐标点【x、y】半径20km的其他坐标【包括自己】 按照距离升序排列