Redis常用命令笔记(更新中)

redis中文网

官方命令手册

redis加入到Windows 服务中

首先将cmd指定到解压后的目录文件夹下
安装命令:
redis-server.exe --service-install redis.windows.conf --loglevel verbose
即可安装到Windows服务,

在这里插入图片描述

  1. 修改Redis密码的命令 (密码123456)
 config set requirepass 123456
  1. 查询Redis密码的命令
config get requirepass
  1. 权限认证(检验密码)
auth 123456

一、key相关命令(命令不区分大小写,一般写大写)

127.0.0.1:6379> keys *	# 查看所有的key (empty list or set)
127.0.0.1:6379> set name kuangshen	# set key OK
127.0.0.1:6379> keys *
1) "name" 127.0.0.1:6379> set age 1 OK
127.0.0.1:6379> keys *
1)"age"
2)"name"
127.0.0.1:6379> EXISTS name	# 判断当前的key是否存在
(integer) 1
127.0.0.1:6379> EXISTS name1
(integer) 0
127.0.0.1:6379> move name 1	# 移除当前的key
(integer) 1
127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> set name qinjiang OK
127.0.0.1:6379> keys *
1)"age"
2)"name" 127.0.0.1:6379> clear 127.0.0.1:6379> keys *
1)"age"
2)"name" 127.0.0.1:6379> get name "qinjiang"
127.0.0.1:6379> EXPIRE name 10	# 设置key的过期时间,单位是秒
(integer) 1
127.0.0.1:6379> ttl name	# 查看当前key的剩余时间
(integer) 4
127.0.0.1:6379> ttl name
(integer) 3
127.0.0.1:6379> ttl name
(integer) 2
127.0.0.1:6379> ttl name
(integer) 1
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> get name 
(nil)
127.0.0.1:6379> type name	# 查看当前key的一个类型! (name是要查看的key)
string
127.0.0.1:6379> type age string

如果要了解redis的命令,可以看redis中文官网http://www.redis.cn/commands.html#generic,如下图这样就可以查找你需要的命令,里面的命令有详细解释和例子
超链接
在这里插入图片描述

二、String字符串相关命令

也向上面一样在中文官网http://www.redis.cn/commands.html#string找,超链接
在过滤命令组选择Strings就行了,里面的命令有详细解释和例子
在这里插入图片描述

  1. 设置值(key1是key,v1是value)
set key1 v1
  1. 获得值
get key1
  1. 获得所有的key
keys *
  1. 追加字符串,如果当前key不存在,就相当于setkey
APPEND key1 "hello"
  1. 获取字符串的长度 (key1是key)
STRLEN key1
  1. 自增1 (views是key)
incr views
  1. 自减1
decr views
  1. 可以设置步长,指定增量
INCRBY views 10
  1. 将key对应的数字减
DECRBY views 5 
  1. 截取字符串 [0,3]
GETRANGE key1 0 3
  1. 获取全部的字符串 和 get key是一样的 (key1是key)
GETRANGE key1 0 -1
  1. 替换 (将key2的值替换成abcdefg,相当于重新赋值)
set key2 abcdefg
  1. 替换指定位置开始的字符串 (这边是从1开始)
SETRANGE key2 1 liu

setex (set with expire) 设置过期时间
setnx (set if not exist) #不存在在设置 (在分布式锁中会常常使用!)

  1. 设置key3 的值为 hello,30秒后过期
setex key3 30 "hello"
  1. 如果mykey 不存在,创建mykey
setnx mykey "abcd"
  1. 如果mykey存在,创建失败!
setnx mykey "abcdefg"
  1. 同时设置多个值
mset k1 v1 k2 v2 k3 v3
  1. 同时获取多个值
mget k1 k2 k3
  1. msetnx 是一个原子性的操作,要么一起成功,要么一起 失败!
msetnx k1 v1 k4 v4

三、List(列表)相关命令

在redis里面,我们可以把list玩成 ,栈、队列、阻塞队列! 所有的list命令都是用l开头的,Redis不区分大小命令

##########################################################################
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> LPUSH list1 one two  #这边是将多个值插入
(integer) 2
127.0.0.1:6379> LRANGE list1 0 -1
1) "two"
2) "one"
127.0.0.1:6379> LRANGE list 0 1	# 通过区间获取具体的值!
1)"three"
2)"two"
127.0.0.1:6379> Rpush list righr	# 将一个值或者多个值,插入到列表位部 (右)
(integer) 4
127.0.0.1:6379> LRANGE list 0 -1  # 获取list中值!
1)"three"
2)"two"
3)"one"
4)"righr"


########################################################################## 
LPOP
RPOP
127.0.0.1:6379> LRANGE list 0 -1  # 获取list中值!
1)"three"
2)"two"
3)"one"
4)"righr"
127.0.0.1:6379> Lpop list	# 移除list的第一个元素
"three"
127.0.0.1:6379> Rpop list	# 移除list的最后一个元素
"righr"
127.0.0.1:6379> LRANGE list 0 -1
1)"two"
2)"one" 
########################################################################## 
Lindex
Llen
127.0.0.1:6379> LRANGE list 0 -1  # 获取list中值!
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> Llen list	# 返回列表的长度
(integer) 2
##########################################################################
移除指定的值! 取关	uid
Lrem
127.0.0.1:6379> LRANGE list 0 -1  # 获取list中值!
1)"three"
2)"three"
3)"two"
4)"one"
127.0.0.1:6379> lrem list 1 one	# 移除list集合中指定个数的value,精确匹配
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1  # 获取list中值!
1)"three"
2)"three"
3)"two"
127.0.0.1:6379> lrem list 1 three  # 移除list集合中指定个数的value,精确匹配
(integer) 1
127.0.0.1:6379> LRANGE list 0 -1  # 获取list中值!
1)"three"
2)"two"
127.0.0.1:6379> Lpush list three #添加值
(integer) 3
127.0.0.1:6379> lrem list 2 three  # 移除list集合中指定个数的value,精确匹配
(integer) 2
127.0.0.1:6379> LRANGE list 0 -1  # 获取list中值!
1) "two"
##########################################################################
trim 修剪。; list 截断!

127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> Rpush mylist "hello" #向存于 key 的列表的尾部插入所有指定的值。如果 key 不存在,那么会创建一个空的列表然后再进行 push 操作
(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> Rpush mylist "hello3" 
(integer) 4
127.0.0.1:6379> ltrim mylist 1 2	# 通过下标截取指定的长度,这个list已经被改变了,截断了只剩下截取的元素!
OK
127.0.0.1:6379> LRANGE mylist 0 -1
1)"hello1"
2)"hello2"


##########################################################################
rpoplpush # 移除列表的最后一个元素,将他移动到新的列表中!

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> rpoplpush mylist myotherlist	# 移除列表的最后一个元素,将他移动到新的列表中!
"hello2"
127.0.0.1:6379> lrange mylist 0 -1 # 查看原来的列表
1)"hello"
2)"hello1"
127.0.0.1:6379> lrange myotherlist 0 -1	# 查看目标列表中,确实存在改值!
1) "hello2"


##########################################################################
lset	将列表中指定下标的值替换为另外一个值,更新操作
127.0.0.1:6379> EXISTS list	# 判断这个列表是否存在
(integer) 0
127.0.0.1:6379> lset list 0 item	# 如果不存在列表我们去更新就会报错
(error) ERR no such key 
127.0.0.1:6379> lpush list value1 
(integer) 1
127.0.0.1:6379> LRANGE list 0 0
1) "value1"
127.0.0.1:6379> lset list 0 item	# 如果存在,更新当前下标的值
OK
127.0.0.1:6379> LRANGE list 0 0
1) "item"
127.0.0.1:6379> lset list 1 other	# 如果不存在,则会报错!
(error) ERR index out of range 
##########################################################################
linsert # 将某个具体的value插入到列把你中某个元素的前面或者后面!

127.0.0.1:6379> Rpush mylist "hello" 
(integer) 1
127.0.0.1:6379> Rpush mylist "world" 
(integer) 2
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 new 
(integer) 4
127.0.0.1:6379> LRANGE mylist 0 -1
1)"hello"
2)"other"
3)"world"
4)"new"

小结
他实际上是一个链表,before Node after , left,right 都可以插入值
如果key 不存在,创建新的链表
如果key存在,新增内容
如果移除了所有值,空链表,也代表不存在!
在两边插入或者改动值,效率最高! 中间元素,相对来说效率会低一点~
消息排队!消息队列 (Lpush Rpop), 栈( Lpush Lpop)!

四、Set(集合)

set中的值是不能重读的!

##########################################################################
127.0.0.1:6379> sadd myset "hello"	# set集合中添加值
(integer) 1
127.0.0.1:6379> sadd myset "kuangshen"
 (integer) 1
127.0.0.1:6379> sadd myset "lovekuangshen"
 (integer) 1
127.0.0.1:6379> SMEMBERS myset	# 查看指定set的所有值
1)"hello"
2)"lovekuangshen"
3)"kuangshen"
127.0.0.1:6379> SISMEMBER myset hello	# 判断某一个值是不是在set集合中!
(integer) 1
127.0.0.1:6379> SISMEMBER myset world   # 判断某一个值是不是在set集合中!
(integer) 0

##########################################################################
127.0.0.1:6379> scard myset	# 获取set集合中的内容元素个数!
(integer) 4

##########################################################################
rem
127.0.0.1:6379> srem myset hello	# 移除set集合中的指定元素
(integer) 1
127.0.0.1:6379> scard myset   # 获取set集合中的内容元素个数!
(integer) 3
127.0.0.1:6379> SMEMBERS myset   # 查看指定set的所有值
1)"lovekuangshen2"
2)"lovekuangshen"
3)"kuangshen"

##########################################################################
set 无序不重复集合。抽随机!

127.0.0.1:6379> SMEMBERS myset  # 查看指定set的所有值
1)"lovekuangshen2"
2)"lovekuangshen"
3)"kuangshen"
127.0.0.1:6379> SRANDMEMBER myset	# 随机抽选出一个元素
"kuangshen"
127.0.0.1:6379> SRANDMEMBER myset
"kuangshen"
127.0.0.1:6379> SRANDMEMBER myset
"kuangshen"
127.0.0.1:6379> SRANDMEMBER myset
"kuangshen"
127.0.0.1:6379> SRANDMEMBER myset 2	# 随机抽选出指定个数的元素

1)"lovekuangshen"
2)"lovekuangshen2"
127.0.0.1:6379> SRANDMEMBER myset 2
1)"lovekuangshen"
2)"lovekuangshen2"
127.0.0.1:6379> SRANDMEMBER myset	# 随机抽选出一个元素
"lovekuangshen2"


##########################################################################
删除定的key,随机删除key127.0.0.1:6379> SMEMBERS myset   # 查看指定set的所有值
1)"lovekuangshen2"
2)"lovekuangshen"
3)"kuangshen"
127.0.0.1:6379> spop myset	# 随机删除一些set集合中的元素!
"lovekuangshen2"
127.0.0.1:6379> spop myset "lovekuangshen"  # 删除指定set集合中的元素!
127.0.0.1:6379> SMEMBERS myset  # 查看指定set的所有值
1) "kuangshen"

##########################################################################
将一个指定的值,移动到另外一个set集合! 
127.0.0.1:6379> sadd myset "hello" #添加值
(integer) 1
127.0.0.1:6379> sadd myset "world" 
(integer) 1
127.0.0.1:6379> sadd myset "kuangshen" 
(integer) 1
127.0.0.1:6379> sadd myset2 "set2" 
(integer) 1
127.0.0.1:6379> smove myset myset2 "kuangshen" # 将一个指定的值,移动到另外一个set集合!
(integer) 1
127.0.0.1:6379> SMEMBERS myset  # 查看指定set的所有值
1)"world"
2)"hello"
127.0.0.1:6379> SMEMBERS myset2  # 查看指定set的所有值
1)"kuangshen"
2)"set2"


##########################################################################
微博,B站,共同关注!(并集) 数字集合类:
-差集 SDIFF
-交集
-并集
127.0.0.1:6379> sadd key1 "a" "b" "c" 
(integer) 3
127.0.0.1:6379> sadd key2 c d e
(integer) 3
127.0.0.1:6379> SDIFF key1 key2	# 差集
1) "b"
2) "a"
127.0.0.1:6379> SINTER key1 key2	# 交集	共同好友就可以这样实现
1) "c"
127.0.0.1:6379> SUNION key1 key2	# 并集
1) "b"
2) "c"
3) "e"
4) "a"
5) "d"


五、Hash(哈希)

Map集合,key-map! 时候这个值是一个map集合! 本质和String类型没有太大区别,还是一个简单的
key-vlaue!

##########################################################################
127.0.0.1:6379> hset myhash field1 kuangshen	# set一个具体 key-vlaue 
(integer) 1
127.0.0.1:6379> hget myhash field1	# 获取一个字段值
"kuangshen"
127.0.0.1:6379> hmset myhash field1 hello field2 world	# set多个 key-vlaue 
OK
127.0.0.1:6379> hmget myhash field1 field2	# 获取多个字段值
1)"hello"
2)"world"
127.0.0.1:6379> hgetall myhash	# 获取全部的数据,
1)"field1"
2)"hello"
3)"field2"
4)"world"
127.0.0.1:6379> hdel myhash field1	# 删除hash指定key字段!对应的value值也就消失了!
(integer) 1
127.0.0.1:6379> hgetall myhash   # 获取全部的数据
1)"field2"
2)"world" 
########################################################################## 
hlen

127.0.0.1:6379> hmset myhash field1 hello field2 world # set多个 key-vlaue 
OK
127.0.0.1:6379> HGETALL myhash  # 获取全部的数据,
1)"field2"
2)"world"
3)"field1"
4)"hello"
127.0.0.1:6379> hlen myhash	# 获取hash表的字段数量!
(integer) 2

##########################################################################
127.0.0.1:6379> HEXISTS myhash field1	# 判断hash中指定字段是否存在!
(integer) 1
127.0.0.1:6379> HEXISTS myhash field3 # 判断hash中指定字段是否存在!
(integer) 0

##########################################################################
# 只获得所有field # 只获得所有value
127.0.0.1:6379> hkeys myhash	# 只获得所有field
1)"field2"
2)"field1"
127.0.0.1:6379> hvals myhash	# 只获得所有value
1)"world"
2)"hello" 
########################################################################## 
incr	decr

127.0.0.1:6379> hset myhash field3 5	#指定增量!
(integer) 1
127.0.0.1:6379> HINCRBY myhash field3 1
(integer) 6
127.0.0.1:6379> HINCRBY myhash field3 -1
(integer) 5
127.0.0.1:6379> hsetnx myhash field4 hello	# 如果不存在则可以设置
(integer) 1
127.0.0.1:6379> hsetnx myhash field4 world	# 如果存在则不能设置
(integer) 0

hash变更的数据 user name age,尤其是是用户信息之类的,经常变动的信息! hash 更适合于对象的存储,String更加适合字符串存储!

五、Zset(有序集合)

数字是代表这个值在哪个位置,1就代表1,200就代表在200这个位置,如果该位置有值则会更新改成员的分数(scrore)并更新到正确的排序位置。

127.0.0.1:6379> zadd myset 1 one   # 添加一个值  (数字是代表这个值在哪个位置,1就代表1,200就代表在200这个位置,如果该位置有值则会更新改成员的分数(scrore)并更新到正确的排序位置。)
(integer) 1
127.0.0.1:6379> zadd myset 2 two 3 three	# 添加多个值
(integer) 2
127.0.0.1:6379> ZRANGE myset 0 -1  #获取key全部数据
1)"one"
2)"two"
3)"three"

##########################################################################
排序如何实现

127.0.0.1:6379> zadd salary 2500 xiaohong	# 添加用户  (数字是代表这个值在哪个位置,1就代表1,200就代表在200这个位置)
(integer) 1
127.0.0.1:6379> zadd salary 5000 zhangsan  # 添加用户  (数字是代表这个值在哪个位置,1就代表1,200就代表在200这个位置)
(integer) 1
127.0.0.1:6379> zadd salary 500 kaungshen  # 添加用户  (数字是代表这个值在哪个位置,1就代表1,200就代表在200这个位置)
(integer) 1
# ZRANGEBYSCORE key min max
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf	# 显示全部的用户 从小到大!
1)"kaungshen"
2)"xiaohong"
3)"zhangsan"
127.0.0.1:6379> ZREVRANGE salary 0 -1 # 从大到进行排序!
1)"zhangsan"
2)"kaungshen"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf +inf withscores # 显示全部的用户并且附带成绩
1) "kaungshen" 2) "500"
3) "xiaohong"
4) "2500"
5) "zhangsan" 6) "5000"
127.0.0.1:6379> ZRANGEBYSCORE salary -inf 2500 withscores # 显示工资小于2500员工的升序排序!
1) "kaungshen" 2) "500"
3) "xiaohong" 4) "2500"

##########################################################################
# 移除rem中的元素

127.0.0.1:6379> zrange salary 0 -1  #获取key全部数据
1)"kaungshen"
2)"xiaohong"
3)"zhangsan"
127.0.0.1:6379> zrem salary xiaohong	# 移除有序集合中的指定元素
(integer) 1
127.0.0.1:6379> zrange salary 0 -1  #获取key全部数据
1)"kaungshen"
2)"zhangsan"
127.0.0.1:6379> zcard salary	# 获取有序集合中的个数
(integer) 2

##########################################################################
127.0.0.1:6379> zadd myset 1 hello  #添加数据
(integer) 1
127.0.0.1:6379> zadd myset 2 world 3 kuangshen  #添加多个数据
(integer) 2
127.0.0.1:6379> zcount myset 1 3	# 获取指定区间的成员数量!
(integer) 3
127.0.0.1:6379> zcount myset 1 2  # 获取指定区间的成员数量!
(integer) 2

案例思路:set 排序 存储班级成绩表,工资表排序! 普通消息,1, 重要消息 2,带权重进行判断!
排行榜应用实现,取Top N 测试!

六、三种特殊数据类型

1、Geospatial 地理位置

朋友的定位,附近的人,打车距离计算?
Redis 的 Geo 在Redis3.2 版本就推出了! 这个功能可以推算地理位置的信息,两地之间的距离,方圆几里的人!
可以查询一些测试数据:http://www.jsons.cn/lngcodeinfo/0706D99C19A781A3/
只有 六个命令:

GEOADD
GEODIST
GEOHASH
GEOPOS
GEORADIUS
GEORADIUSBYMEMBER

官方文档:https://www.redis.net.cn/order/3685.html

getadd

# getadd 添加地理位置
# 规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!
# 有效的经度从-180度到180度。
# 有效的纬度从-85.05112878度到85.05112878度。
# 当坐标位置超出上述指定范围时,该命令将会返回一个错误。
# 127.0.0.1:6379> geoadd china:city 39.90 116.40 beijin (error) ERR invalid longitude,latitude pair 39.900000,116.400000

# 参数 key	值()
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
(integer) 1					
127.0.0.1:6379>	geoadd	china:city	106.50	29.53	chongqi 114.05 22.52 shengzhen
(integer) 2					
127.0.0.1:6379>	geoadd	china:city	120.16	30.24	hangzhou 108.96 34.26 xian
(integer) 2					

getpos
获得当前定位:一定是一个坐标值!

127.0.0.1:6379> GEOPOS china:city beijing	# 获取指定的城市的经度和纬度!
1) 1) "116.39999896287918091"
2) "39.90000009167092543"
127.0.0.1:6379> GEOPOS china:city beijing chongqi 1) 1) "116.39999896287918091"
2) "39.90000009167092543"
2) 1) "106.49999767541885376"
2) "29.52999957900659211"

GEODIST

两人之间的距离! 单位:
m 表示单位为米。
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺。

127.0.0.1:6379> GEODIST china:city beijing shanghai km	# 查看上海到北京的直线距离
"1067.3788"
127.0.0.1:6379> GEODIST china:city beijing chongqi km	# 查看重庆到北京的直线距离
"1464.0708"

georadius 以给定的经纬度为中心, 找出某一半径内的元素
我附近的人? (获得所有附近的人的地址,定位!)通过半径来查询! 获得指定数量的人,200
所有数据应该都录入:china:city ,才会让结果更加请求!

127.0.0.1:6379> GEORADIUS china:city 110 30 1000 km	# 以110,30 这个经纬度为中心,寻找方圆1000km内的城市
1)"chongqi"
2)"xian"
3)"shengzhen"
4)"hangzhou"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km
1)"chongqi"
2)"xian"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withdist	# 显示到中间距离的位置
1)1) "chongqi" 2) "341.9374"
2)1) "xian"
2) "483.8340"
127.0.0.1:6379> GEORADIUS china:city 110 30 500 km withcoord	# 显示他人的定位信息
1)1) "chongqi"
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) "chongqi" 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) "chongqi" 2) "341.9374"
3) 1) "106.49999767541885376"
2) "29.52999957900659211"
2)1) "xian"
2) "483.8340"
3) 1) "108.96000176668167114"
2) "34.25999964418929977"

GEORADIUSBYMEMBER

# 找出位于指定元素周围的其他元素!
127.0.0.1:6379> GEORADIUSBYMEMBER china:city beijing 1000 km
1)"beijing"
2)"xian"
127.0.0.1:6379> GEORADIUSBYMEMBER china:city shanghai 400 km
1)"hangzhou"
2)"shanghai"

GEOHASH 命令 - 返回一个或多个位置元素的 Geohash 表示

该命令将返回11个字符的Geohash字符串!

# 将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么则距离越近!
127.0.0.1:6379> geohash china:city beijing chongqi
1)"wx4fbxxfke0"
2)"wm5xzrybty0"

GEO 底层的实现原理其实就是 Zset!我们可以使用Zset命令来操作geo!

127.0.0.1:6379> ZRANGE china:city 0 -1	# 查看地图中全部的元素
1)"chongqi"
2)"xian"
3)"shengzhen"
4)"hangzhou"
5)"shanghai"
6)"beijing"
127.0.0.1:6379> zrem china:city beijing	# 移除指定元素!
(integer) 1
127.0.0.1:6379> ZRANGE china:city 0 -1
1)"chongqi"
2)"xian"
3)"shengzhen"
4)"hangzhou"
5)"shanghai"

2、Hyperloglog

什么是基数?
A {1,3,5,7,8,7}
B{1,3,5,7,8}
基数(不重复的元素) = 5,可以接受误差!
简介
Redis 2.8.9 版本就更新了 Hyperloglog 数据结构!
Redis Hyperloglog 基数统计的算法!

优点:占用的内存是固定,2^64 不同的元素的技术,只需要废 12KB内存!如果要从内存角度来比较的话 Hyperloglog 首选!
网页的 UV (一个人访问一个网站多次,但是还是算作一个人!)
传统的方式, set 保存用户的id,然后就可以统计 set 中的元素数量作为标准判断 !
这个方式如果保存大量的用户id,就会比较麻烦!我们的目的是为了计数,而不是保存用户id;
0.81% 错误率! 统计UV任务,可以忽略不计的!

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	# 合并两组 mykey mykey2 => mykey3 并集
OK
127.0.0.1:6379> PFCOUNT mykey3	# 看并集的数量!
(integer) 15

3、Bitmap

位存储
统计用户信息,活跃,不活跃! 登录 、 未登录! 打卡,365打卡! 两个状态的,都可以使用
Bitmaps!
Bitmap 位图,数据结构! 都是操作二进制位来进行记录,就只有0 和 1 两个状态!
365 天 = 365 bit 1字节 = 8bit 46 个字节左右!
使用bitmap 来记录 周一到周日的打卡! 周一:1 周二:0 周三:0 周四:1 …
在这里插入图片描述
查看某一天是否有打卡!

127.0.0.1:6379> getbit sign 3
(integer) 1
127.0.0.1:6379> getbit sign 6
(integer) 0

统计操作,统计 打卡的天数!

127.0.0.1:6379> bitcount sign	# 统计这周的打卡记录,就可以看到是否有全勤!
(integer) 3
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值