(一)思维导图
先放一张我整理的Redis思维导图,大家一起学习
(二)Redis-数据类型
1.String
概念:
String是Redis最基础的数据结构类型,它是二进制安全的,可以存储图片或者序列化的对象,值最大存储为512M
命令:
- set xxx "123"
-
get xxx "123"
应用场景:
- 缓存对象
- 常规计数
- 分布式锁
- 共享 session 信息
2.Set
概念:
String 元素组成的无序集合,通过哈希表实现(增删改查时间复杂度为 O(1)),不允许重复。对于集合的使用,也有一些常见的方式,比如,QQ有一个社交功能叫做“好友标签”,大家可以给你的好友贴标签,比如“大美女”、“土豪”、“欧巴”等等,这时就可以使用redis的集合来实现,把每一个用户的标签都存储在一个集合之中
命令:
- sadd myset "one"(添加数据)
- smembers myset(打印集合)
- sismember myset "one"(集合中是否存在)
- sunion(并集)
应用场景:
- 点赞
- 共同关注
- 聚合计算(并集、交集、差集)场景
- 抽奖活动
- 标签
3.Zset
概念:
有序集合(sorted sets),因为在redis中,有序集合相关的操作指令都是以z开头的,比如zrange、zadd、zrevrange、zrangebyscore等等,所以我们都将redis中的有序集合叫做zsets
命令:
- zadd myzset 1 baidu.com(添加)
- zrange myzset 0 -1 with scores(列出myzset的所有元素,同时列出其序号)
应用场景:
- 排序场景
- 排行榜
- 电话和姓名排序
4.Hash
概念:
Hash类型,也叫散列,其value是一个无序字典,类似于Java中的HashMap结构,Hash结构可以将对象中的每个字段独立存储,可以针对单个字段做CRUD
命令:
- hmset Object name "xxx" age 12
- hmget Object name hmget Object age
应用场景:
- 缓存对象
- 购物车
5.Stream
概念:
Redis5.0 中增加,它借鉴了Kafka的设计,是一个新的强大的支持多播的可持久化的消息队列,相比于基于 List 类型实现的消息队列,有这两个特有的特性:自动生成全局唯一消息ID,支持以消费组形式消费数据
命令:
- XADD - 添加消息到末尾
- XTRIM - 对流进行修剪,限制长度
- XDEL - 删除消息
- XLEN - 获取流包含的元素数量,即消息长度
- XRANGE - 获取消息列表,会自动过滤已经删除的消息
- XREVRANGE - 反向获取消息列表,ID 从大到小
- XREAD - 以阻塞或非阻塞方式获取消息列表
应用场景:
消息队列,Redis对消息队列(MQ,Message Queue)的完善实现
6.List
概念:
Redis中的List类型与Java中的LinkedList类似,可以看做是一个双向链表结构。既可以支持正向检索和也可以支持反向检索,特征也与LinkedList类似。
命令:
- lpush testList "one"(向左插入)
- rpush testList "one"(向右插入)
- lrange(从左向右)
应用场景:
- 朋友圈点赞列表
- 评论列表
7.BitMap
概念:
BitMap是一种实现对位的操作的数据结构,但是其实它本身并不是数据结构,底层其实是字符串,是借助字符串进行位操作的,但是BigMap在Redis中使用却和字符串不太一样,可以理解为这是一个以位为单位的数组,数组的每个单元格存放的是1或者0,数组的下标在BitMaps中被称为偏移量。BigMap在Redis中最大上限是512M,转换为bit则是 2^32个bit位,原理是:redis内构建一个足够长的数组,每个数组元素只能是0和1两个值,然后这个数组的下标index用来表示用户id(必须是数字哈),那么很显然,这个几亿长的大数组就能通过下标和元素值(0和1)来构建一个记忆系统
命令:
- SETBIT:向指定位置(offset)存入一个0或1
- GETBIT :获取指定位置(offset)的bit值
- BITCOUNT :统计BitMap中值为1的bit位的数量
- BITFIELD :操作(查询、修改、自增)BitMap中bit数组中的指定位置(offset)的值
- BITFIELD_RO :获取BitMap中bit数组,并以十进制形式返回
- BITOP :将多个BitMap的结果做位运算(与 、或、异或)
- BITPOS :查找bit数组中指定范围内第一个0或1出现的位置
应用场景:
- 二值状态统计的场景,比如签到、判断用户登陆状态、连续签到用户总数
- 布隆过滤器解决缓存穿透。
8.Geospatial
概念:
Redis 在 3.2 版本中加入了地理空间(geospatial)以及索引半径查询的功能,主要用在需要地理位置的应用上。将指定的地理空间位置(经度、纬度、名称)添加到指定的 key 中,这些数据将会存储到 sorted set。这样的目的是为了方便使用 GEORADIUS 或者 GEORADIUSBYMEMBER 命令对数据进行半径查询等操作。也就是说,推算地理位置的信息,两地之间的距离,“附近的人”等等场景都可以用它实现。geo 底层原理是使用 zset来实现的
命令:
- GEOADD china:city 121.47 31.23 shanghai
- GEOADD china:city 116.40 39.90 beijing
- GEODIST china:city shanghai beijing km((只支持m,km,ft,mi))
- GEOHASH china:city shanghai beijing
应用场景:
- 存储地理位置信息的场景,比如滴滴叫车;
- 附近人
9.Hyperloglog
概念:
Redis中的HyperLogLog是一种基于基数估算的算法,所谓基数估算就是在一批数据中的元素个数有多少个不重复
命令:
- PFADD hll a b c d e f g h
- PFCOUNT hll
应用场景:
- 海量数据基数统计的场景,比如百万级网页 UV 计数等
- Redis中的HyperLogLog是一种基于基数估算的算法,所谓基数估算就是在一批数据中的元素个数有多少个不重复PFADD hll a b c d e f g hPFCOUNT hllRedis中的HLL是基于string结构实现的,单个HLL的内存,的令人发指!作为代价,其测量结果是概率性的,。不过对于UV统计来说,这完全可以忽略永远小于16kb内存占用低有小于0.81%的误差