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的个数

原文地址:https://www.cnblogs.com/yuanweidao/p/13818126.html