2. redis的数据类型
2.1 String 字符串 【常用】
💡 String的使用场景:
- 计数器
- 统计多单位的数量 uid:936475:follow 0 → incr或decr
- 粉丝数
- 对象缓存存储
2.1.1 set、get、append、strlen、mset、mget、msetnx
**set # 创建key
get # 获取key
append # 追加key
strlen # 获取key的长度
mset # 同时创建多个key
mget # 同时获取多个key
msetnx # 当key不存在时创建key 【原子性操作,要么一起成功,要么一起失败】
#** set user:1 {name:lily, age:3} //设置一个user:1对象 值为json字符来保存一个对象
**=> mset user:1:name lily user:1:age 20 # key的巧妙设计:user:{id}:{field}**
-
示例
127.0.0.1:6379> set key1 v1 # 设置key1的值为v1 OK 127.0.0.1:6379> get key1 # 获得值 "v1" 127.0.0.1:6379> APPEND key1 "lily" # 追加字符串,如果当前key不存在相当于新建key (integer) 6 127.0.0.1:6379> keys * # 查看值 1) "key1" 127.0.0.1:6379> get key1 # 获得值 "v1lily" 127.0.0.1:6379> STRLEN key1 # 获取字符串长度 (integer) 6 127.0.0.1:6379> APPEND key1 ",susie" (integer) 12 127.0.0.1:6379> STRLEN key1 (integer) 12 127.0.0.1:6379> get key1 "v1lily,susie" ———————————————————————————————————————————————————————————————— 127.0.0.1:6379> mset user:1:name lily user:1:age 20 OK 127.0.0.1:6379> mget user:1:name user:1:age 1) "lily" 2) "20" ———————————————————————————————————————————————— 127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #批量创建k1 k2 k3 OK 127.0.0.1:6379> keys * 1) "k2" 2) "k1" 3) "k3" 127.0.0.1:6379> mget k1 k2 k3 #批量取出k1 k2 k3的值 1) "v1" 2) "v2" 3) "v3" 127.0.0.1:6379> msetnx k1 v1 k4 v4 #当key不存在时创建key,当其存在时无法创建 (integer) 0 127.0.0.1:6379> get k4 (nil)
2.1.2 getset、setex、ttl、setnx
**getset # 先get后set
setex (set with expire) #设置过期时间
setnx (set if not exist) #不存在时再设置,存在时无法设置【分布式锁中常使用】**
-
示例
127.0.0.1:6379> getset db redis #如果不存在值,则返回nil 【但已经set了值:redis】 (nil) 127.0.0.1:6379> get db "redis" 127.0.0.1:6379> getset db mongodb #如果存在值,获取原来的值,并设置新的值 【显示现在的值,但已修改了值】 "redis" 127.0.0.1:6379> get db "mongodb" ———————————————————————— 127.0.0.1:6379> setex mykey 30 "hello" # 设置mykey的值为30,并设置过期时间 OK 127.0.0.1:6379> ttl mykey //查看key的剩余时间 (integer) 24 127.0.0.1:6379> setnx mykey "redis" # 设置key【此时key不存在,创建mykey】=> 设置成功 (integer) 1 127.0.0.1:6379> setnx mykey "mongoDB"" # 设置key【此时key存在】 => 设置不成功 Invalid argument(s) 127.0.0.1:6379> get mykey "redis"
2.1.3 incr、decr、incrby、getrange
incr # 自增1
decr # 自减1
incrby # 设置步长
getrange # 截取字符串
-
示例
———————————————————————————————————————————————————————————————— 127.0.0.1:6379> set views 0 #🌰:微信文章浏览量 OK 127.0.0.1:6379> get views "0" 127.0.0.1:6379> incr views # 自增1,+1 =>1 (integer) 1 127.0.0.1:6379> incr views # 自增1,+1 =>2 (integer) 2 127.0.0.1:6379> get views # 查看views "2" 127.0.0.1:6379> decr views # 自减1, -1 =>1 (integer) 1 127.0.0.1:6379> get views "1" 127.0.0.1:6379> INCRBY views 10 # 设置步长,设置增量 ➕10 =>11 (integer) 11 127.0.0.1:6379> get views "11" 127.0.0.1:6379> DECRBY views 10 # 设置步长,设置减量-10 =>1 (integer) 1 127.0.0.1:6379> get views "1" ———————————————————————————————— 127.0.0.1:6379> set key1 "hello,susie" OK 127.0.0.1:6379> get key1 "hello,susie" 127.0.0.1:6379> GETRANGE key1 0 4 # 截取0-4索引的字符串 "hello" 127.0.0.1:6379> GETRANGE key1 0 -1 # -1表示截取全部字符串 "hello,susie" 127.0.0.1:6379> GETRANGE key1 1 3 # 截取1-3索引的字符串 "ell"
2.2 List
💡 Redis中可以将list用成栈、队列、阻塞队列
- 所有的list命令都是以l开头
- 可以实现消息排队【Lpush Rpop】、栈【Lpush Lpop】
2.2.1 lpush、rpush、lrange、lpop
**lpush # 添加list,插入到列表头部
rpush # 添加list,插入到列表尾部
lrange # 0 -1 :获取list的所有值 0 1: 获取list0-1的区间值
LPOP RPOP # 移除值**
-
示例
127.0.0.1:6379> LPUSH list one #将一个值或者多个值, 插入到列表的头部【左】 (integer) 1 127.0.0.1:6379> LPUSH list two (integer) 2 127.0.0.1:6379> LPUSH list three (integer) 3 127.0.0.1:6379> LRANGE list 0 -1 #获取list的所有值 1) "three" 2) "two" 3) "one" 127.0.0.1:6379> LRANGE list 0 1 #获取list区间值 1) "three" 2) "two" ——————————————————————————————————————— 127.0.0.1:6379> RPUSH list right #将一个值或者多个值, 插入到列表的尾部【右】 (integer) 4 127.0.0.1:6379> LRANGE list 0 -1 1) "three" 2) "two" 3) "one" 4) "right" # three two one right 127.0.0.1:6379> LRANGE list 0 1 1) "three" 2) "two" ———————————————————————————————— 127.0.0.1:6379> LPOP list #移除list的第一个元素 "three" 127.0.0.1:6379> LRANGE list 0 -1 1) "two" 2) "one" 3) "right" 127.0.0.1:6379> RPOP list #移除list的最后一个元素 "right" 127.0.0.1:6379> LRANGE list 0 -1 1) "two" 2) "one"
2.2.2 lindex、llen、lrem、ltrim
**Lindex # 通过下标获取值
Llen # 获取list的长度
Lrem # 移除指定的值【例如取关某个up主-uid】
ltrim # 截取指定长度 => list会被改变**
-
示例
****—————————————————————————————————————————————————————————————— 127.0.0.1:6379> LRANGE list 0 -1 1) "two" 2) "one" 127.0.0.1:6379> LINDEX list 1 #通过下标获得list中的某一个值 "one" 127.0.0.1:6379> LINDEX list 0 "two" —————————————————————————————————————————————— 127.0.0.1:6379> Lpush list one (integer) 1 127.0.0.1:6379> Lpush list two (integer) 2 127.0.0.1:6379> Lpush list three (integer) 3 127.0.0.1:6379> llen list #获取list的长度 (integer) 3 ———————————————————————————————————————————————————————————————— 127.0.0.1:6379> Lrange list 0 -1 1) "three" 2) "three" 3) "two" 4) "one" 127.0.0.1:6379> lrem list 1 one #移除一个one (integer) 1 127.0.0.1:6379> lrange list 0 -1 # =>one被移除 1) "three" 2) "three" 3) "two" 127.0.0.1:6379> lrem list 1 three #移除一个three (integer) 1 127.0.0.1:6379> lrange list 0 -1 # =>three被移除 1) "three" 2) "two" ———————————————————————————————————————————————— 127.0.0.1:6379> Rpush mylist "hello" (integer) 1 127.0.0.1:6379> Rpush mylist "lily" (integer) 2 127.0.0.1:6379> Rpush mylist "susie" (integer) 3 127.0.0.1:6379> Rpush mylist "lele" (integer) 4 # hello lily susie lele 127.0.0.1:6379> ltrim mylist 1 2 #通过下标截取指定的长度,**此时list已被改变**,只剩下截取元素 OK 127.0.0.1:6379> lrange mylist 0 -1 1) "lily" 2) "susie"
2.2.3 rpoplpush、exists、lset、linsert
**rpoplpush # 移除列表的最后一个元素,并将其添加到一个新的列表
exists # 判断列表是否存在
lset # 设置list的值
linsert # 插入值**
-
示例
127.0.0.1:6379> rpush mylist "hello" (integer) 1 127.0.0.1:6379> rpush mylist "hello1" (integer) 2 127.0.0.1:6379> rpush mylist "hello2" (integer) 3 127.0.0.1:6379> lrange mylist 0 -1 1) "hello" 2) "hello1" 3) "hello2" # hello hello1 hello2 127.0.0.1:6379> rpoplpush mylist mylist22 ##移除列表的最后一个元素“hello2”,并将其添加到一个新的列表mylist22中 "hello2" 127.0.0.1:6379> lrange mylist 0 -1 1) "hello" 2) "hello1" 127.0.0.1:6379> lrange mylist22 0 -1 1) "hello2" ———————————————————————————————————————————————————————————————— 127.0.0.1:6379> exists list #判断列表是否存在 (integer) 0 127.0.0.1:6379> lset list 0 hello #这里,因为不存在list,所有无法设置list中index为0的值 (error) ERR no such key 127.0.0.1:6379> lpush list lily #创建list (integer) 1 127.0.0.1:6379> lset list 0 hello #将list中index为0的值更新 OK 127.0.0.1:6379> lindex list 0 "hello" —————————————————————————————————————————————————————— 127.0.0.1:6379> lrange mylist 0 -1 1) "hello" 2) "world" 127.0.0.1:6379> linsert mylist before "world" "other" #在某个值前面插入值 (integer) 3 127.0.0.1:6379> lrange mylist 0 -1 1) "hello" 2) "other" 3) "world" 127.0.0.1:6379> linsert mylist after "world" "lily" #在某个值后面插入值 (integer) 4 127.0.0.1:6379> lrange mylist 0 -1 1) "hello" 2) "other" 3) "world" 4) "lily"
2.3 Set【集合】
💡 Set是无序不重复集合 Set中的值不能重复!!
2.3.1 set、scard、smembers、sismember、srem、srandmember、spop
**sadd #添加元素
smembers #查看set中的所有值
sismember #判断某个值是否在set中
scard #获取set中内容元素的个数
srem #移除set中的元素
srandmember #随机抽选出一个元素
spop #随机删除一些set集合中的元素**
-
示例
**sadd #添加元素 smembers #查看set中的所有值 sismember #判断某个值是否在set中 scard #获取set中内容元素的个数 srem #移除set中的元素 srandmember #随机抽选出一个元素 spop #随机删除一些set集合中的元素** **————————————————————————————————** 127.0.0.1:6379> sadd myset "hello" #向set集合中添加元素 (integer) 1 127.0.0.1:6379> sadd myset "lily" (integer) 1 127.0.0.1:6379> sadd myset "new" (integer) 1 127.0.0.1:6379> smembers myset #查看指定set的所有值 1) "lily" 2) "hello" 3) "new" 127.0.0.1:6379> sismember myset hello #判断某一个值是否在set集合中 (integer) 1 127.0.0.1:6379> sismember myset world (integer) 0 127.0.0.1:6379> scard myset #获取set中内容元素个数 (integer) 3 **________________________________** 127.0.0.1:6379> srem myset hello #移除myset中的hello (integer) 1 127.0.0.1:6379> scard myset (integer) 2 127.0.0.1:6379> smembers myset 1) "lily" 2) "new" **——————————————————————————————————** 127.0.0.1:6379> smembers myset 1) "lily" 2) "susie" 3) "new" 127.0.0.1:6379> srandmember myset #随机抽选出一个元素 "lily" 127.0.0.1:6379> srandmember myset "new" 127.0.0.1:6379> srandmember myset 2 #随机抽选出两个元素 1) "lily" 2) "susie" 127.0.0.1:6379> srandmember myset 2 1) "susie" 2) "new" ________________________________ 127.0.0.1:6379> smembers myset 1) "lily" 2) "susie" 3) "new" 127.0.0.1:6379> spop myset #随机删除一些set集合中的元素 "susie" 127.0.0.1:6379> smembers myset 1) "lily" 2) "new"
2.3.2 smove、sdiff差、sinter交、sunion并
**smove #将一个指定的值,移动到另外一个set集合中
sdiff #差集
sinter #交集 => 微博可用来实现共同关注、共同爱好、共同粉丝等
sunion #并集**
-
示例
127.0.0.1:6379> sadd set1 "hello" (integer) 1 127.0.0.1:6379> sadd set1 "world" (integer) 1 127.0.0.1:6379> sadd set1 "lily" (integer) 1 127.0.0.1:6379> smembers set1 1) "hello" 2) "lily" 3) "world" 127.0.0.1:6379> sadd set2 "new" (integer) 1 127.0.0.1:6379> smove set1 set2 "lily" #将set1中的lily移动到set2中 (integer) 1 127.0.0.1:6379> smembers set1 1) "hello" 2) "world" 127.0.0.1:6379> smembers set2 1) "lily" 2) "new" ————————————————————————————————————————————————————————- 127.0.0.1:6379> sadd key1 a (integer) 1 127.0.0.1:6379> sadd key1 b (integer) 1 127.0.0.1:6379> sadd key1 c (integer) 1 127.0.0.1:6379> smembers key1 1) "c" 2) "b" 3) "a" 127.0.0.1:6379> sadd key2 c (integer) 1 127.0.0.1:6379> sadd key2 d (integer) 1 127.0.0.1:6379> sadd key2 e (integer) 1 127.0.0.1:6379> smembers key2 1) "c" 2) "e" 3) "d" 127.0.0.1:6379> sdiff key1 key2 #差集 【两个集合中不同的值】 1) "a" 2) "b" 127.0.0.1:6379> sinter key1 key2 #交集 【两个集合中相同的值】 => 微博orB站的共同好友 1) "c" 127.0.0.1:6379> sunion key1 key2 #并集 【两个集合所有的值】 1) "a" 2) "b" 3) "c" 4) "e" 5) "d"
2.4 Hash
💡 Map集合,key-map: key-<key, value> 【本质和String类型没有太大区别,还是简单的key-value】
- Hash可以存储变更的数据,如user, name, age. 尤其是用户信息和经常变动的信息
- Hash更适合对象的存储,String更加适合字符串的存储
2.4.1 hset、hget、hmset、hgetall、hdel、hlen
**hset #创建hash
hget #获取hash
hmset #hash中一次创建多个字段
hgetall #获取全部数据
hdel #删除hash中的字段
hlen #获取hash中的字段数量
hexists #判断hash的字段是否存在
hkeys #获取hash所有的field
hvals #获取hash所有的value
incr #自增
decr #自减
hsetnx #若不存在则设置成功**
-
示例
127.0.0.1:6379> hset myhash field1 lily #set一个具体的 key-value (integer) 1 127.0.0.1:6379> hget myhash field1 #获取一个字段值 "lily" 127.0.0.1:6379> hmset myhash field1 hello field2 susie #set多个key-value OK 127.0.0.1:6379> hmget myhash field1 field2 #获取多个字段值 1) "hello" 2) "susie" 127.0.0.1:6379> hgetall myhash #获取全部数据 1) "field1" 2) "hello" 3) "field2" 4) "susie" 127.0.0.1:6379> hdel myhash field1 #删除一个字段,对应的值也会被删除 (integer) 1 127.0.0.1:6379> hgetall myhash 1) "field2" 2) "susie" ———————————————————————— 127.0.0.1:6379> hgetall myhash 1) "field2" 2) "susie" 3) "field1" 4) "lily" 127.0.0.1:6379> hlen myhash #获取hash表的字段数量 (integer) 2 ———————————————————————— 127.0.0.1:6379> hexists myhash field1 # 判断某个field是否存在 (integer) 1 ———————————————————————— 127.0.0.1:6379> hkeys myhash #获取所有的field 1) "field2" 2) "field1" 127.0.0.1:6379> hvals myhash #获取所有的value 1) "susie" 2) "lily" ———————————————————————— 127.0.0.1:6379> hset hash fields3 5 (integer) 1 127.0.0.1:6379> hincrby hash fields3 1 #➕1 (integer) 6 127.0.0.1:6379> hincrby hash fields3 -1 #➕-1 (integer) 5 127.0.0.1:6379> hsetnx hash field4 hello (integer) 1 127.0.0.1:6379> hsetnx hash field4 lily (integer) 0
2.5 Zset【有序集合】
💡 在set的基础上增加了一个值:set k1 v1 → zset k1 score v1
**zadd #添加值
zrange #显示所有值 从小到大排序【默认】
zrevrange #从大到小排序
zrangebyscore #排序
zdel #删除
zcard #获取集合中的个数
zcount #获取指定区间的成员数量**
-
示例
127.0.0.1:6379> zadd myset 1 one #添加一个值 (integer) 1 127.0.0.1:6379> zadd myset 2 two 3 three #添加多个值 (integer) 1 127.0.0.1:6379> zrange myset 0 -1 #获取所有值 1) "one" 2) "two" 3) "three" __________________________ 127.0.0.1:6379> zadd salary 2500 lily (integer) 1 127.0.0.1:6379> zadd salary 5000 susie (integer) 1 127.0.0.1:6379> zadd salary 500 lele (integer) 1 127.0.0.1:6379> zrangebyscore salary -inf +inf #显示全部用户 从小到大升序排列 1) "lele" 2) "lily" 3) "susie" 127.0.0.1:6379> zrange salary 0 -1 #从小到大进行排序 1) "lele" 2) "lily" 3) "susie" 127.0.0.1:6379> zrevrange salary 0 -1 #从大到小进行排序 1) "susie" 2) "lily" 3) "lele" 127.0.0.1:6379> zrangebyscore salary -inf +inf withscores #显示所有用户 带成绩升序排列 1) "lele" 2) "500" 3) "lily" 4) "2500" 5) "susie" 6) "5000" 127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores #显示工资小于2500的员工升序排列 1) "lele" 2) "500" 3) "lily" 4) "2500" ____________________________ 127.0.0.1:6379> zrem salary lily #删除用户lily (integer) 1 127.0.0.1:6379> zrange salary 0 -1 1) "lele" 2) "susie" 127.0.0.1:6379> zcard salary #获取有序集合中的个数 (integer) 2 ____________________________ 127.0.0.1:6379> zcount salary 0 3000 #获取0-3000之间的成员数量 (integer) 2
2.6 geospatial地理位置
💡 定位、附近的人、打车距离计算等 geospatial:可以推算出地理位置的信息,两地之间的距离,方圆几里的人
- GEO底层的实现原理是zset
2.6.1 geoadd、geopos、geohash、geodist、georadius、georadiusbymember
getadd #添加地理位置 【南极、北极无法添加】 #参数 key 值(经度,维度,名称) //有效的经度[-180,180] 有效的维度[-85,05..., 85.05...]
geopos #获取指定城市的经纬度
geodist #返回两个给定位置之间的距离【不存在返回空】
geohash #返回一个或多个位置元素的geohash表示 => 就是将二维的经纬度转换为一维的11个字符的geohash字符串 =〉 字符串越接近,位置越靠近 【了解即可】
georadius #以给定的经纬度为中心,找出某一半径内的元素 【应用:我附近的人?通过半径来查询】
georadiusbymember #找出位于指定元素周围的其他元素
-
示例
127.0.0.1:6379> geoadd china:city 116.40 39.90 beijing #添加地理位置 (integer) 1 127.0.0.1:6379> geoadd china:city 121.47 31.23 shanghai 106.50 29.53 chongqin (integer) 2 127.0.0.1:6379> geoadd china:city 114.05 22.54 shengzhen 120.16 30.24 hangzhou 108.96 34.26 xian (integer) 3 __________________________ 127.0.0.1:6379> geopos china:city beijing #获取beijing的经纬度 1) 1) "116.39999896287918091" 2) "39.90000009167092543" __________________________ 127.0.0.1:6379> geodist china:city beijing shanghai km #beijing到shanghai的直线距离 "1067.3788" __________________________ 127.0.0.1:6379> georadius china:city 110 30 1000 km #以经纬度(110 30)为中心找出半径1000km内所有的城市 1) "chongqin" 2) "xian" 3) "shengzhen" 4) "hangzhou" 127.0.0.1:6379> georadius china:city 110 30 500 km #以经纬度(110 30)为中心找出半径500km内所有的城市 1) "chongqin" 2) "xian" 127.0.0.1:6379> georadius china:city 110 30 500 km withdist #以经纬度(110 30)为中心找出半径500km内所有的城市,并显示到中心距离的位置 1) 1) "chongqin" 2) "341.9374" 2) 1) "xian" 2) "483.8340" 127.0.0.1:6379> georadius china:city 110 30 500 km withcoord #以经纬度(110 30)为中心找出半径500km内所有的城市,并显示到中心距离的位置 1) 1) "chongqin" 2) 1) "106.49999767541885376" 2) "29.52999957900659211" 2) 1) "xian" 2) 1) "108.96000176668167114" 2) "34.25999964418929977" 127.0.0.1:6379> georadius china:city 110 30 500 km withcoord #以经纬度(110 30)为中心找出半径500km内所有的城市,并显示经纬度 1) 1) "chongqin" 2) 1) "106.49999767541885376" 2) "29.52999957900659211" 2) 1) "xian" 2) 1) "108.96000176668167114" 2) "34.25999964418929977" 127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 1 #晒选出指定结果 1) 1) "chongqin" 2) "341.9374" 3) 1) "106.49999767541885376" 2) "29.52999957900659211" 127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 2 1) 1) "chongqin" 2) "341.9374" 3) 1) "106.49999767541885376" 2) "29.52999957900659211" 2) 1) "xian" 2) "483.8340" 3) 1) "108.96000176668167114" 2) "34.25999964418929977" 127.0.0.1:6379> georadius china:city 110 30 500 km withdist withcoord count 3 1) 1) "chongqin" 2) "341.9374" 3) 1) "106.49999767541885376" 2) "29.52999957900659211" 2) 1) "xian" 2) "483.8340" 3) 1) "108.96000176668167114" 2) "34.25999964418929977" ———————————————————————————————————————————— 127.0.0.1:6379> georadiusbymember china:city beijing 1000 km #找出距离beijing 1000km的其他城市 1) "beijing" 2) "xian" 127.0.0.1:6379> georadiusbymember china:city shanghai 500 km #找出距离shanghai 500km的其他城市 1) "hangzhou" 2) "shanghai" ———————————————————————————————————————————— 127.0.0.1:6379> geohash china:city beijing chongqin 1) "wx4fbxxfke0" 2) "wm5xzrybty0" _____________________________________________ 127.0.0.1:6379> zrange china:city 0 -1 #查看所有成员 1) "chongqin" 2) "xian" 3) "shengzhen" 4) "hangzhou" 5) "shanghai" 6) "beijing" 127.0.0.1:6379> zrem china:city beijing #移除指定元素 (integer) 1
2.7 hyperloglog基数统计 【大数据下有些许误差】
如果允许容错,那么一定可以使用hyperloglog
2.7.1 基数 【不重复的元素】
A {1, 3, 5, 7, 8, 7} A有6个数据 ⇒ 不重复的元素 1,3,5,7,8
B {1, 3, 5, 7, 8} B有5个数据 ⇒ 不重复的元素 1,3,5,7,8
⇒ 基数 = 5 【基数可以接受误差】
2.7.2 hyperloglogs 基数统计的算法
<aside> 💡 应用场景:
- 计算用户访问网站的次数 【一个人访问一个网站多次还是算作一个人】
- 传统的方式:set保存用户的🆔, 🆔相同直接覆盖 ⇒ 🉑️统计set中的元素数量作为标准判断,但这种方式如果保存大量的用户🆔,会比较麻烦 【目的是计数而不是保存🆔】
- hyperloglog的优点:占用的内存是固定的,2^64不同元素的技术只需要用12KB内存!
</aside>
pfadd # 创建key
pfcount # 统计key中元素的基数数量
pfmerge # 合并两组key
-
示例
127.0.0.1:6379> pfadd mykey a b c d e f g h i j #创建第一组元素mykey (integer) 1 127.0.0.1:6379> pfcount mykey #统计mykey中的元素的基数数量 (integer) 10 127.0.0.1:6379> pfadd mykey2 i j z x c v b n m #创建mykey2 (integer) 1 127.0.0.1:6379> pfcount mykey2 #统计 (integer) 9 127.0.0.1:6379> pfmerge mykey3 mykey mykey2 #合并两组 OK 127.0.0.1:6379> pfcount mykey3 #查看mykey3的数量 (integer) 15 127.0.0.1:6379> pfadd mykey4 a b c d e f g h i j j a b c #基数:没有重复的数 (integer) 1 127.0.0.1:6379> pfcount mykey4 (integer) 10
2.8 bitmaps位图
<aside> 💡 位储存:0 1 应用场景:统计用户信息【活跃 or 不活跃、登录 or 未登录、365打卡】 两个状态的都可以使用bitmaps Bitmaps位图,数据结构,都是操作二进制位来进行记录,就只有0和1两个状态
</aside>
setbit #创建值
getbit #取出值
bitcount #统计值
- 示例
-
🌰:使用Bitmaps记录周一到周四的打卡: 127.0.0.1:6379> setbit sign 0 1 #周一1 打卡 (integer) 0 127.0.0.1:6379> setbit sign 1 0 #周二0 未打卡 (integer) 0 127.0.0.1:6379> setbit sign 2 0 #周三0 未打卡 (integer) 0 127.0.0.1:6379> setbit sign 3 1 #周四1 打卡 (integer) 0 127.0.0.1:6379> getbit sign 3 #查看某天是否打卡 (integer) 1 127.0.0.1:6379> bitcount sign #统计打卡总天数 (integer) 2