- redis默认有16个数据库,默认使用第0个数据库。
select
dbsize
keys *
flushdb
flushall
exists
move
expire
type
字符串型使用场景比较多,比如抖音粉丝数这种就可以实现,也还可以做计数器、统计多单位的数量、对象缓存存储。
set
setnx
mset
msetnx:要么一起成功,要么一起失败,体现原子性。
设置一个对象:set [对象] {条目1:内容1,条目2:内容2}
设置多个对象:set [对象1] {条目1:内容1,条目2:内容2} [对象2] {条目1:内容1,条目2:内容2}
append
get
getset
strlen
incr
decr
incrby
decrby
getrange
setrange
setex =set with expire,单位为秒。
setex key seconds value =set key value ex seconds。单位为秒。
应用场景:共同关注、共同好友。
sadd
smembers
sismember
scard
srandmember
sdiff
sinter
sunion
srem
spop
smove
在redis里,可以把List当成栈、队列来使用。
list是一个链表,可以从左往右插入,也可以从右往左插入,还可以左右两边同时插入。
如果key不存在,会创建新的链表。
若把里面的所有元素移除,空链表也代表不存在。
从两边插入或改动值,效率最高;从中间元素操作,效率低。
使用场景:消息队列。
lpush
rpush
linsert
lset
lrange
lindex
llen
exists
lpop,删除下标位为0的元素,也是最后进入的元素。
rpop,删除下标位最末端的元素,也是第一个插入列表的元素。
lrem
ltrim
rpoplpush
哈希是一个map集合,可以把它的key看成一个集合,而集合里是kv键值对的数据,类似 key- < key-value >,常用于对象存储。
hset
hmset
hsetnx
hincrby,哈希没有自减命令,用自增负数实现自减。
hget
hmget
hgetall
hkeys
hvals
hlen
hexists
hdel
应用场景:抖音排行榜
zadd
zrange,可以把显示的结果看成一个从上往下排序的列表,正向排序就是从上往下数。
zrevrange
zcard
zcount
zrangebyscore
geoadd
作用:将给定的空间元素(纬度、经度、地名)添加到指定的键里面。
语法: geoadd key longitude latitude member…
- geoadd 命令以标准的x,y格式接受参数,使用时必须先输入经度,然后再输入纬度。
- geoadd 能够记录的坐标是有限的,非常接近地球两极区域的经纬度无法被索引。
- 有效的经度介于 -180 ~ 180 度之间,有效的纬度介于 -85.05112878 ~ 85.05112878 度之间。当输入超出范围的经度或者纬度时,geoadd将返回一个错误。
- 这些数据会以有序集的形式被储存在键里面,从而使得 georadius 和georadiusbymember 这样的命令可以在之后通过位置查询取得这些元素。
应用场景:附近位置、微信摇一摇、滴滴打车等这类依赖于地理位置信息的功能。
zrange
用法:geo 的数据类型为 zset,可以用zrange取key内元素。
geopos
作用:从Key里取给定位置元素的经度、维度。
语法:geopos key member [member1 member2 ]
geodist
作用:取两个给定位置之间的距离。如果两个位置之中,有一个不存在,则命令返回空值。
语法:geodist key member1 member2 [unit]
指定单位的参数 unit 必须是以下单位的其中一个:
- m :表示单位为米
- km :表示单位为千米
- mi :表示单位为英里
- ft :表示单位为英尺
- 如果没有指定单位,geodist默认使用米作为单位。
- geodist在计算距离时,会假设地球为完美的球形,在极限情况下,这一假设最大会造成0.5%的误差。
georadius
作用:取以给定的经纬度为中心,给定半径内的元素。
语法:georadius key longitude latitude radius m|km|ft|mi [withcoord] [withdist] [withhash] [asc] [desc] [count count]
withdist (参数)
withcoord(参数)
count (参数)
desc(参数)
asc(参数)
georaidusbymember
作用:取出指定范围内的元素,中心点是由给定的位置元素决定。
语法:georadiusbymember key member radius m|km|ft|mi [withcoord] [withdist] [withhash] [asc] [desc] [count count]
geohash
作用:将二维经纬度转换为一维字符串,字符串越长表示位置更精确,两个字符串越相似表示距离越近。
语法:geohash key member [member1] [member2]
zrem
用法:GEO 没有提供删除成员的命令,但是因为 GEO 的底层实现是 zset,所以可以借用 zrem 命令实现对地理位置信息的删除。
作用:用于集合,指集合中不重复的元素个数,可以接受误差。
示例:
A{1,3,5,7,9,8,7} ,基数为6。
B{1,3,5,7},基数为4。
背景:redis在2.8.9版本添加了hyperloglog结构,用来做基数统计的算法。
优点:在输入元素的数量或体积非常大时,计算基数所需的空间总是固定的,并且是很小的。每个HyperLogLog键只占用12KB的内存,就可以计算接近2^64个不同元素的基数。
用途:HyperLogLog是一种算法,提供了不精确的去重计数方案。 HyperLogLog 只会根据输入元素来计算基数,而不会储存输入元素本身,所以 HyperLogLog 不能像集合那样,返回输入的各个元素。
应用场景:
- 统计网页的浏览用户数量,一天内同一个用户多次访问只算一次。传统方案是使用set来保存用户id,然后统计set中的元素数量。
- 传统方案只能承载少量用户,一旦用户数量大起来就需要消耗大量的空间。
- 传统方案更偏重于保存用户,而非统计用户数量,使用传统方案可以达到目的,但吃力不讨好,而使用HyperLogLog最多需要12K就可以统计大量的用户数。
- 尽管HyperLogLog大概有0.81%的错误率,但对于统计用户数量这种不需要很精确的数据是可以忽略不计的。
pfadd
语法:pfadd key element [element…]
pfcount
语法:pfcount key [key1 key2 …]
pfmerge
语法:pfmerge destkey sourcekey [sourcekey1 sourcekey2…]
背景:Redis 从 2.2 版本增加了 Bitmap(位图)。
应用场景:
- 可以统计用户一年的某些信息,如账户活跃或不活跃,登录或不登录,打卡或没打卡。如果使用普通的 key / value存储,则要记录 365 条记录,如果用户量很大,需要的空间也会很大。而Redis 提供了 Bitmap 位图这种数据结构,Bitmap 就是通过操作二进制位来进行记录,即为 0 和 1。
- 如果要记录 365 天的打卡情况,使用 Bitmap 表示的形式大概如下:0101000111000111……,这样 365 天相当于 365 bit,又 1 字节 = 8 bit , 所以相当于使用 46 个字节即可。
- BitMap 就是通过一个 bit 位来表示某个元素对应的值或者状态,其中的 key 就是对应元素本身。
setbit
语法:setbit key offset value 。设置key的第offset位为value(0或1)
getbit
语法:getbit key offset
bitcount
语法:bitcount key [start,end] 统计key上位的值为1的个数。