一.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"
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"
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
命令默认返回未排序的位置元素。 通过以下两个参数, 用户可以指定被返回位置元素的排序方式:
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"
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"
在默认情况下, 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"
时间复杂度: 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的个数