• redis五种基础类型常用指令和三种特殊类型的用法解析


    一.String类型

    1.创建指令

    创建key-value:set keyName value

    同时创建多个key-value:mset keyName1 value1 keyName2 value2 ...

    带过期时间创建key-value:setex keyName seconds value,setex意为 set with expire

    创建层级目录:mset user:1:name zhangyiqiang user:1:age 18

    不存在keyName才能设置成功返回1,若已存在则设置不成功返回0:setnx keyName value,setnx意为set if no exists (在分布式锁中经常使用到 setnx)

    若使用msetnx keyName1 value1 keyName2 value2 ...若其中有一个keyName已经存在,则所有的设置都不会生效,是一个原子性的操作(要么一起成功,要么一起失败)

    先get再set:getset keyName value,返回get结果再重新set该key的value

    2.获取指令

    得到key的值:get keyName

    同时获取多个key的值:mget keyName1 keyName2 ...

    获得某个key的value长度:strlen keyName

    获得keyName值的一个范围值:getrange keyName start_index end_index(起始下标,终止下标;闭区间;当end_index为-1时,表示取得整个字符串)

    3.删除指令

    删除一个key:del keyName

    4.操作String

    在key上拼接值:append keyName value,返回拼接后value的长度。若keyName不存在,则等效于 set keyName value

    key的value自增1:incr keyName,返回自增后的结果

    key的value自减1:decr keyName,返回自减后的结果

    key的value增加x:incrby keyName x,返回增加后的结果

    key的value减少x:decrby keyName x,返回减少后的结果

    字符串替换:setrange keyName start_index value (从start_index下标开始,把后面的字符依次替换成value中的字符)

    二.List类型

    1.插入指令

    向列表最左(首部)插入一个值:lpush listName value,返回列表长度

    向列表最右(尾部)插入一个值:rpush listName value,返回列表长度

    在指定值前或后插入一个值:linsert listName before|after value insert_value,返回列表大小,value是从左到右(首部到尾部)按顺序查找的。

    2.获取指令

    获取指定范围的值:lrange listName start_index end_index (闭区间;end_index为-1时表示到列表尾部)

    获取列表某一个下标的值:lindex listName index,(index为下标)

    获取列表的长度:llen listName

    3.删除指令

    删除最左(首部)的值:lpop listName ,返回被删除的值

    删除最右(尾部)的值:rpop listName ,返回被删除的值

    根据value来删除:lrem listName count value,根据value从首部到尾部依次删除count个value,返回删除的value个数

    4.操作指令

    截断列表:ltrim listName start_index end_index,将列表截断并保留结果

    将一个列表尾部元素移动到另一个列表(可以是自己)的首部:rpoplpush list otherlist,返回被移动的元素

    修改列表对应下标的值:lset listName index value,只有列表keyName和index都存在才能修改成功

    三.Hash类型

    1.插入指令

    向hashKey中插入一个键值对:hset hashKey keyName value,若keyName已存在,则会覆盖value的值

    同时插入多个键值对:hmset hashKey keyName1 value1 keyName2 value2...

    当keyName不存在时才能插入成功:hsetnx hashKey keyName value,成功返回1,失败返回0

    2.获取指令

    获取hashKey中某个keyName的值:hget hashKey KeyName

    同时获取多个值:hmget hashKey keyName1 keyName2...

    获取hashKey中的所有key-value:hgetall hashKey,返回的是所有的key-value对

    获取hashKey中所有的key:hkeys hashKey

    获取hashKey中所有的value:hvals hashKey

    获得hashKey的键值对个数:hlen hashKey

    3.删除指令

    删除hashKey中某个keyName:hdel hashKey keyName

    4.操作指令

    对字段进行增减:hincrby hashKey KeyName count,对hash中的keyName字段的值增加count,count为整数,可以为负数

    5.判断指令

    判断hashKey中的keyName是否存在:hexists hashKey keyName,返回1表示存在,返回0表示不存在

    四.Set类型

    无序,值是不能重复的。

    1.插入指令

    向set中添加一个或多个值:sadd setName value1 value2...,返回成功添加的value的个数

    2.获取指令

    获取set中所有的值:smembers setName

    获取set中元素的个数:scard setName,返回元素个数

    随机获取一个值:srandmember setName,返回随机获得的值,可以用于抽奖功能

    获取set1对set2的差集sdiff setName1 setName2,以第一个setName1为准,返回其与setName2的差集。

    获取set1和set2的交集sinter setName1 setName2,返回交集。可用于实现共同好友等功能...

    获取set1和set2的并集:sunion setName1 setName2,返回并集

    3.删除指令

    删除set中的某个指定的值:srem setName value,成功返回1,失败返回0

    随机删除元素:spop setName,返回被删除的值

    4.判断指令

    判断某个value是否存在于set中:sismember setName value,存在返回1,不存在返回0

    5.操作指令

    将一个set中的value移动到另一个set(可以是自己)中去:smove set otherset value,成功返回1,失败返回0。当set不存在时会失败,当otherset不存在时会创建。

    五.ZSet(Sorted Set)类型

    有序(按score从小到大排),值不能重复。

    1.添加指令

    添加一个或多个值:zadd zsetName score1 value1 score2 value...,返回成功添加的值的个数;score可以重复,但value重复不能成功添加;无原子性(即语句可以存在有些添加成功,有些失败);若value已经存在,则会更新其score值;

    2.获取指令

    获取指定下标范围的值:zrange zsetName start_index end_index,end_index为-1时表示到集合尾部

    反转:zrevrange zsetName start_index end_index,返回从大到小排序的结果

    获取指定socre范围的值:zrangebyscore zsetName startScore endScore withScores,startScore <= endScore,否则查出为空;withScores为可选参数,表示顺带输出Score;

    获取指定score范围的值的个数:zcount zsetName startScore endScore,返回个数;startScore <= endScore;

    获取zset中的元素个数:zcard zsetName,返回元素个数

    3.删除指令

    删除整个zsetKey:del zsetName,返回成功删除的key的个数;del指令是删除整个key的,例如删除整个list,整个hash,整个set和zset等等;

    删除zset中的一个或者多个值:zrem zsetName value1 value2...,返回成功删除的值的个数


    以下为Redis的三种特殊数据类型

    一.geospatial地理空间类型

    本质是zset(Sorted-Set)类型,可以使用zSet的指令

    1.geoadd

    将指定的地理空间位置(经度、纬度、名称)添加到指定的key中。这些数据将会存储到sorted set这样的目的是为了方便使用GEORADIUS或者GEORADIUSBYMEMBER命令对数据进行半径查询等操作。

    该命令以采用标准格式的参数x,y,所以经度必须在纬度之前。这些坐标的限制是可以被编入索引的,区域面积可以很接近极点但是不能索引。具体的限制,由EPSG:900913 / EPSG:3785 / OSGEO:41001 规定如下:

    • 有效的经度从-180度到180度。
    • 有效的纬度从-85.05112878度到85.05112878度。

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

    redis> GEOADD Sicily 13.361389 38.115556 "Palermo" 15.087269 37.502669 "Catania"
    (integer) 2
    

    时间复杂度:每一个元素添加是O(log(N)) ,N是sorted set的元素数量。

    2.geopos

    获取指定位置的经度纬度

    127.0.0.1:6379> geopos china:city beijing chongqing
    1) 1) "116.39999896287918091"
       2) "39.90000009167092543"
    2) 1) "106.49999767541885376"
       2) "29.52999957900659211"

    时间复杂度:每获取一个元素位置信息是O(log(N)) ,N是sorted set的元素数量。

    3.geodist

    返回两个给定位置之间的直线距离。

    如果两个位置之间的其中一个不存在, 那么命令返回空值。

    指定单位的参数 unit 必须是以下单位的其中一个:

    • m 表示单位为米。
    • km 表示单位为千米。
    • mi 表示单位为英里。
    • ft 表示单位为英尺。

    如果用户没有显式地指定单位参数, 那么 GEODIST 默认使用米作为单位。

    127.0.0.1:6379> geodist china:city shanghai beijing 
    "1067378.7564"
    127.0.0.1:6379> geodist china:city shanghai beijing m
    "1067378.7564"
    127.0.0.1:6379> geodist china:city shanghai beijing km
    "1067.3788"
    127.0.0.1:6379> geodist china:city shanghai jiangxi km
    (nil)
    

    时间复杂度:O(log(N))

    4.georadius

    以给定的经纬度为中心, 返回与中心的距离不超过给定最大距离的所有位置元素。

    范围可以使用以下其中一个单位:

    • m 表示单位为米。
    • km 表示单位为千米。
    • mi 表示单位为英里。
    • ft 表示单位为英尺。

    key longitude latitude radius m|km|ft|mi [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count]

    在给定以下可选项时, 命令会返回额外的信息:

    • WITHDIST: 在返回位置元素的同时, 将位置元素与中心之间的距离也一并返回。 距离的单位和用户给定的范围单位保持一致。
    • 1 127.0.0.1:6379> georadius china:city 110 30 500 km withdist
      2 1) 1) "chongqing"
      3    2) "341.9374"
      4 2) 1) "xian"
      5    2) "483.8340"
      withdist
    • WITHCOORD: 将位置元素的经度和维度也一并返回。
    • 1 127.0.0.1:6379> georadius china:city 110 30 500 km withcoord
      2 1) 1) "chongqing"
      3    2) 1) "106.49999767541885376"
      4       2) "29.52999957900659211"
      5 2) 1) "xian"
      6    2) 1) "108.96000176668167114"
      7       2) "34.25999964418929977"
      withcoord
    • WITHHASH: 以 52 位有符号整数的形式, 返回位置元素经过原始 geohash 编码的有序集合分值。 这个选项主要用于底层应用或者调试, 实际中的作用并不大。
    • 1 127.0.0.1:6379> georadius china:city 110 30 500 km withhash
      2 1) 1) "chongqing"
      3    2) (integer) 4026042091628984
      4 2) 1) "xian"
      5    2) (integer) 4040115445396757
      withhash

    命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:

    • ASC: 根据中心的位置, 按照从近到远的方式返回位置元素。
    • 1 127.0.0.1:6379> georadius china:city 110 30 500 km withdist asc
      2 1) 1) "chongqing"
      3    2) "341.9374"
      4 2) 1) "xian"
      5    2) "483.8340"
      asc
    • DESC: 根据中心的位置, 按照从远到近的方式返回位置元素。
    • 1 127.0.0.1:6379> georadius china:city 110 30 500 km withdist desc
      2 1) 1) "xian"
      3    2) "483.8340"
      4 2) 1) "chongqing"
      5    2) "341.9374"
      desc

    在默认情况下, GEORADIUS 命令会返回所有匹配的位置元素。 虽然用户可以使用 COUNT <count> 选项去获取前 N 个匹配元素, 但是因为命令在内部可能会需要对所有被匹配的元素进行处理, 所以在对一个非常大的区域进行搜索时, 即使只使用 COUNT 选项去获取少量元素, 命令的执行速度也可能会非常慢。 但是从另一方面来说, 使用 COUNT 选项去减少需要返回的元素数量, 对于减少带宽来说仍然是非常有用的。

     1 127.0.0.1:6379> georadius china:city 110 30 5000 km asc
     2 1) "chongqing"
     3 2) "xian"
     4 3) "shengzhen"
     5 4) "hangzhou"
     6 5) "shanghai"
     7 6) "beijing"
     8 127.0.0.1:6379> georadius china:city 110 30 5000 km asc count 3
     9 1) "chongqing"
    10 2) "xian"
    11 3) "shengzhen"
    count

    时间复杂度: O(N + log(M))其中N是由中心和半径界定的圆形区域的边界框内的元素的数量,M 是索引内的项目的数量。

    5.georadiusbymember

    这个命令和 GEORADIUS 命令一样, 都可以找出位于指定范围内的元素, 但是 GEORADIUSBYMEMBER 的中心点是由给定的位置元素决定的, 而不是像 GEORADIUS 那样, 使用输入的经度和纬度来决定中心点

    指定成员的位置被用作查询的中心。

    时间复杂度: O(N + log(M))其中N是由中心和半径界定的圆形区域的边界框内的元素的数量,M 是索引内的项目的数量。

    6.geohash

     返回一个或多个位置元素的11个字符表示的 Geohash

     Geohash:将二维的经纬度转化成一个一维的字符串

    127.0.0.1:6379> geohash china:city beijing shanghai chongqing
    1) "wx4fbxxfke0"
    2) "wtw3sj5zbj0"
    3) "wm5xzrybty0"
    

    时间复杂度:每一个元素查询是O(log(N)) ,N是sorted set的元素数量。

    二.HyperLogLogs

    什么是基数?

    A{1, 3, 5, 7, 8, 7}; B{1, 3, 5, 7, 8};

    基数(不重复的元素)= 5,可以接受误差

    简介:

    Redis Hyperloglog基数统计的算法

    优点:占用的内存是固定的,2^64不同的元素基数,只需要12KB内存

    使用方法:

    向hyperloglog中增加元素:pfadd logName element1 element2...,只要其中一个增加成功就返回1,全部都已存在则增加不成功,返回0

    返回hyperloglog中元素个数:pfcount logName,返回元素个数

    合并hyperloglog并生成新的hyperloglog:pfmerge goalLogName logName1 logName2 logName3...,可以合并多个logName的元素生成goalLogName,原来的logName仍会保留;即goalLogName为并集;

    应用场景

    基数不大,数据量不大就用不上,会有点大材小用浪费空间,有局限性,就是只能统计基数数量,而没办法去知道具体的内容是什么,和bitmap相比,属于两种特定统计情况,简单来说,HyperLogLog 去重比 bitmap 方便很多,一般可以bitmap和hyperloglog配合使用,bitmap标识哪些用户活跃,hyperloglog计数
     一般使用:

      统计注册 IP 数
      统计每日访问 IP 数
      统计页面实时 UV 数
      统计在线用户数
      统计用户每天搜索不同词条的个数

    三.Bitmap

    位存储 1 byte = 8 bits,1字符 = 2 bytes,可见位存储使用的空间非常的小

    统计用户信息:活跃,不活跃;登录,未登录;打卡,未打卡等等...只有两个状态的,都可以使用bitmap

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

    使用方法:

    设置bitmap中某位上的值:setbit bitmapName index 0/1,值只能设置0或者1,表示状态;若没有设置,则默认为0

    获取bitmap中某位上的值:getbit bitmapName index,没有被设置的index,则会获取默认的0

    获取整个bitmap中1的个数:bitcount bitmapName,返回1的个数

  • 相关阅读:
    ValidationUtils 验证工具
    android获取textview的行数
    自动打开Accesibility Service 可以自动安装APP
    限制EditText最多输入多少汉字
    Android Secret Code
    恢复 混淆后的 stacktrace 文件
    车载系统 降噪处理
    Java常用类库Integer,Character,toCharArray
    Java接口以及匿名内部类,静态代码块
    Java抽象类、继承及多态和适配器的实现
  • 原文地址:https://www.cnblogs.com/yuanweidao/p/13818126.html
Copyright © 2020-2023  润新知