目录
一、概述
二、内部编码:
三、String字符串
1.简介:
2.常用命令:
3.内部编码
4.应用
四、hash
1.简介:
2.常用命令:
3.内部编码:
4.应用
五、list列表
1.简介
2.特点:
3.命令
4.内部编码:
六、集合set1.简介:
2.命令:
3.内部编码:
4.应用
七、zset有序集合
2.命令:
3.内部编码:
4.应用:
八、bitmap
1.简介:
2.命令:
3.优势劣势
4.应用:
九、HyperLogLog
1.简介
2.命令
3.应用
十、GEO
1.简介
2.命令
一、概述
redis对外提供五种基本数据结构分别为string(字符串)、hash(哈希)、list(列表)、set(集合)、zset(有序集合),另外还有基于底层数据结构扩展的hyperloglogs(用来做基数统计的算法), bitmap(二进制数组),geospatial(GEO地理位置),piepeline(管道),stream(消息队列5.0支持),实际上每种基本数据结构都有两种以上的内部编码实现
二、内部编码:
三、String字符串
1.简介:
字符串类型是Redis最基础的数据结构,字符串类型的值实际可以 是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字 (整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能 超过512MB
2.常用命令:
get、set、setex、setnx、mset(批量设置)、mget(批量获取)、incr自增
3.内部编码
字符串类型的内部编码有 3 种:
·int : 8 个字节的长整型。
·embstr(短字符串) :小于等于 39 个字节的字符串。
·raw(长字符串) :大于 39 个字节的字符串。
Redis 会根据当前值的类型和长度决定使用哪种内部编码实现
4.应用
1.计数,如记录播放次数、点击量等热点且要实时更新的数据
2.缓存第三方接口的数据,如配置数据、政策、公告等,不会经常更新可以加适当过期时间的缓存减轻第三方接口的压力
3.分布式共享数据:如多台服务器要共享信息的情况、分布式锁等
4.限速、限流,如限制几分钟之内点击多次等
四、hash
1.简介:
几乎所有的编程语言都提供了哈希( hash )类型,它们的叫法可能是哈希、字典、关联数组。在Redis 中,哈希类型是指键值本身又是一个键值对结构,形如value={{field1 , value1} , ...{fieldN , valueN}}
2.常用命令:
hset、hget、hdel、hlen、hmset/hmget(批量设置、获取)、hexists(判断是否存在)、hkeys返回全部的field、hvals(获取全部value)、hgetall(获取所有的 field-value)
3.内部编码:
哈希类型的内部编码有两种
ziplist (压缩列表):当哈希类型元素个数小于 hash-max-ziplist-entries 配置(默认512 个)、同时所有值都小于 hash-max-ziplist-value 配置(默认 64 字节)时,Redis 会使用 ziplist 作为哈希的内部实现, ziplist 使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable 更加优秀。
·hashtable (哈希表):当哈希类型无法满足 ziplist 的条件时, Redis 会使 用hashtable 作为哈希的内部实现,因为此时 ziplist 的读写效率会下降,而 hashtable的读写时间复杂度为 O ( 1 )。
4.应用
当需要向redis中存储json,并需要对json中字段进行修改时就可以使用hash,比如储存用户信息,key一般使用memberid,值的话存用户的信息对象,而用户信息如手机号等会存在修改的情况,如果使用string存储就需要全部拿到代码中修改在存进去,而hash数据结构完美解决
五、list列表
1.简介
列表( list )类型是用来存储多个有序的字符串,如图 所示, a 、 b、 c 、 d 、 e 五个元素从左到右组成了一个有序的列表,列表中的每个字符串 称为元素(element ),一个列表最多可以存储 2 32 -1 个元素。在 Redis 中,可 以对列表两端插入(push )和弹出( pop ),还可以获取指定范围的元素列 表、获取指定索引下标的元素等(如图2-18 和图 2-19 所示)。列表是一种比 较灵活的数据结构,它可以充当栈和队列的角色,在实际开发上有很多应用 场景。
2.特点:
(1)列表中的元素是有序的,可以通过索引下标获取某个元素或者某个范围内的元素列表
列表中的元素可以是重复的
3.命令
4.内部编码:
ziplistziplist(压缩列表):当列表的元素个数小于list-max-ziplist-entries配置(默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节),Redis会选用ziplist来作为列表的内部实现来减少内存的使用
(2)linkedlist(链表):当列表类型无法满足ziplist的条件时,Redis会使用linkedlist作为列表的内部实现
Redis3.2 版本提供了 quicklist 内部编码,简单地说它是以一个 ziplist 为节 点的linkedlist ,它结合了 ziplist 和 linkedlist 两者的优势,为列表类型提供了一 种更为优秀的内部编码实现
5.应用:
Redis 的 lpush+brpop命令组合即可实现阻塞队列,生产者客户端使用lrpush从列表左侧插入元素,多个消费者客户端使用brpop命令阻塞式的“抢”列表尾部的元素
(2)栈:lpush+lpop=Stack
(3)队列:lpush+rpop=Queue
(4)集合:lpsh+ltrim=Capped Collection
(5)用于储存批量数据并需要经常新增和删除
六、集合set 1.简介:
集合( set)类型也是用来保存多个的字符串元素,但和列表类型不一 样的是,集合中不允许有重复元素,并且集合中的元素是无序的,不能通过 索引下标获取元素,但是Redis除了支持集合内的增删改查,同时还支持多个集合取交集、并
集、差集,合理地使用好集合类型,能在实际开发中解决很多实际问题
2.命令:
3.内部编码:
intset(整数集合):当集合中的元素都是整数且元素个数小于 set-max- intset-entries配置(默认 512 个)时, Redis 会选用 intset 来作为集合的内部实 现,从而减少内存的使用。
(2)hashtable (哈希表):当集合类型无法满足 intset 的条件时, Redis 会使用hashtable 作为集合的内部实现。
4.应用
(1)用户标签:可以用并集算出用户都感兴趣的标签
(2)需要储存去重数据的场景,比如统计访问的ip
(3)抽奖场景:比如,集合中有100个元素,值从数字1到数字100.我们定义抽到的是数字1的话,即表示中奖。使用sRandMember(返回指定元素的个数)的话,不管之前抽过多少次,下次抽中的概率都是1%。而使用sPop的话,则每次抽中的概率都不一样。第一个人抽中概率是1%,当第一个人没抽中的话,第二个人抽中概率就是1/99,以此类推
七、zset有序集合
1.简介:
既然叫有序 集合,那么它和集合必然有着联系,它保留了集合不能有重复成员的特性, 但不同的是,有序集合中的元素可以排序。但是它和列表使用索引下标作为 排序依据不同的是,它给每个元素设置一个分数(score )作为排序的依据,有序集合提供了获取指定 分数和元素范围查询、计算成员排名等功能,有序集合中的元素不能重复,但是score可以重复,就和一个班里的同学学号不能重复,但是考试成绩可以相同
2.命令:
3.内部编码:
(1)ziplist (压缩列表):当有序集合的元素个数小于 zset-max-ziplist- entries配置(默认 128 个),同时每个元素的值都小于 zset-max-ziplist-value 配 置(默认64 字节)时, Redis 会用 ziplist 来作为有序集合的内部实现, ziplist
可以有效减少内存的使用。
(2)skiplist (跳跃表):当 ziplist 条件不满足时,有序集合会使用 skiplist 作 为内部实现,因为此时ziplist 的读写效率会下降
4.应用:
1.签到提醒,每天定时给前一天签到过的用户且今日未签到过的用户推送签到提醒通知,此时就可以将时间设置为score,查找昨日签到过的用户与(今日签到的用户与昨日签到的用户的交集)的差集
2.增量存储并定期持久化,一些热点数据如加桌数据、收藏数据等,这些可以先存入zet中时间设置为score然后每日查询上一日的数据进行持久化
3.用于开发动态触发时间的job,将触发时间作为score,每隔一段时间轮询score看是否有触发的job
八、bitmap
1.简介:
BitMap不是一种数据接口,即位图, byte 数组,用二进制表示,只有 0 和 1 两个数字,其实就是String(底层实现中的String并非上面提到的基本数据类型String)
2.命令:
命令 | 含义 |
getbit key offset | 对key所存储的字符串值,获取指定偏移量上的位(bit) |
setbit key offset value | 对key所存储的字符串值,设置或清除指定偏移量上的位(bit) 1. 返回值为该位在setbit之前的值 2. value只能取0或1 3. offset从0开始,即使原位图只能10位,offset可以取1000 |
bitcount key [start end] | 获取位图指定范围中位值为1的个数 如果不指定start与end,则取所有 |
bitop op destKey key1 [key2...] | 做多个BitMap的and(交集)、or(并集)、not(非)、xor(异或)操作并将结果保存在destKey中 |
bitpos key tartgetBit [start end] | 计算位图指定范围第一个偏移量对应的的值等于targetBit的位置 1. 找不到返回-1 2. start与end没有设置,则取全部 3. targetBit只能取0或者1 |
3.优势劣势
优势
1.基于最小的单位bit进行存储,所以非常省空间。
2.设置时候时间复杂度O(1)、读取时候时间复杂度O(n),操作是非常快的。
3.二进制数据的存储,进行相关计算的时候非常快。
4.方便扩容
限制
redis中bit映射被限制在512MB之内,所以最大是2^32位。建议每个key的位数都控制下,因为读取时候时间复杂度O(n),越大的串读的时间花销越多
4.应用:
1.统计日活,将日期+前缀作为key。将memberid作为bitmap索引,每次访问值+1。使用bitcount统计指定key值为1个数
九、HyperLogLog
1.简介
HyperLogLog也不是一种数据结构,本质上也是String,它是一种基数算法,通过HyperLogLog可以利用极小的内存空间完成独立总数 的统计,数据集可以是IP、Email、ID等
什么是基数?
比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 4,7, 8}, 基数(不重复元素的数量)为5。 基数估计就是在误差可接受的范围内,快速计算基数。
在 Redis 里面,每个 HyperLogLog 键只需要花费 12 KB 内存,就可以计算接近 2^64 个不同元素的基 数。这和计算基数时,元素越多耗费内存就越多的集合形成鲜明对比
2.命令
pfadd hll ele:将ele添加进hll的基数计算中。
pfcount hll:计算hll的基数。就是使用上面给出的DV公式根据桶中的数值,计算基数
pfmerge hll3 hll1 hll2:将hll1和hll2合并成hll3
3.应用
流量统计:统计页面UV和PV,那么我们最常见的处理方式就是用户点击一次就插入一条数据到数据库,统计的时候通过查询表来达到统计流量的效果,但是效率会很低,占用资源也很多,但是用HyperLogLog统计就很优雅了
十、GEO
1.简介
Redis3.2 版本提供了 GEO(地理信息定位)功能,支持存储地理位置信 息用来实现诸如附近位置、摇一摇这类依赖于地理位置信息的功能
2.命令
- geoadd:添加地理位置的坐标。
- geopos:获取地理位置的坐标。
- geodist:计算两个位置之间的距离。
- georadius:根据用户给定的经纬度坐标来获取指定范围内的地理位置集合。
- georadiusbymember:根据储存在位置集合里面的某个地点获取指定范围内的地理位置集合。
- geohash:返回一个或多个位置对象的 geohash 值。