目录
string-toc" style="margin-left:0px;">一、string
1.1 基本命令
1.2 使用场景
场景一:微博粉丝数
场景二:存json串
二、hash
2.1 基本命令
2.2 使用场景
三、list
3.1 基本命令
3.2 使用场景
场景一:微博粉丝关注列表
场景二:存放集群服务器日志
四、set
4.1 基本命令
4.2 使用场景
场景一:存储中奖用户id
场景二:用户角色权限
五、sorted_set
5.1 基本命令
5.2 使用场景
场景一:积分排行榜
场景二:任务推送
六、GEO
6.1 基本命令
6.2 使用场景
bitmap-toc" style="margin-left:0px;">七、bitmap
7.1 基本命令
7.2 使用场景
八、HyperLogLog
Redis 中支持了多种数据类型,其中比较常用的有五种:
- 字符串(String)
- 哈希(Hash)
- 列表(List)
- 集合(Set)
- 有序集合(Sorted Set)
另外,Redis 中还支持一些高级的数据类型,如:Streams、Bitmap、GEO 以及 HyperLogLog。
string">一、string
1.1 基本命令
(1)添加/修改数据
set key value
(2)获取数据
get key
(3)删除数据
del key
(4)添加/修改多个数据
mset key1 value1 key2 value2...
(5)获取多个数据
mget key1 key2...
(6)获取数据字符个数(字符串长度)
strlen key
(7)追加信息到原始信息后部(如果原始信息存在就追加,否则新建)
append key value
(8)自增
incr key
incrby key increment
incrbyfloat key increment
(9)自减
decr key
decrby key increment
(10)设置过期时间
setex key seconds value
1.2 使用场景
场景一:微博粉丝数
我们都知道大V的粉丝数都是实时更新的,一会涨一个,一会掉一个。那么如果将粉丝数存在mysql中,频繁的加减很耗费性能。如果将粉丝数放入redis中,极大的缓解这种情况。
场景二:存json串
有时我们可以将用户对象序列化为json字符串,然后存到Redis中。
二、hash
2.1 基本命令
(1)添加/修改数据
hset key field value
hmset key field1 value1 [field2 value2]...
(2)获取数据
hget key field
hmget key field1 [field2]...
hgetall key
(3)删除数据
hdel key field1 [field2]
(4)获取哈希表中字段的数量(获取某key下有多少个field)
hlen key
(5)获取哈希表中是否存在指定的字段
hexists key field
(6)获取哈希表中所有字段名或字段值
hkeys key
hvals key
(7)数值增减操作
hincrby key field increment
hincrbyfloat key field increment
注意:hash没有减的操作,但我们可以使用负数来进行减的操作。
2.2 使用场景
存用户对象数据,每个用户属性(名字、年龄、生日、性别)都是一个field。
String类型存储json字符串用来存对象:适合查询多,不适合修改数据。
hash类型存储对象:适合经常修改数据。
三、list
数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分。
需要的存储结构:一个存储空间保存多个数据,且通过数据可以提现进入顺序。
list类型:保存多个数据。底层使用双向链表存储结构实现。
3.1 基本命令
(1)添加/修改数据
lpush key value1 [value2]... //向左添加
rpush key value1 [value2]... //向右添加
(2)获取数据
lrange key start stop
lindex key index //根据索引查询值
llen key //返回list的长度
(3)获取并移除数据
lpop key
rpop key
(4)规定时间内获取并移除数据(阻塞)
blpop key1 [key2] timeout
brpop key1 [key2] timeout
用法:多个客户端时,客户端B使用blpop命令在时间内等待着获取,这时客户端A如果push进了数据,则客户端B直接获取。反之如果在timeout时间内,客户端A一值没有push进数据,那客户端B一只阻塞(等待)着。
3.2 使用场景
场景一:微博粉丝关注列表
在 Twitter、新浪微博、腾讯微博等社交平台中,个人用户的关注列表通常需要按照用户关注的顺序进行展示。这意味着用户最早关注的人会出现在列表的顶部。
场景二:存放集群服务器日志
比如,有4小服务器都有自己的日志,这些服务器是综合在一块工作的,结果现在出问题了,运维要看看服务器的操作日志,那总不能让运维看4份日志吧,挨个时间对比找出问题。那么解决办法就是这4台服务器的日志都往redis里存,使用list类型。这样最新产生的日志一定会在list的最开头(保证是有序的),这样运维就可以看一个redis就能轻松找出问题。
四、set
新的存储需求:存储大量数据,在查询方面提供更高的效率。
需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询。
set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的。
4.1 基本命令
(1)添加数据
sadd key member1 [member2]
(2)获取全部数据
smembers key
(3)删除数据
srem key member1 [member2]
(4)获取集合数据总量
scard key
(5)判断集合中是否包含指定数据
sismember key member
(6)求两个集合的交、并、差集
sinter key1 [key2]
sunion key1 [key2]
sdiff key1 [key2]
4.2 使用场景
场景一:存储中奖用户id
set结构可以用来存储在某活动中中奖的用户ID,因为有去重功能,可以保证同一个用户不会中奖两次。
场景二:用户角色权限
set结构可以用来操作用户、角色、权限的关系。
五、sorted_set
5.1 基本命令
(1)添加数据
zadd key score1 member1 [score2 member2]
(2)获取全部数据
zrange key start stop [withscores] //按分数从小到大排。withscores代表将权重分数也一起查出来
zrevrange key start stop [withscores] //按分数从大到小排
(3)删除数据
zrem key member [member...]
(4)按条件获取数据
zrangebyscore key min max [withscores] [limit]
zrevrangebyscore key max min [withscores]
(5)按条件删除数据
zremrangebyrank key start stop
zremrangebyscore key min max
(6)获取集合数据总量
zcard key
zcount key min max
5.2 使用场景
场景一:积分排行榜
按积分排序,用作学生成绩排行榜也可以。
场景二:任务推送
做平台开发时,有个功能是任务处理,首先给你推送的是权重比较高的任务等待你处理。处理完调用zrem命令将其移除。
六、GEO
GEO就是Geolocation的简写形式,代表地理坐标。Redis在3.2版本中加入了对GEO的支持,允许存储地理坐标信息,帮助我们根据经纬度来检索数据。
6.1 基本命令
GEOADD:添加一个地理空间信息,包含:经度(longitude)、纬度(latitude)、值(member)
GEODIST:计算指定的两个点之间的距离并返回
GEOHASH:将指定member的坐标转为hash字符串形式并返回
GEOPOS:返回指定member的坐标
GEORADIUS:指定圆心、半径,找到该圆内包含的所有member,并按照与圆心之间的距离排序后返回。6.以后已废弃
GEOSEARCH:在指定范围内搜索member,并按照与指定点之间的距离排序后返回。范围可以是圆形或矩形。6.2.新功能
GEOSEARCHSTORE:与GEOSEARCH功能一致,不过可以把结果存储到一个指定的key。 6.2.新功能
6.2 使用场景
比如订餐软件,当我们点击美食之后,会出现一系列的商家,商家中可以按照多种排序方式,我们此时关注的是距离,这个地方就需要使用到我们的GEO。
bitmap">七、bitmap
在Redis中,Bitmap(位图)是一种特殊的数据结构,它不是一个独立的数据类型,而是基于String类型实现的。Bitmap主要用于存储大量二进制位(0或1)的数据,这些位可以代表不同的状态或标志。
7.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出现的位置
7.2 使用场景
可以用来实现签到功能,我们可以把年和月作为bitMap的key,然后保存到一个bitMap中,每次签到就到对应的位上把数字从0变成1,只要对应是1,就表明说明这一天已经签到了,反之则没有签到。
八、HyperLogLog
Redis 在 2.8.9 版本添加了 HyperLogLog 结构(简介HLL),用于做基数统计,其使用算法HyperLogLog使得在数量级特别大的情况下占用空间很小。说白了就是在大数据量级的情况下能够在很小的空间中进行元素去重统计。Redis中的HLL是基于string结构实现的,单个HLL的内存永远小于16kb,内存占用低的令人发指!作为代价,其测量结果是概率性的,有小于0.81%的误差。