Redis是互联网公司使用最多的中间件之一了,那么我们有必要熟练掌握redis的基本数据结构及其使用的方式。
1. redis的基本数据结构
1.1 redis基本数据类型的使用场景
| 类型 | 使用场景 |
|---|---|
| String | 保存基本的字符串类型 |
| Hash | 保存对象(字典) |
| List | 有序的列表 |
| Set | 无序去重的集合 |
| ZSet | 带有分数的有序集合 |
1.2 redis string类型的常用操作命令及其含义
| 命令 | 含义 |
|---|---|
| set | 设置指定的值 |
| get | 获取指定的值 |
| getrange | 获取字符串的子串 |
| getset | 设置新的值并返回旧值 |
| getbit | 对key所存储的字符串值,获取指定偏移量上的位(bit) |
| setbit | 对key所存储的字符串值,设置或者清除指定偏移量上的位() |
| mget | 获取一个或多个值 |
| mset | 设置一个或多个值 |
| setex | 设置一个值,并指定过期时间,单位为seconds |
| setnx | 只有在key不存在的时候才能设置成功 |
| setrange | 覆盖字符串的子串 |
| strlen | 返回存储的字符串的长度 |
| msetnx | 同时设置一个或多个值,只有当key不存在时,才能设置成功 |
| psetex | 设置一个key的value值,并指定过期时间,单位为ms |
| incr | value增长1 |
| incrby | value增长一个指定增量 |
| incrbyfloat | value增长一个float增量 |
| decr | value减少1 |
| decrby | value减少一个指定减量 |
| decrbyfloat | value减少一个指定float减量 |
| append | 在value尾部追加一个子串 |
1.3 redis hash类型的常用操作及其含义
| 命令 | 含义 |
|---|---|
| hdel | 删除一个或多个hash表字段 |
| hexists | 查看hash表中字段是否存在 |
| hget | 获取存储在hash表中的指定字段 |
| hgetall | 获取hash表的全部字段及其值 |
| hincrby | 为指定hash表字段增加一个增量 |
| hincrbyfloat | 为指定hash表字段增加一个float增量 |
| hkeys | 获取hash表的所有字段 |
| hmset | 设置一个或者多个hash表字段 |
| hmget | 获取一个或者多个hash表字段 |
| hlen | 获取hash表中字段的数量 |
| hset | 设置hash表指定字段的值 |
| hsetnx | 设置hash表指定字段的值,只在key不存在时,才能设置成功 |
| hvals | 获取hash表所有的value值 |
| hmsetnx | 设置一个或者多个hash表的值,只有当key不存在时,才能设置成功 |
| hscan | 扫描hash表 |
1.4 redis list类型的常用操作及其含义
| 命令 | 含义 |
|---|---|
| lpush | 将一个值插入到列表头部 |
| lpushx | 将一个值插入到一存在列表的头部 |
| lrange | 获取指定范围内的元素 |
| llen | 获取列表的长度 |
| lpop | 移出列表的第一个元素 |
| linsert | 在列表的前/后插入元素 |
| lindex | 获取列表中指定index的元素 |
| lset | 设置指定位置的值 |
| lrem | 移除列表元素 |
| ltrim | 修建列表元素 |
| rpop | 移除列表的最后一个元素 |
| rpush | 在列表中添加一个或多个元素 |
| rpushx | 为已存在的列表添加值 |
| rpoplpush | 移除列表最后一个元素,并添加到列表的第一个元素 |
| blpop | 阻塞的列表头部移出 |
| brpop | 阻塞的列表尾部移出 |
1.5 redis set类型的常用操作及其含义
| 命令 | 含义 |
|---|---|
| sadd | 向集合中加入一个或多个成员 |
| scard | 获取集合的成员数 |
| sdiff | 获取第一个集合和其他集合的差异 |
| sdiffstore | 返回指定集合的差集并存储在destination中 |
| sinter | 返回两个集合的交集 |
| sinterstore | 返回两个集合到destination中 |
| sismember | 判断元素是否是成员 |
| smember | 返回集合中的所有成员 |
| smove | 将元素移到目标集合中 |
| spop | 移除并返回集合中的一个随机元素 |
| srandmember | 返回集合中一个或者多个 |
| srem | 移除集合中的一个或者多个元素 |
| sunion | 返回集合和其他集合的并集 |
| sunionstore | 把给定集合存储在目标集合中 |
| sscan | 迭代集合中的元素 |
1.6 redis sorted set类型的常用操作及其含义
| 命令 | 含义 |
|---|---|
| zadd | 向有序集合中添加一个或者多个成员及其分数 |
| zcard | 获取有序集合的成员数 |
| zcount | 计算有序集合指定区间分数的成员数 |
| zincrby | 有序集合的指定成员的分数增加指定增量 |
| zinterstore | 计算一个或者多个有序集的交集,并存储在新destination中 |
| zlexcount | 有序集合计算字典区间内的成员数 |
| zrange | 通过索引区间获取指定区间内的成员 |
| zrangebylex | 通过字典区间返回有序集合的成员 |
| zrangebyscore | 通过分数返回有序集合指定区间内的成员 |
| zrank | 返回指定成员的索引 |
| zrem | 移除有序集合中的一个或者多个成员 |
| zremrangebylex | 移除有序集合中指定字典区间的成员 |
| zremrangebyrank | 移除有序集合中指定分数区间的成员 |
| zscore | 返回有序集合的成员分数值 |
| zrevrank | 返回有序集合中的指定元素排名 |
| zunionstore | 计算一个或者多个集合的并集,并存储到指定key中 |
| zscan | 迭代有序集合中的元素 |
2. redis的特殊功能
2.1 hyperloglog
用来计算技术的算法,
hyperloglog的优点是,在输入元素的数量或者提及非常非常大时,计算基数所需要的空间总是固定的,并且很小。在
redis中,每个hyperloglog键只需要花费12K内存,就可以计算接近2^64个元素的技术。这个就与元素越多消耗内存越多的集合形成的鲜明对比。-
hyperloglog只会根据输入元素来计算基数,而不会存储元素本身,所有hyperloglog不像其他集合那样,可以返回输入的各个元素。什么是基数?
比如数据集{1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为{1, 3, 5 ,7, 8}, 基数(不重复元素)为5。
2.2 pub/sub
-
redis可以创建一个简单的生产消费者模型 -
subscirbe订阅某个channel的消息 -
publish用来向channel中推送消息
2.3 geo
- 用于存储地理位置信息,并对存储的信息进行操作
- 常用使用场景:附近
n km内的xxx
| 命令 | 意义 |
|---|---|
| geoadd | 添加地理位置 |
| geopos | 获取地理位置坐标 |
| geodist | 计算两个位置之间的距离 |
| georadius | 根据用户给定的经纬度坐标来获取范围内的地址位置集合 |
| georadiusbymember | 根据存储在位置集合里面的某个地点获取指定范围内的地理位置集合 |
| geohash | 返回一个或者多个位置对象的hash值 |
2.4 stream
-
stream主要应用于消息队列,pub/sub有个缺点是消息无法持久化,如果出现网络断开Redis宕机,消息就会被丢弃 - 而
Redis Stream提供了消息的持久化和主备复制功能,可以让任何客户端访问任何时刻的数据,并且能记住每一个客户端的访问位置,还能保证消息不丢失