Redis - 基础入门
Redis基础
10种数据类型
Redis 支持以下 10 种数据类型:
- String(字符串):
- 最基本的数据类型,可以包含任何类型的数据,如文本、数字等。
- 适用于缓存、计数器、分布式锁等场景。
- List(列表):
- 一个列表,按照插入顺序存储一系列的元素。
- 元素可以重复,支持从列表两端添加或删除元素。
- 适用于队列、栈、消息发布与订阅等场景。
- Set(集合):
- 无序、唯一的元素集合。
- 可以执行集合操作,如并集、交集、差集等。
- 适用于去重、共同好友、兴趣爱好等场景。
- Sorted Set(有序集合):
- 与集合类似,但每个元素都关联着一个分数(score),用于排序。
- 元素按照分数的顺序排列,可以根据分数范围获取元素。
- 适用于排行榜、范围查询等场景。
- Hash(哈希):
- 用于存储字段和与之相关联的值之间的映射关系。
- 适合存储对象,每个哈希可以存储多个键值对。
- 适用于存储对象、用户信息等场景。
- Bitmap(位图):
- 一种特殊的字符串,每个位都可以设置或清除。
- 可以进行位运算,用于统计、记录某些事件的发生与否。
- 适用于在线状态、签到记录等场景。
- HyperLogLog(基数统计):
- 用于估计集合中不同元素的数量,即基数(cardinality)。
- 通过使用固定的空间来估计不同元素的数量。
- 适用于统计 UV(独立访客)数、页面浏览数等场景。
- GeoSpatial(地理位置):
- 用于存储地理位置信息,如经度和纬度。
- 可以计算两点之间的距离、获取周围的位置等。
- 适用于位置服务、附近商家搜索等场景。
- Stream(流):
- 类似于日志的数据结构,用于保存事件流。
- 可以按照时间顺序添加和读取事件。
- 适用于日志、消息队列等场景。
- Bitfield(位域):
- Bitfield 类型允许用户以原子方式执行一系列针对位操作的命令,包括设置、获取和修改位的值。这使得 Redis 在处理位操作时变得更加高效和灵活。
- 适用于处理比特级别的数据,如状态标志、权限控制等场景。
redis常见命令
官网英文: https://redis.io/commands/
中文: https://redis.com.cn/commands.html
http://doc.redisfans.com/index.html
HyperLogLog
(2024.04.01补充)
Redis 在 2.8.9 版本添加了 HyperLogLog 结构。
Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定的、并且是很小的。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12KB 内存,就可以计算接近 $2^{64}$ 个不同元素的基数,这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比。但是,因为 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集台那样,返回输入的各个元素。
HyperLogLog 的误差仅仅只是 0.81% 左右。
(参考 Redis 之父 antirez 的回答: http://antirez.com/news/75)
底层原理
HyperLogLog(HLL)是一种用于估计基数(集合中不重复元素的数量)的数据结构。在Redis中,HyperLogLog是一种基于概率的算法,用于估计一个集合的基数,即集合中不同元素的数量。它通过使用较小的内存来实现对大型数据集的基数计数,这在很多情况下都是非常有用的,比如统计网站的独立访客数量、统计搜索关键词的独立数量等。
HyperLogLog的底层原理基于概率论,其主要思想是通过使用哈希函数将输入的元素映射到一个固定长度的比特数组(位数组)上,并利用这些哈希值来估计集合的基数。
在Redis中,HyperLogLog的实现采用了优化的基数估计算法,称为HyperLogLog++。HyperLogLog++算法的核心思想是通过结合不同哈希函数的结果来减小误差,从而提高基数估计的精度。
具体来说,Redis中的HyperLogLog数据结构包含以下几个关键部分:
- 比特数组(Bit Array):用于存储哈希值的位数组,每个哈希值会被映射到数组中的某个位置,并设置为1。
- 哈希函数(Hash Function):用于将输入的元素映射到比特数组上,Redis使用了MurmurHash等哈希函数。
- 导出函数(Merge Function):用于将多个HyperLogLog数据结构合并为一个以进行统计计算。
HyperLogLog的基本原理是通过观察哈希值的前缀零的数量来估计基数。当哈希值的前缀零越多时,说明元素的重复度越高,因此集合的基数就越小。
需要注意的是,HyperLogLog是一种概率算法,它的估计结果并不是精确的,而是一个接近真实基数的近似值。误差的大小通常受到哈希函数的选择、比特数组的大小以及采样的元素数量等因素的影响。