Redis学习笔记 -2

本文详细介绍了Redis中的数据类型,包括String、List、Set、Hash、Zset、Geospatial、Hyperloglog和Bitmaps。讲解了各种类型的操作命令及应用场景,如String用于计数器、粉丝数统计,List实现消息队列,Set存储不重复元素,Hash存储对象信息,Zset实现有序集合,Geospatial处理地理位置信息,Hyperloglog进行基数统计,以及Bitmaps用于位图操作。每个类型都包含多个命令的示例,帮助读者理解和掌握Redis的使用。
摘要由CSDN通过智能技术生成

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
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值