五大基础类型-三大特殊类型(Geospatial,Hyoerloglog,Bitmap)

key操作

keys *  # 查看所有的key
exists key  # 判断当前key是否存在,存在返回1 不存在返回0
move key 1  # move切换,将选中key切换到其他数据库
clear # 清屏
set key value # 设置key value
get key # 获取key 的value
expire key 10(时间 秒为单位) # 设置key的过期时间,单位是S
ttl key # 查看当前key的剩余时间 过期后会删除 删除后显示为-2
type key # 查看当前key的类型 字符串为string

String(字符串)

  • 基础操作

    set key value # 设置值,存在覆盖
    mset key value [key value ...... ]# 创建多个值
    get key # 获得值,不存在报错
    mget key [key ... ]# 获取多个值 
    keys * # 查看所有的key(key有多种类型)
    exists key # 判断某一个key是否存在 存在为1 不存在为0
    append key value # 往该key中添加字符串,如果key不存在,就创建key 相当于setkey
    strlen key # 获取字符串的长度(该key必须是string类型)
    
  • 增减指定步长

    incr key # 自增1 注意:当该key的值不是数字的时候无法自增
    decr key # 自减1 同上
    incrby key int(数字类型 步长) # 可设置步长,指定增量
    decrby key int # 设置步长,指定减量
    
  • 字符串范围 range

    getrange key start(数字 开始位置) end(数字 结束位置) # 截取字符串[start,end] 是闭区间
    getrange key 0 -1 # 获取全部的字符串 和 get key是一样的
    
  • 替换

    setrange key offset(int 数字 从哪个位置开始) value(替换为什么) # 替换指定位置开始的字符串
    
  • setex(set with expire)设定到期,setnx(set if not exist) 不存在在设置(分布式锁中常常会用)

    setex key seconds(int 数字) value # 设置key的值为value,并且seconds秒后到期也就是被删除
    setnx key value # 如果key不存在,则创建,如果存在则创建失败
    msetnx key value[ key value...] # 原子性操作,要么一起成功,要么一起失败,所有的key必须都不存在才可以创建成功
    
  • 对象

    set user:{id} {name:zhangsan,age:16} # 设置一个user:1对象 值为json字符串来保存一个对象
    # 这里的key是一个巧妙的设计
    
  • getset 先get然后在set

    getset key value # 返回该key的value,如果不存在则返回nil,如果存在值,则获取原来的值,并设置新的值
    

计数器、统计多单位数量、粉丝数、对象缓存

List(列表)

  • 创建list

    lpush key element(元素)[element.....]#将一个值或者多个值,插入到列表头部(左) 列表不存在则创建
    rpush key element [element....]# 插入到列表尾部(右),不存在则创建
    
  • 删除

    lpop key(list类型) # 移出列表的第一个元素( 左 头部)
    rpop key   # 移出列表的最后一个元素(右 尾部)
    
  • 查询

    lrange key(list类型) key start top # 获取list中的值 0 -1 是取出所有 [start top] 闭区间
    lindex key index(int 数字) # 通过下标获取list中某一个值
    
  • llen返回列表长度

  • 移除指定的值

    lrem key count(int 数字) element # 移出列表中指定个数的指定元素(element),精确匹配,从头部(左边开始移除)
    
  • trim 切片(原list上)

    ltrim key start stop #通过下标对list进行切片,会改变原列表,只有区间内的保留
    
  • rpoplpush

    rpoplpush source(来源) destination(目的地) # 移除列表中的最后一个元素,将他移动到新的列表中的头部(左边),如果目标列表不存在则会创建,
    
  • 更新

    lset key index(int) element  # 将该列表中的index索引,替换为element设置的值,如果不存在列表则会报错,如果不存在该索引也会报错 索引为从0开始
    
  • linsert 将某个具体的value插入到列表中某个元素的前面或者后面

    linsert key befor(前面)|(或者)after(后面) element(就好像value 元素的意思)
    lpush 头部插入 rpush 尾部插入 linsert 具体元素中间插入
    

消息排列 消息队列(Lpush Rpop) 栈 (Lpush Lpop)

Set(集合)

set中的值是不能重复的,集合中的值是乱序的

命令基本上都是s开头的

  • 增加

    sadd key member [member(成员) ....] # 向key这个set中插入值 如果存在会插入失败
    
  • 查看

    smembers key # 查看这个集合中的所有成员(是指定集合)
    sismerber key member # 查看这个集合中有没有这个值
    
  • 获取集合中的元素个数

    scard key # 查看这个集合中的成员个数
    
  • 移出set集合中指定的元素

    srem key member [member.... ]# 移出集合中的指定元素 移出多个成员的时候 如果移出了一个不存在的成员不报错,应该就是跳过
    
  • 随机

    mrandmember key [count](加上就是随机取出多个不加就是随机取出一个) # 随机取出一个或者多个成员
    spop key [count](同上) # 随机弹出一个或者多个成员 key是集合
    
  • 移动

    smove source(成员的来源) destination(成员的去处) member(成员) # 将一个指定的成员,移动到另一个set集合中
     smove myset myset2 "hello" # 这两个成员必须是同一个库中的
    
  • 交集 并集 差集

    共同关注(交集) 等

    sdiff key key key [key].... # 求多个集合的差集(就是去掉相同的 是第一个集合与其他集合的差集)
    sinter key key [key]... # 求多个集合的交集(显示的成员存在于所有查询的集合中)
    sunion key key [key]# 求多个集合的并集(就是全部加起来)
    

Hash(哈希)

Map集合,key-map! 这个值是一个map集合!本质和String类型没有太大区别,keys一个key-value

hset key field value [field value] # 增加一个具体的field-value field是该value的域
hget key field # 通过该hash中的域field来获取对应的value
hmset key filed value [field value] # 与hset一样 hset不加m也可以添多个
hget key field [filed] # 获取hash中的多个域对应的值value
hgetall key # 查看hash中的所有的数据 显示是以 field-value形式显示的
hdel key field [field] # 删除hash指定的域field对应的值value也就消失了
hexists key field # 判断hash中指定的域是否存在 存在返回1 不存在返回0
hkeys key # 获取hash中的所有域
hvalue key # 获取hash中的所有value
hincrby key field increment(数量) # hash对应域对应值的增量 注意!该值一定要为数字 当incrment为负数的时候表示,减少
hsetnx key field value # 如果不存在可以设置 如果存在则不变动沿用之前的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QlLUGjCF-1589947467126)(assets/1589296735413.png)]

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

hset user 1 {name:zhangsan,age:16} # 设置一个user id对象 值为json字符串来保存一个对象
比set user:1 {name:zhangsan,age:16}更合适一些

Zset(有序集合)

在set的基础上,增加了一个值,一般都设置为数字,可以用来进行大小排列等

  • 增加

    zadd key score(分数) member [score member] # 往zset中加入成绩与其对应的成员 成绩可以是浮点型和整形 如果添加成员的时候成员存在那么可以更新其成绩
    
  • 查询

    zrange key start stop [WITHSCORES](加上那么查询时会显示对应的成绩) # 返回指定区间内的成员 1表示第一个 2是第二个... -1是最后一个 -2是倒数第二个...
    zcard key # 获取zset中的member个数
    zcount key min max # 获取指定区间内的成员数量
    
  • 排序

    zrangebyscore key min max [WITHSCORES] # 按照zset的成绩进行从小到大的展示 -inf 表示最小值 +inf 表示最大值
    ZRANGEBYSCORE salary -inf 2500 withscores # 展示工资小于2500员工的升序排列 
    zrevrange key start stop [WITHSCORES] # 从大到小进行排列
    
  • 弹出

    zrem key member [ke memebr] # 移出zset中的指定成员 不能通过成绩(score) 来弹出
    

zset排序,同时去掉重复成员 存储班级成绩表,工资表等

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

排行榜应用实现,去TOP N测试

Geospatial地理位置

应用场景:

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

官方文档中暂时只有六个命令:

  • GEOADD

  • GEODIST

  • GEOHASH

  • GEOPOS

  • GEORADIUS

  • GEORADIUSBYMEMBER

  • 添加地理位置

    geoadd key longitude(经度) latitude(纬度) member [....] # 注意:两极无法直接添加,一般使用时通过程序直接一次性导入数据,有效的经度从-180度到180度。有效的纬度从-85.05度到85.05,当坐标位置超出上述指定范围时抛出异常
    geoadd china:city 116.40 39.90 beijing
    
  • 获得当前定位:一定是一个坐标值!

    geopos key member [member] # 查询出要查询的成员的经纬度
    
  • 获取两成员之间的距离

    geodist key member1 member2 [m|km|ft|mi] # m:米 km:千米 mi:英里 ft:英尺 默认为米 存在少许误差
    GEODIST china:city beijing chongqi km # 查看重庆到北京的直线距离
    "1464.0708"
    
  • 以给定经纬度为中心,查找某一半径内的geospatial内的成员

    georadius key longitude(经度) latitude(纬度) radius m|km|ft|mi [withcoord](显示坐标坐标) [withdist](显示两者之间的距离) [count int](限制查找出的结果数量) [....]
    georadius china:city 110 30 500 km withcood count 10
    

    应用场景:我附近的人(获得所有附近的人的地址,定位)通过半径来查询

  • 找出指定成员周围(给出的半径)的其他成员

    georadiusbymember key member radius(半径) m|km|ft|mi [withcoord] [count int] [....]
    georadiusbymember china:city beijing 1000 km withdist
    
  • 返回一个或者多个位置元素的geohash表示

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

    geohash key meber [meber ...] # 将二维的经纬度转换成一维的字符串,如果两个字符串越接近,那么距离越接近
    geohash china:city beijing chongqi
    "wx4fbxxfke0"
    "wm5xzrybty0"
    

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

zrange china:city 0 -1 # 显示全部成员
"chongqi"
"beijing"
"shanghai"
zrem china:city beijing # 移出指定成员
等等Zset操作

Hyoerloglog

基数(不重复的元素)

{1,3,5,7,8,6,6} 的基数为6,可以接受大数据量是产生的误差

优点:占用的内存是固定的,2^64不同的元素的基数,只要12KB内存,如果要从内存角度来比较的话Hyperloglog是首选

网页的UV(一个人访问一个网站多次,但是还是记做一个人!)

传统的方式:set保存用户的id,然后就可以统计set中的元素数量作为标准判断!

这个方式如果保存大量的用户id,就会比较麻烦~我们的目的是为了计数,而不是保存用户id;

Hyperloglog在大量数据的时候会产生0.81%的错误率!统计UV任务,可以忽略不计的!

  • 创建

    pfadd key element [element...] # 创建可加入重复的element
    
  • 统计元素的基数数量

    pfcount key [key ...] # 可以统计多个 注意统计基数时,对于重复的element不会重复记录只会统计一次
    比如:
    pfadd mykey 1 2 3 4 4 5
    pfadd mykey2 6 6 6 6
    pfcount mykey
    (integer) 5
    pfcount mykey mykey
    (integer) 6 # 将两个key求并集然后在统计不重复的element
    
  • 合并多组

    pfmerge destkey(合并后的) sourcekey [sourcekey ...] # 是并集
    pfmerge mykey3 myke myke2
    

如果可以允许容错,那么一定可以使用Hyperloglog(占用内存非常小)

如果不能容错,那就用set或者自己的数据类型即可

Bitmap

位存储

应用场景:统计用户信息,活跃|不活跃 登录|未登录 打卡|未打卡 只有两种状态的(占用内存非常小)

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

setbit key offset value # 加入 不存在则创建
setbit sign 1 1  # 周一 打卡(打卡为1 不打卡为0)
setbit sign 2 0  # 周二 未打卡
setbit sign 3 1
setbit sign 4 0
setbit sign 5 0
setbit sign 6 1
setbit sign 7 1

getbit key offset # 查询 加入时设置的value
getbit sign 6 
(integer) 1
getbit sign 2
(integer) 0

bitcount key [start end](可以指定范围) # 统计1的数量!!!只会统计1
bitcount sign # 统计这周的打卡记录
(integer) 4
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

跟着上帝去流浪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值