• 2--Redis数据类型 ; 常用命令


    一、redis数据类型

    Redis五大数据类型

    Redis-keyStringListHashZset

    Redis三种特殊数据类型

    geospatialhyperloglogbitmaps

    1.字符串String

    127.0.0.1:6379> help @string  #查看全部字符串
    #1.设置值
    127.0.0.1:6379> set name 丹
    OK
    --------------------------------------------------------------------------------
    #2.获取值
    127.0.0.1:6379> get name
    丹
    --------------------------------------------------------------------------------
    #3.修改
    127.0.0.1:6379> set name 丹姐
    OK
    127.0.0.1:6379> get name
    丹姐
    --------------------------------------------------------------------------------
    #4.删除
    127.0.0.1:6379> del name
    1
    127.0.0.1:6379> get name
    --------------------------------------------------------------------------------
    #5.判断一个key是否存在
    127.0.0.1:6379> exists  name
    0  #0表示key不存在
    127.0.0.1:6379> set name lll
    OK
    127.0.0.1:6379> exists  name
    1  #1表示key存在
    --------------------------------------------------------------------------------
    #6.过期时间
    127.0.0.1:6379> TTL name  #查看过期时间
    -1         #永不过期
    127.0.0.1:6379> TTL name
    -2		  # 已经过期了
    127.0.0.1:6379> TTL name
    3		  # 剩下3秒钟就过期了
    --------------------------------------------------------------------------------
    #7.设置一个以毫秒为单位的过期时间
    127.0.0.1:6379> set name dan px 10000
    OK
    --------------------------------------------------------------------------------
    #8.设置一个以秒为单位的过期时间
    127.0.0.1:6379> set name dan ex 10
    OK
    --------------------------------------------------------------------------------
    #9.setex(set with expire)设置过期时间
    127.0.0.1:6379> setex key3 30 "hello"  #key+秒数+value 
    --------------------------------------------------------------------------------
    #10.setnx(set if not exist)不存在则设置(在分布式锁中会常常使用)
    127.0.0.1:6379> setnx key4 "mysql"  #如果key4不存在,则创建,返回1
    1
    127.0.0.1:6379> setnx key4 "redis"  #如果key4存在,则创建失败,返回0
    0   
    --------------------------------------------------------------------------------
    #14.设置多个值
    127.0.0.1:6379> MSET b c d e f g
    OK
    127.0.0.1:6379> KEYS *
    f
    b
    a
    d
    name
    127.0.0.1:6379> get b
    c
    127.0.0.1:6379> get d
    e
    127.0.0.1:6379> get f
    g
    127.0.0.1:6379> msetnx a b c d #已设置过,创建失败 
    0
    --------------------------------------------------------------------------------
    #15.删除多个值
    127.0.0.1:6379> KEYS *
    1) "a"
    2) "name"
    3) "d"
    127.0.0.1:6379> del a d
    (integer) 2
    127.0.0.1:6379> KEYS *
    1) "name"
    --------------------------------------------------------------------------------
    #16.GETSET
    (相当于get+set:先执行get命令,返回get结果,然后将key更新为新的value,下次再get的时候查到的就是新得value)
    127.0.0.1:6379> GETSET name lalala
    "qqq"
    127.0.0.1:6379> get name
    "lalala"
    --------------------------------------------------------------------------------
    #17.按照下标去更新  getset  先get再set
    127.0.0.1:6379> GETSET name redis  #如果不存在值,则返回nil
    nil
    127.0.0.1:6379> get name
    “redis”
    127.0.0.1:6379> SETRANGE name mysql #如果存在值,获取原来的值,并设置新的值
    “redis”
    127.0.0.1:6379> get name  
    ”mysql“
    --------------------------------------------------------------------------------
    #18.获取多个key值
    127.0.0.1:6379> MGET get name
    lammlla
    --------------------------------------------------------------------------------
    #19.截取
    127.0.0.1:6379> get name  #截取name值的2-4位,从0开始数
    lammlla
    127.0.0.1:6379> GETRANGE name 2 4
    mml"
    127.0.0.1:6379> getrange name 0 -1 #获取全部的字符串 和get key是一样
    --------------------------------------------------------------------------------
    #20.计数
    (Redis当中的计数器是具有原子性的)
    127.0.0.1:6379> INCR num # 递增
    1
    127.0.0.1:6379> DECR num # 递减
    0
    --------------------------------------------------------------------------------
    #21.指定长度递增(步长)
    127.0.0.1:6379> incrby num 11
    11
    127.0.0.1:6379> incrby num 11
    2
    --------------------------------------------------------------------------------
    #22.指定长度递减
    127.0.0.1:6379> decrby num 11
    12
    --------------------------------------------------------------------------------
    #23.追加字符串,如果当前key不存在,就相当于setkey 
    127.0.0.1:6379> get name
    lammlla
    127.0.0.1:6379> append name "hehe"
    9
    127.0.0.1:6379> get name
    lammllahehe
    --------------------------------------------------------------------------------
    #24.截取字符串的长度
    127.0.0.1:6379> strlen key1
    7
    127.0.0.1:6379> append key1 ",hello"
    17
    127.0.0.1:6379> strlen key1
    17
    --------------------------------------------------------------------------------
    #25.替换
    127.0.0.1:6379> set key1 abcdefg
    ok
    127.0.0.1:6379> get key1
    "abcdefg"
    127.0.0.1:6379> setrange key1 1 xx
    (integer) 7
    127.0.0.1:6379> get key1
    "axxdefg"
    --------------------------------------------------------------------------------
    #对象
    set user:1 {name:zhangdan,age:18}  #设置一个user:1 ,对象值为json字符来保存一个对象
    这里的key是一个巧妙的设计:user:(id):{filed}
    127.0.0.1:6379> mset user:1:name zhangsan user:1:age 18
    ok
    127.0.0.1:6379> mget user:1:name user:1:age
    1)"zhangsan"
    2)"2"
    

    String总结

    数据结构是相同的

    String类似的使用场景:value除了是我们的字符串还可以是我们的数字

    • 计数器
    • 统计多单位的数量
    • 粉丝数
    • 对象缓存存储

    2.哈希Hash

    #怎样用一个key存一个人的信息呢?
    --------------------------------------------------------------------------------
    #1.写入数据(set多个key-vlaue)
    127.0.0.1:6379> hset people name cdan sex girl add guangzhou
    3
    --------------------------------------------------------------------------------
    #2.获取数据
    127.0.0.1:6379> hget people name
    cdan
    127.0.0.1:6379> hget people add
    guangzhou
    --------------------------------------------------------------------------------
    #4.修改数据
    127.0.0.1:6379> hset people name danjie
    0
    127.0.0.1:6379> hget people name
    danjie
    --------------------------------------------------------------------------------
    #5.删除数据
    127.0.0.1:6379> hdel people name
    1
    127.0.0.1:6379> hget people name
    --------------------------------------------------------------------------------
    #6.删除所有数据
    127.0.0.1:6379> del people
     1
    127.0.0.1:6379> hget people name
    (nil)
    127.0.0.1:6379> hget people add
    (nil)
    --------------------------------------------------------------------------------
    #7.获取多个值
    127.0.0.1:6379> hset people name cdan sex girl add guangzhou
    3
    127.0.0.1:6379> hmget people name add sex
    cdan
    guangzhou
    girl
    --------------------------------------------------------------------------------
    #8.获取所有的key和value
    127.0.0.1:6379> hgetall people
    name
    cdan
    sex
    girl
    add
    guangzhou
    --------------------------------------------------------------------------------
    #9.获取所有的key
    127.0.0.1:6379> hkeys people
    name
    sex
    add
    --------------------------------------------------------------------------------
    #10.获取所有的value
    127.0.0.1:6379> hvals people
    cdan
    girl
    guangzhou
    --------------------------------------------------------------------------------
    #11.哈希类的计数(增加)
    127.0.0.1:6379> hincrby people id 1
    1
    127.0.0.1:6379> hincrby people id 1
    2
    127.0.0.1:6379> hincrby people id 1
    3
    --------------------------------------------------------------------------------
    #12.计数(递减)
    127.0.0.1:6379> hget peopel id
    "3"
    127.0.0.1:6379> hincrby peopel id -1
    -1
    127.0.0.1:6379> hincrby peopel id -1
    -2
    --------------------------------------------------------------------------------
    #13.计数(小数点)
    127.0.0.1:6379> HINCRBYFLOAT peopel num 1.34
    1.34
    127.0.0.1:6379> HINCRBYFLOAT peopel num 1.34
    2.68
    127.0.0.1:6379> HINCRBYFLOAT peopel num 1.34
    4.02
    127.0.0.1:6379> HINCRBYFLOAT people num 10.9
    134.09
    127.0.0.1:6379> HINCRBYFLOAT people num 10.9
    144.98999999999999999 # 精度不够
    --------------------------------------------------------------------------------
    #14.获取长度(获取hash表的字段数量)
    127.0.0.1:6379> hlen peopel
    2
    --------------------------------------------------------------------------------
    #15.获取某个字段的长度
    127.0.0.1:6379> hstrlen peopel num
    4
    --------------------------------------------------------------------------------
    #16.设置过期时间
    17.0.0.1:6379> expire peopel 111
    1
    127.0.0.1:6379> ttl peopel # 查看过期时间 
    -2
    --------------------------------------------------------------------------------
    #17.判断hash中指定字段是否存在
    17.0.0.1:6379> hexists myhash field1
    1     #返回1代表存在
    17.0.0.1:6379> hexists myhash field2
    0     #返回0代表不存在
    

    hash变更的数据user 那么 age,尤其是用户信息之类的,经常变动的信息!hash更适合于对象存储

    3.列表List

    redis列表就是redis的字符串类型的集合,按照插入顺序排序。list成栈,队列,阻塞队列

    所有的list命令都是用L开头的

    [root@redis01 ~]# redis-cli --raw
    127.0.0.1:6379> auth 123
    
    #1.从左边插入数据(后进先出,查看时是倒着来的)
    127.0.0.1:6379> lpush peopel one   #lpush是将一个或多个值,插入到列表头部(左)
    (integer) 1
    127.0.0.1:6379> lpush peopel two   
    (integer) 2
    127.0.0.1:6379> lpush peopel three   
    (integer) 3
    127.0.0.1:6379> lrange peopel 0 -1  #通过区间获取具体的值
    1) "three"
    2) "two"
    3) "one"
    127.0.0.1:6379> lrange peopel 0 1
    1) "three"
    2) "two"
    --------------------------------------------------------------------------------
    #2.从右边插入数据(先进先出)
    127.0.0.1:6379> rpush peopel abc    #在原有的基础上插入到队列的 最后一个位置(右)
    (integer) 4
    127.0.0.1:6379> lrange peopel 0 -1
    1) "three"
    2) "two"
    3) "one"
    4)"abc"
    --------------------------------------------------------------------------------
    #3.查看数据
    127.0.0.1:6379> lrange peopel 0 -1  #从开始到结束
    1) "beijing"
    2) "man"
    3) "yyy"
    4) "yyy"
    5) "abc"
    127.0.0.1:6379> lrange peopel 2 4  #从第二位到第四位
    1) "yyy"
    2) "yyy"
    3) "abc"
    --------------------------------------------------------------------------------
    #4.从左边追加数据(与sting类型中的nx类似,只有当list存在时才会从左边依次追加元素)
    127.0.0.1:6379> lrange peopel 0 -1
    1) "beijing"
    2) "man"
    3) "yyy"
    4) "yyy"
    5) "abc"
    127.0.0.1:6379> lpushx peopel 345  #从头部追加345
    (integer) 6
    127.0.0.1:6379> lrange peopel 0 -1
    1) "345"
    2) "beijing"
    3) "man"
    4) "yyy"
    5) "yyy"
    6) "abc"
    --------------------------------------------------------------------------------
    #5.从右边追加数据(只有当list存在时才会从右边依次追加元素)
    127.0.0.1:6379> lrange peopel 0 -1
    1) "345"
    2) "beijing"
    3) "man"
    4) "yyy"
    5) "yyy"
    6) "abc"
    127.0.0.1:6379> rpushx peopel 123  #从尾部追加123
    (integer) 7
    127.0.0.1:6379> lrange peopel 0 -1
    1) "345"
    2) "beijing"
    3) "man"
    4) "yyy"
    5) "yyy"
    6) "abc"
    7) "123"
    --------------------------------------------------------------------------------
    #6.在某个key的前面或者后面追加一个数据
    127.0.0.1:6379> lrange peopel 0 -1
    1) "345"
    2) "beijing"
    3) "man"
    4) "yyy"
    5) "yyy"
    6) "abc"
    7) "123"
    127.0.0.1:6379> linsert peopel before beijing 111  #在北京的前边添加111
    (integer) 8
    127.0.0.1:6379> lrange peopel 0 -1
    1) "345"
    2) "111"
    3) "beijing"
    4) "man"
    5) "yyy"
    6) "yyy"
    7) "abc"
    8) "123"
    127.0.0.1:6379> linsert people after world 123 456
    9) "456"
    --------------------------------------------------------------------------------
    #7.移除list集合中指定个数的value,精确匹配
    127.0.0.1:6379> lrange peopel 0 -1
    123
    beijing
    shanghai
    man
    yyy
    127.0.0.1:6379> lrem peopel 1 123  #从列表左侧开始删除1个123
    (integer) 1
    127.0.0.1:6379> lrange peopel 0 -1
    beijing
    shanghai
    man
    yyy
    --------------------------------------------------------------------------------
    #8.修改数据(将列表中指定下标的值替换为另外一个值,更新操作)
    127.0.0.1:6379> lrange peopel 0 -1
    123
    23
    man
    yyy
    127.0.0.1:6379> lset list 0 item  #如果不存在列表我们去更新就会报错
    (error)ERR no such key
    127.0.0.1:6379> lset peopel 1 beijing  #如果存在,更新指定第1位修改成beijing
    OK
    127.0.0.1:6379> lrange peopel 0 -1
    123
    beijing
    man
    yyy
    --------------------------------------------------------------------------------
    #9.截取字符串
    127.0.0.1:6379> lrange peopel 0 -1
    123
    beijing
    man
    yyy
    127.0.0.1:6379> ltrim peopel 1 3  #截取从1到3,这个list已经被改变了,截断了只剩下截取的元素
    OK
    127.0.0.1:6379> lrange peopel 0 -1
    beijing
    man
    yyy
    --------------------------------------------------------------------------------
    #10.返回列表的长度LLEN
    127.0.0.1:6379> llen peopel
    3
    127.0.0.1:6379> LRANGE peopel 0 -1
    beijing
    man
    yyy
    --------------------------------------------------------------------------------
    ##11.通过下标lindex获得list中的某一个值
    127.0.0.1:6379> lrange list 0 -1
    1) "two"
    2) "one"
    127.0.0.1:6379> lindex list 1 
    "one"
    127.0.0.1:6379> lindex list 0
    "two"
    --------------------------------------------------------------------------------
    #12.从左边开始消费(lpop移除list的第一个元素)
    127.0.0.1:6379> lrange peopel 0 -1
    1) "man"
    2) "yyy"
    3) "xxx"
    127.0.0.1:6379> lpop peopel 
    "man"
    127.0.0.1:6379> lrange peopel 0 -1
    1) "yyy"
    2) "xxx"
    --------------------------------------------------------------------------------
    #13.从右边开始消费(rpop移除list的最后一个元素)
    127.0.0.1:6379> lrange peopel 0 -1
    1) "yyy"
    2) "xxx"
    127.0.0.1:6379> rpop peopel
    "xxx"
    127.0.0.1:6379> lrange peopel 0 -1
    1) "yyy"
    --------------------------------------------------------------------------------
    #14.消费一个元素追加另一个列表里 (从尾开始)
    或者说是:# rpoplpush移除列表中最后一个元素到新的列表中
    127.0.0.1:6379> lrange peopel 0 -1
    1) "555"
    2) "444"
    3) "333"
    4) "222"
    5) "111"
    6) "111"
    127.0.0.1:6379> rpoplpush peopel newlist
    "111"
    127.0.0.1:6379> lrange peopel 0 -1  #查看原来的列表
    1) "555"
    2) "444"
    3) "333"
    4) "222"
    5) "111"
    127.0.0.1:6379> lrange newlist 0 -1  #查看目标列表,确实存在改值
    1) "111"
    --------------------------------------------------------------------------------
    #15.实时获取某一个值
    127.0.0.1:6379> blpop peopel 1000
    peopel
    man
    127.0.0.1:6379> blpop peopel 1000
    

    list小结

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

    4.无序集合Set

    Redis 的 Set 是 string 类型的无序集合。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。集合中最大的成员数为 2^32 - 1 (4294967295, 每个集合可存储 40多亿个成员)。

    set的值是不能重复读的

    #1.增加数据(set集合中添加元素)
    127.0.0.1:6379> sadd mysqlset 1
    (integer) 1
    127.0.0.1:6379> sadd mysqlset 12
    (integer) 1
    --------------------------------------------------------------------------------
    #2.查看数据(查看指定set的所有值
    127.0.0.1:6379> smembers mysqlset
    1) "1"
    2) "12"
    3) "123"
    --------------------------------------------------------------------------------
    #3.删除数据(移除set集合中的指定元素)
    127.0.0.1:6379> smembers mysqlset
    1
    2
    4
    127.0.0.1:6379> srem  mysqlset 1
    1
    127.0.0.1:6379> smembers mysqlset
    2
    4
    --------------------------------------------------------------------------------
    #4.移动数据
    127.0.0.1:6379> sadd myset "hello"
    1
    127.0.0.1:6379> sadd myset "world"
    1
    127.0.0.1:6379> sadd myset "cdan"
    1
    127.0.0.1:6379> sadd myset2 "haha"
    1
    127.0.0.1:6379> smove myset myset2 "cdan" #将一个指定的值,移动到另外一个set集合
    1
    127.0.0.1:6379> smembers myset
    "hello"
    "world"
    127.0.0.1:6379> smembers myset2
    "cdan"
    "haha"
    --------------------------------------------------------------------------------
    #5.返回集合当中的个数
    127.0.0.1:6379> smembers myset
    1) "qqq"
    2) "1234"
    127.0.0.1:6379> scard myset
    (integer) 2
    --------------------------------------------------------------------------------
    #6.随机返回两个数据
    127.0.0.1:6379> srandmember mysqlset 2
    1) "12345"
    2) "1"
    --------------------------------------------------------------------------------
    #7.判断一个数据是否存在一个集合中
    127.0.0.1:6379> sismember mysqlset abc
    (integer) 0  #不存在返回0
    127.0.0.1:6379> sismember mysqlset 12
    (integer) 1  #存在返回1
    --------------------------------------------------------------------------------
    #8.随机删除一些set集合中的元素spop
    127.0.0.1:6379> smembers mysqlset
    1) "1"
    2) "12"
    3) "12345"
    127.0.0.1:6379> spop mysqlset 1
    1) "12"
    127.0.0.1:6379> smembers mysqlset
    1) "1"
    2) "12345"
    --------------------------------------------------------------------------------
    #9.返回多个集合中的交集
    127.0.0.1:6379> sadd myseta 1 2 3 4 5
    (integer) 5
    127.0.0.1:6379> sadd mysetb 1 2 3 7 8 9
    (integer) 6
    127.0.0.1:6379> sinter myseta mysetb mysetc
    1) "1"
    2) "2"
    3) "3"
    --------------------------------------------------------------------------------
    #10.返回多个集合的并集
    127.0.0.1:6379> sadd myseta 1 2 3 4 5
    (integer) 5
    127.0.0.1:6379> sadd mysetc 1 2 3 4 5 6 7 8
    (integer) 8
    127.0.0.1:6379> sunion myseta mysetb mysetc
    1) "1"
    2) "2"
    3) "3"
    4) "4"
    5) "5"
    6) "6"
    7) "7"
    8) "8"
    --------------------------------------------------------------------------------
    #11.返回多个集合的差集
    127.0.0.1:6379> sadd myseta 1 2 3 4 5
    (integer) 5
    127.0.0.1:6379> sadd mysetb 1 2 3 7 8 9
    (integer) 6
    127.0.0.1:6379> sadd mysetc 1 2 3 4 5 6 7 8
    (integer) 8
    127.0.0.1:6379> sdiff mysetc mysetb myseta
    1) "6"
    

    场景:

    微博,A用户将 所有关注的人放在一个set集合中!将他的粉丝也放在一个集合中!

    共同关注,共同爱好,二度好友,推荐好友!(六度分割理论)

    5.有序集合Zset

    Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一 个 double 类型的分数。redis 正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的, 但分数(score)却可以重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。 集合中最大 的成员数为 2^32 - 1 (4294967295, 每个集合可存储 40多亿个成员)。

    #1.添加数据
    127.0.0.1:6379> zadd nn 1 one 2 two
    1
    127.0.0.1:6379> zadd nn 123 tree
    1
    127.0.0.1:6379> zadd nn 3 twos
    (integer) 1
    --------------------------------------------------------------------------------
    #2.查看数据
    127.0.0.1:6379> zrange nn 0 -1
    one
    two
    twos
    tree
    --------------------------------------------------------------------------------
    #3.排序
    127.0.0.1:6379> zadd salary 2500 xiaoming  #添加3个用户及薪水
    (integer) 1
    127.0.0.1:6379> zadd salary 500 xiaole
    (integer) 1
    127.0.0.1:6379> zadd salary 5000 xiaomiao
    (integer) 1
    127.0.0.1:6379> zrangebyscore salary -inf +inf   #升序,显示所有的用户名
    1) "xiaole"
    2) "xiaoming"
    3) "xiaomiao"
    127.0.0.1:6379> zrevrange salary 0 -1   #降 序,显示所有的用户名
    1) "xiaomiao"
    2) "xiaoming"
    3) "xiaole"
    127.0.0.1:6379> zrangebyscore salary -inf +inf withscores #显示全部的用户并且附带成绩
    1) "xiaole"
    2) "500"
    3) "xiaoming"
    4) "2500"
    5) "xiaomiao"
    6) "5000"
    127.0.0.1:6379> zrangebyscore salary -inf 2500 withscores #显示工资小于2500的员工的升序
    ... ...
    --------------------------------------------------------------------------------
    #4.删除数据
    127.0.0.1:6379> zrange nn 0 -1
    one
    two
    tree
    127.0.0.1:6379> zrem nn one #移除有序集合中的指定元素
    1
    127.0.0.1:6379> zcard nn #获取有序集合中的个数
    2
    #5.获取指定区间的成员数量
    127.0.0.1:6379> zcount myset 1 3
    3
    

    案例思路:set 排序 存储班级成绩表,工资表排序

    普通消息---1,重要消息--2,带权重进行判断

    排行榜应用实现,取Top N测试

    6. Geospatial地理位置

    朋友的定位,附件的人,打车距离计算

    Redis的Geo在Redis3.2版本就推出这些功能

    可以查询一些测试数据:(http://www.jsons.cn/lngcode/)

    geoadd

    添加地理位置

    官网([Redis GEOADD 命令_将指定的地理空间位置(纬度、经度、名称)添加到指定的key中] (https://www.redis.net.cn/order/3685.html))

    有效的经度从-180度到180度。

    有效的纬度从-85.05112878度到85.05112878度。

    当坐标位置超出上述指定范围时,该命令将会返回一个错误

    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 chongqin 114.05 22.52 shenzhen 120.16 30.24 hangzhou 108.96 34.26 xian
    (integer) 4
    

    geopos

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

    127.0.0.1:6379> geopos china:city beijing #获取指定的城市的经度和纬度
    1) 1) "116.39999896287918091"
       2) "39.90000009167092543"
    127.0.0.1:6379> geopos china:city shanghai chongqin
    1) 1) "121.47000163793563843"
       2) "31.22999903975783553"
    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 chongqin km
    "1464.0708"
    

    georadius

    以给定的经纬度为中心,找出某一半径内的元素

    我附近的人?(获得所有附近的人地址,定位)通过半径来查询

    #先定义集合,再查找。之前已把所有的数据都录入china:city
    127.0.0.1:6379> georadius china:city 110 30 1000 km 
    1) "chongqin"          #以110 30这个经纬度为中心,寻找方圆1000km内的城市
    2) "xian" 
    3) "shenzhen"
    4) "hangzhou"
    127.0.0.1:6379> georadius china:city 110 30 500 km
    1) "chongqin"
    2) "xian"
    127.0.0.1:6379> georadius china:city 110 30 500 km withdist #显示到中间距离的位置
    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 #显示他人的定位信息
    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 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"
    
    

    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 chongqin
    1) "wx4fbxxfke0"         
     # 将二维的经纬度转换为一维的字符串,如果两个字符串越接近,那么则距离越近
    2) "wm5xzrybty0"
    

    原理

    Geo底层的实现原理其实就是zset,我们可以使用zset命令来操作geo

    127.0.0.1:6379> zrange china:city 0 -1  #查看地图中全部的元素
    1) "chongqin"
    2) "xian"
    3) "shenzhen"
    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) "chongqin"
    2) "xian"
    3) "shenzhen"
    4) "hangzhou"
    5) "shanghai"
    

    7. Hyperloglog 基数统计

    基数:不重复的元素

    8. Bitmaps位存储

    统计用户信息,活跃、不活跃。登录、未登录。打卡,365打卡。两个状态的都可以使用

    Bitmaps位图,数据结构。都是操作二进制位来进行记录,就只有0和1两个状态

    365天=365bit 1字节=8bit 46个字节左右

    #使用bitmap来记录周一到周日的打卡
    周一:1  周二:0  周三:1 ...  ...
    127.0.0.1:6379> setbit sign 0 1
    (integer) 0
    127.0.0.1:6379> setbit sign 1 0
    (integer) 0
    127.0.0.1:6379> setbit sign 3 1
    (integer) 0
    127.0.0.1:6379> setbit sign 4 1 
    (integer) 0
    127.0.0.1:6379> setbit sign 5 0
    (integer) 0
    127.0.0.1:6379> setbit sign 6 0
    (integer) 0
    ---------------------------------------------
    #查看某一天是否有打卡
    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
    

    二、Redis常用命令

    1.查看所有key

    127.0.0.1:6379> keys *
    myseta
    mysqlset
    myset
    mysetc
    nn
    num
    name
    

    2.查看key的类型

    127.0.0.1:6379> type nn
    zset  #有序集合
    127.0.0.1:6379> type name
    string  #字符串
    127.0.0.1:6379> type peopel
    list  #列表
    

    3.随机返回一个key

    127.0.0.1:6379> RANDOMKEY
    num
    127.0.0.1:6379> RANDOMKEY
    myset
    127.0.0.1:6379> RANDOMKEY
    nn
    

    4.删除key

    127.0.0.1:6379> del name
    (integer) 1  #返回状态0/1,true/false
    127.0.0.1:6379> keys *
     1) "newlist"
     2) "myset"
     3) "mysetb"
     4) "myset1"
     5) "peopel"
     6) "myseta"
     7) "people"
     8) "age"
     9) "mysetc"
    10) "mysqlset"
    

    5.判断一个key是否存在

    127.0.0.1:6379> exists name
    (integer) 0  #不存在返回0
    127.0.0.1:6379> exists peopel
    (integer) 1  #存在返回1
    

    6.重命名一个key

    127.0.0.1:6379> rename myset myset0
    OK
    

    7.查看key的剩余时间

    #1.以秒为单位
    127.0.0.1:6379> ttl peopel
    (integer) -1  #-1永不过期
    
    #2.以毫秒为单位
    127.0.0.1:6379> pttl peopel
    (integer) -1  #-1永不过期
    

    8.清空数据库(flushdb)

    127.0.0.1:6379[3]> keys *
    1) "name"
    127.0.0.1:6379[3]> flushdb  #清空当前的数据库
    OK
    127.0.0.1:6379[3]> keys *
    (empty array)
    
    127.0.0.1:6379[2]> flushall  # 清空所有数据库的数据
    OK
    
    

    9.不知道的命令去官网查

  • 相关阅读:
    spring mvc注解文件上传下载
    html,图片上传预览,input file获取文件等相关操作
    three.js、webGL、canvas区别于关联
    html添加新元素兼容和访问
    关于HTML,css3自适应屏幕,自适应宽度
    数据库设计的规则 入门
    mysql 索引入门
    一 .linux上安装 python git redis nginx
    一 .git和github
    一 .Django+Alipay(支付宝支付使用)和微信支付
  • 原文地址:https://www.cnblogs.com/caodan01/p/15088462.html
Copyright © 2020-2023  润新知